0x01 requests.get()
r = requests.get(url, params={}, headers={}, cookies={}, allow_redirects=True, timeout=float, proxies={}, verify=True)
参数名 | 类型 | 说明 |
---|---|---|
url | str | 请求地址, 必填 |
params | dict | 设置参数,字典类型,如:{‘key1’: ‘value1’, ‘key2’: ‘value2’}; |
headers | dict | 设置头部,字典类型,如:{‘user-agent’: ‘my-app/0.0.1’}; |
cookies | dict | 设置cookie,字典类型,如:{“key”: “value”}; |
allow_redirects | bool | 设置重定向,默认开启; |
timeout | float | 设置请求超时时间(s); |
proxies | dict | 设置代理,字典类型,如:{“http”: “http://10.10.1.10:8080“}; |
verify | bool | 设置证书验证,默认True,也可以是CA库地址; |
0x02 requests.post()
r = requests.post(url, data={}, headers={}, cookies={}, json=”, files={}, allow_redirects=True, timeout=float, proxies={}, verify=True)
参数名 | 类型 | 说明 |
---|---|---|
url | str | 请求地址, 必填 |
data | dict | 设置表单数据,字典类型;也可以接收 json.dumps()过后的数据; |
headers | dict | 设置头部,字典类型,如:{‘user-agent’: ‘my-app/0.0.1’}; |
cookies | dict | 设置cookie,字典类型,如:{“key”: “value”}; |
json | str | 传递json数据,如:{‘key’: ‘value’}; |
files | dict | 上传文件,如:{‘file’: open(‘report.txt’, ‘rb’)}. 注:最好使用二进制打开文件; |
allow_redirects | bool | 设置重定向,默认开启; |
timeout | float | 设置请求超时时间(s); |
proxies | dict | 设置代理,字典类型,如:{“http”: “http://10.10.1.10:8080“}; |
verify | bool | 设置证书验证,默认True,也可以是CA库地址; |
默认requests发送请求时是可以响应跳转的,也就是页面本来响应码是302,但是我们通过r.status_code获取到的却是200,我们来测试一下:
Curl本身是不会响应跳转的
[root@localhost tmp]# curl -I http://10.59.0.248:443/lua/if_stats.lua HTTP/1.1 302 Found Set-Cookie: session=; path=/; expires=Thu, 01-Jan-1970 00:00:01 GMT; max-age=0; HttpOnly Location: /lua/login.lua?referer=10.59.0.248:443/lua/if_stats.lua
可以看到响应码是302,但是我们使用requests请求一下。
>>> r = requests.get('http://10.59.0.248:443/lua/if_stats.lua') >>> r.status_code 200
可以看到响应码为200
另外使用r.history也可以看到响应了302跳转
>>> r.history [<Response [302]>]
这里requests包提供了allow_redirects参数用于指定是否响应302跳转。
>>> r = requests.get('http://10.59.0.248:443/lua/if_stats.lua', allow_redirects=False) >>> r.status_code 302
0x03 请求响应
字段 | 类型 | 说明 |
---|---|---|
r.url | str | 被编码后的请求url |
r.text | unicode | 返回处理后的Unicode型数据 |
r.content | str | 返回bytes型的原始数据(二进制) |
r.json() | dict | 将json数据解码后返回 |
r.status_code | int | 返回响应状态码 |
r.raise_for_status() | 若发送一个错误请求,则抛出此异常 | |
r.headers | dict | 服务器响应头部信息 |
r.cookies | dict | Response中的cookies. |
r.history | list | Response对象(请求历史)列表,按最老到最近的请求进行排序 |
r.encoding | str | r.text输出的编码格式,也就是网页编码 |
r.apparent_encoding | str | r.content原始数据编码类型 |
r.elapsed | 请求url花费时间 | |
r.request.headers | dict | 请求头信息 |
r.request.headers
>>> r.request.headers {'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.18.4'}
可以看到默认Request发送的UA是python-requests/2.18.4,如果用request去爬取一些站点很容易识别到,一定要自定义UA。
>>> headers = {'User-Agent': 'vinc'} >>> r = requests.get('http://10.59.0.248:443/lua/if_stats.lua',headers=headers) >>> r.request.headers {'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'vinc'}
r.json()
requests中已经有了内置r.json()函数用于处理返回的Json格式内容
>>>r = requests.get('http://ip.taobao.com/service/getIpInfo.php?ip=122.88.60.28') >>>r.json()['data']['country'] '中国'
r.cookies
将CookieJar转为字典;
>>> r = requests.get('http://www.hao123.com') >>> requests.utils.dict_from_cookiejar(r.cookies) {'hz': '0', 'BAIDUID': 'CE079CF1EAF562FA41FF35634C6D54B0:FG=1', 'ft': '1', 'v_pg': 'normal'}