发送简单的请求
response = requests.get(“url”)
response常用方法
- response.text
- response.content
- response.status_code
(获取状态码,如果返回200,说明请求的某个URL成功,并不能说明当前URL请求成功)
(用assert response.status_code == 200,断言请求成功) - response.headers
响应头,一般不用,如果用只需要看Network-Headers里的Set-Cookie键值对,共有3个,是对方服务器在我们本地设置的cookie,Django Flask可以通过js设置cookie到本地 - response.request.headers
请求头,-----(此处是request,不是requests)----在ipython3交互界面以访问百度首页为例时,response.requests.headers返回的结果是一个字典,其中’User-Agent’: ‘python-requests/2.9.1’,跟正常浏览器请求的’User-Agent’(浏览器名称)不一样,会很容易被识别出是一个爬虫。 - response.request.url
请求的URL - response.url
响应的URL
当对方服务器把请求的URL地址重定向到另外一个URL地址时,请求的和相应的URL就不一样了
发送带header的请求
response = requests.get(“http://www.baidu.com”)
response.content.decode()
返回的内容比正常浏览器访问服务器返回的内容少,因为通过response.request.headers返回的结果可以查看到,我们的程序访问时用的请求头中的’User-Agent’:
'python-requests/2.9.1’是一个程序,被识别出是爬虫,所以接下来要学习如何发送带headers的请求,而不被对方服务器通过User-Agent识别出来。
目的
模拟浏览器,欺骗服务器,获取和浏览器一样的内容。
header形式:字典
- headers = {“User-Agent”: “Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1”}
用法
- requests.get(url,headers=headers)
- 需要把headers传进去,而不是直接写进去。
- 具体示范步骤
进入ipython3交互模式
import requests
headers={"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"}
response=requests.get("http://www.baidu.com",headers=headers)
response.content.decode()
会得到与浏览器访问服务器一样的返回结果。
发送带参数的请求
什么是请求参数
- URL中放在?后面,a=b,c=d这种形式的并用&符号隔开,例:在百度搜索引擎中搜索python好学吗
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=site888_3_pg&wd=python教程&oq=python%E5%A5%BD%E5%AD%A6%E5%90%97&rsv_pq=f7d0461a000560fe&rsv_t=7423gMOf2y2WZXq4p6QfhQJvIZcyeNZ5k35aYJI6Bvt6KRLnEsrvlGleB1DJrTf8tmjV&rqlang=cn&rsv_enter=1&rsv_dl=tb&inputT=2433&rsv_sug3=22&rsv_sug1=20&rsv_sug7=100&rsv_sug2=0&rsv_sug4=5283
实际情况中,不可能带这么多参数,只带重要的参数就行wd=…
参数的形式:字典
- kw = {“wd”:“长城”}
用法
- requests.get(url,params=kw)
- 具体操作步骤示范
注意事项:
- URL编码后如果看不懂,可以通过在线的URL解码工具
- 遇到URL中有%的先进行解码再观察
- url_temp中的?可有可无
1 import requests
2
3
4 url_temp = "http://baidu.com"
5 headers = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1 .38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"}
6 p = {"wd":"教程"}
7 r = requests.get(url_temp,headers=headers,params=p)
8 print(r.status_code)
9 print(r.request.url)
如果发现了URL的规律,不传递参数,可以手动拼接URL地址,代码如下:
字符串格式化的另一种方式(之前是%s)
- 用字符串的format方法来直接传递参数
- 例如:要在传智播客中传和智中间放一个内容进去,可以先用大括号占一个位置,然后用.format(“内容”)
- 传{}智播客.format(1)或者传{}智播客.format(“a”),内容可以为字典、元组、列表都可以
- 如果要在传智播客每个字中间都加内容,可以分别在每个字中间用一个大括号站位,然后后面依次放要填的内容,会自动按顺序放进去
传{}智{}播{}客.format(1,2,3),返回的结果就是:传1智2播3客
1 import requests
2
3
5 headers = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1 .38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"}
6 url = "http://www.baidu.com/s?wd={}".format("传智播客")
7 r = requests.get(url,headers=headers)
8 print(r.status_code)
9 print(r.request.url)