请求
传参
通过关键字params传递参数
1 | payload = {'key1': 'value1', 'key2': 'value2'} |
key的value为null时,不会将该组值编码为参数。
list传参:
1 | payload = {'key1': 'value1', 'key2': ['value2', 'value3']} |
设置cookies
1 | url = 'http://httpbin.org/cookies' |
更新cookies
1 | s = requests.session() |
输出
1 | before: <RequestsCookieJar[<Cookie _cookie=4ZJXH0#342712b2344c11ea932d320b79554096 for api.xxx.org/>]> |
自定义Header
添加HTTP header,传递一个dict到header的参数中。
例子:设置user-agent
1 | url = 'https://api.github.com/some/endpoint' |
通过自定义的header比其他专门指定的信息的优先级低。
7种请求方法
所有的请求的功能可以由这7方法访问
1 | r = requests.request(method, url, **kwargs) |
这七个方法都会返回一个Response对象的一个实例:我们可以从这个对象中获得我们需要的所有信息。
POST
post form表单
参数传一个字典,会自动被编码为form
1 | payload = {'key1': 'value1', 'key2': 'value2'} |
如果你传递一个string,则不会编译成form。
1 | import json |
或者直接传json
1 | url = 'https://api.github.com/some/endpoint' |
post文件
1 | url = 'http://httpbin.org/post' |
也可以设置文件名称,content_type,headers
1 | url = 'http://httpbin.org/post' |
发送字符串作为文件:
1 | url = 'http://httpbin.org/post' |
发送大文件:requests-toolbelt
建议以二进制模式打开文件.
同时传data参数和file图片
1 | f = {'image': ('xxx.jpg', open('xxx.jpg', 'rb')) } |
requests.Session
该类提供cookie持久性、连接池和配置
1 | import requests |
响应
状态码
1 | r.status_code |
检查请求是否成功
使用r.raise_for_status()或者检查r.status_code是否符合预期。
1 | r.status_code == requests.codes.ok |
抛出4XX/5XX问题码,200的时候调用会返回None
1 | r.raise_for_status() |
Headers
1 | r.headers |
返回的是一个json,可以获得json里面的数据。
cookies
如果响应数据中有cookies,可以获得他们
1 | r.cookies['example_cookie_name'] |
编码
request能自动对响应的内容解码,稍后根据需要的内容编码。
查看编码:r.encoding,也可以修改该编码r.encoding = xxx。
HTTP和XML能在body中指定编码,可以通过r.content找到编码,然后通过r.encoding设置。然后r.text就能通过正确的编码显示。
text 编码
1 | r.text |
二进制编码
1 | r.content |
gzip deflate 也能成功编码
如:通过返回的二进制数据创建图像
1 | from PIL import Image |
内置json解码器
1 | r.json |
如果解析失败,则会抛出异常ValueError: No JSON object could be decoded
注意:r.json调用成功,并不能表示响应成功。一些服务器会将失败信息使用json返回。检查请求是否成功,使用r.raise_for_status()或者检查r.status_code是否符合预期。
原始套接字
在一些稀少的情况下,也需要拿到原始套接字,使用r.raw获得。首先得在requests的时候,设置stream=True
1 | r = requests.get('https://api.github.com/events', stream=True) |
保存流到文件:
1 | with open(filename, 'wb') as fd: |
下载的时候使用最佳。
history
1 | r.history |
设置请求超时
1 | requests.get('http://github.com', timeout=0.001) |
超出请求会抛出错误。
错误
所有异常继承 requests.exceptions.RequestException.
- DNS错误,连接错误等,Requests 会抛出一个ConnectionError 异常
- 当响应码不符合预期,Response.raise_for_status()抛出HTTPError 异常
- 请求超时,会抛出Timeout 异常
- 请求超出配置最大的重定向数,抛出TooManyRedirects 异常
报错:requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED]
请求中加上verify=False
1 | s.post(url_2, json=data, verify=False) |