Python网络请求系列Requests使用详解(二)
一、前言:
- 我们之前学习了requests的基本使用
- 本次我们将继续学习requests的使用技巧,包含自定义代理等头部信息、cookies的管理创建复杂的post请求等等。
二、挖坑历程
1、自定义headers数据
-
实际开发过程中我们将不可避免的需要自定义请求的头部参数,如设置代理、过期时间等等。
-
使用requests自定义headers参数是非常方便的。
-
如自定义代理的示例代码如下:
import requests url = 'https://api.github.com/some/endpoint' headers = {'user-agent': 'my-app/0.0.1'} r = requests.get(url, headers=headers)
-
headers参数接收一个字典类型的数据,我们通过设置user-agent便可配置我们的代理了。
-
注意事项:通过headers配置头部参数优先级并不是最高的,
-
1、如果在.netrc中指定了证书,那么headers中的auth将会被重写。
-
2、如果你的请求重定向到一台离线的主机上,那么Authorization头部信息将被移除。
-
3、如果请求的url中提供了证书,那么Proxy-Authorization头部信息将被重写
-
4、如果requests从响应的数据中检测到了内容的长度,Content-Length的值将被重写。
2、发送复杂的post请求
-
如果你想像html一样发送表达数据,此时我们只需要传递一个字典类型的数据给data参数即可。
-
代码如下:
import requests payload = {'key1': 'value1', 'key2': 'value2'} r = requests.post("http://httpbin.org/post", data=payload) print(r.text)
-
结果输出如下:
{ "args": {}, "data": "", "files": {}, "form": { "key1": "value1", "key2": "value2" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Content-Length": "23", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.4" }, "json": null, "origin": "61.140.162.240", "url": "http://httpbin.org/post" }
-
当然,我们也可以传入一个元组类型的数据达到同样的效果,而且在同一个key对应多个值,该方式更好。
-
代码如下:
import requests payload = (('key1', 'value1'), ('key1', 'value2')) r = requests.post("http://httpbin.org/post", data=payload) print(r.text)
-
结果输出如下:
{ "args": {}, "data": "", "files": {}, "form": { "key1": [ "value1", "value2" ] }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Content-Length": "23", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.4" }, "json": null, "origin": "61.140.162.251", "url": "http://httpbin.org/post" }
-
当然,我们也可以直接发送一个string类型的数据,这样的需求往往也是比较多的。
-
我们看示例代码:
import requests import json url = 'https://api.github.com/some/endpoint' payload = {'some': 'data'} r = requests.post(url, data=json.dumps(payload)) print(r.text)
-
当然,更直接的我们可以直接发送一个json格式的数据
-
代码如下:
import requests url = 'https://api.github.com/some/endpoint' payload = {'some': 'data'} r = requests.post(url, json=payload)
3、post上传文件
-
实际开发过程中,上传文件的需求也是比较常见的,requests针对文件上传也做了很好的封装
-
使用是我们通过files参数自定文件即可。
-
示例代码如下:
import requests url = 'http://httpbin.org/post' files = {'file': open('report.xls', 'rb')} r = requests.post(url, files=files)
-
我们还可以更细粒度的控制文件上传的细节,如指定文件名,文件类型以及过期时间等等。
-
代码修改如下:
import requests url = 'http://httpbin.org/post' files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})} r = requests.post(url, files=files)
-
其实,我们还可以直接发送一个字符串数据给服务端,但是告诉服务端这是个文件,你要当作文件进行处理
-
代码修改如下
import requests url = 'http://httpbin.org/post' files = {'file': ('report.csv','some,data,to,send\nanother,row,to,send\n')} r = requests.post(url, files=files)
上传文件时注意事项:
- 实际开发中我们难免有上传大文件的需求,但是requests本身并不支持这一特性,非常可惜,但是你可以使用requests-toolbelt工具来实现这一功能。
- 上传的文件建议使用二进制模式进行打开,因为上文文件时最终是以流的形式进行发送,此时requests大部分情况下会根据文件的大小自动设置一个Content-Length头部值,此时如果你以txt模式打开文件就会出现问题了。
4、cookies的管理
-
网络请求过程中,Cookies是必不可少的,requests对于cookies的操作也做了很好的封装。
-
1、获取Cookies
-
代码如下:
import requests url = 'http://example.com/some/cookie/setting/url' r = requests.get(url) r.cookies['example_cookie_name']
-
2、发送我们的Cookies
-
Cookies是个字典,我们只需传一个字典类型的数据给cookies参数即可
-
示例代码如下:
import requests url = 'http://httpbin.org/cookies' cookies = dict(cookies_are='working') r = requests.get(url, cookies=cookies) print( r.text) - 结果输出如下 { "cookies": { "cookies_are": "working" } }
-
3、RequestsCookieJar,更好的管理我们的cookies
-
RequestsCookieJar实际上就像一个字典一样,但是他提供了更完整的接口,适用于多个域或路径。 Cookie jar 也可以传递到请求中:
-
示例代码如下:
import requests jar = requests.cookies.RequestsCookieJar() jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies') jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere') url = 'http://httpbin.org/cookies' r = requests.get(url, cookies=jar) print(r.text) url = 'http://httpbin.org/elsewhere' r = requests.get(url, cookies=jar) print(r.text)
-
如此我们便可以分别控制httpbin.org域下面的每个路径分别使用那个cookies了。
-
是不是很简单呢?
5、重定向和历史的管理
-
默认情况下,除了HEAD请求外其他请求遇到从定向都会执行本地的重定向。
-
为了证明这一结论我们将用history来追踪请求中的重定向。
-
Response.history列表包含了请求完成后而创建的响应对象。列表按从最旧的到最近的响应进行排序。
-
例如我们看下请求github 时使用http,其会重定向到https
-
示例代码如下:
import requests r = requests.get('http://github.com') print(r.url) print(r.status_code) print(r.history)
-
结果打印如下:
https://github.com/ 200 [<Response [301]>]
-
如果我们关闭来重定向功能会如何呢?
-
示例代码修改如下:
import requests r = requests.get('http://github.com',allow_redirects = False) print(r.url) print(r.status_code) print(r.history)
-
结果输出如下:
http://github.com/ 301 []
-
可以看到,我们通过设置allow_redirects参数为False关闭重定向功能,在此执行则直接返回301。
6、请求超时的控制
-
如果你发出一个请求,此时网络很差或者服务器一直没给响应,此时我们肯定不能一直死等下去,我们应该告诉请求,你就等他100年,他不回就不理他来。
-
OK,我们来看下requests是如何控制请求超时的,示例代码如下:
import requests requests.get('http://github.com', timeout=0.001)
-
yes,就是这么简单,我们便控制来请求的超时时间
-
OK,本次我们学习来requests的post复杂请求、上传文件、处理cookies、处理超时时间等等。
-
希望更加深入的学习可以查看requests官网,学习需要厚积薄发。
-
感谢您的浏览,谢谢。