requests基础用法
整理自官方文档
01 发送请求
-
Get请求
import requests r=requests.get('https://www.douban.com')
-
Post请求
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
流式上传
可以发送大数据流而无需先读入内存,需要为请求体提供一个类文件对象
建议使用二进制模式打开文件with open('massive-body','wb') as f: requests.post('http://some.url/streamed', data=f)
-
其他请求
r = requests.put('http://httpbin.org/put', data = {'key':'value'}) r = requests.delete('http://httpbin.org/delete') r = requests.head('http://httpbin.org/get') r = requests.options('http://httpbin.org/get')
02 传送参数
-
使用params关键字参数,以字符串字典的方式提供参数
>>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.get("http://httpbin.org/get", params=payload)
也可以将列表作为值传入
>>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = requests.get('http://httpbin.org/get', params=payload)
传入元组,适合同一个key对应多个value时
>>> payload = (('key1', 'value1'), ('key1', 'value2')) >>> r = requests.post('http://httpbin.org/post', data=payload) >>> print(r.text) { ... "form": { "key1": [ "value1", "value2" ] }, ... }
-
定制请求头
>>> url = 'https://api.github.com/some/endpoint' >>> headers = {'user-agent': 'my-app/0.0.1'} >>> r = requests.get(url, headers=headers)
- 如果被重定向到别的主机,授权header就会被删除
- 代理授权header会被URL中提供的代理身份覆盖
- 能判断长度时,header的Content-Length会被改写
header的值必须是string、bytestring或unicode
可以设置timeout,仅对链接过程有效,与响应体的下载无关
可以传入一个元组分别作为connect和read的值 timeout=(1,20)
timeout设置为None表示永远等待SSL 验证默认是开启的,可以设置verify=False关闭,也可以verify='path'传入证书路径,可以使用会话属性s.verify保持在会话中
03 响应内容
可用方法:
- r.status_code
- r.headers
- r.cookies
- r.encoding
- r.text
- r.json()
- r.content
- r.raw
- r.history
使用r.text时,requests会自动解码来自服务器的内容,大多数unicode字符集可以被解码
使用r.content时,requests会自动解码gzip和deflate传输编码的响应数据
使用r.raw查看原是响应内容,要在requests.get()中设置stream=True
r.headers返回的是一个字典,可以查看其中具体一项的值,HTTP头部是大小写不敏感的
r.cookies返回的对象是RequestsCookieJar,与字典类似,但接口更加完整,适合跨域名跨路径使用,也可以将Cookie Jar传入Requests
r.history用于返回重定向历史,将对象列表按照从旧到新进行排序
可以在get()中设置allow_redirects=False禁用重定向-
服务器返回给我们的头部信息 r.headers
发送到服务器的请求的头部 r.request.headers
04 代理
-
配置proxies参数
import requests proxies = { "http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080", } requests.get("http://example.org", proxies=proxies)
-
配置环境变量
$ export HTTP_PROXY="http://10.10.1.10:3128" $ export HTTPS_PROXY="http://10.10.1.10:1080" $ python >>> import requests >>> requests.get("http://example.org")
-
若你的代理需要使用HTTP Basic Auth,可以使用 http://user:password@host/ 语法:
proxies = { "http": "http://user:pass@10.10.1.10:3128/", }
-
要为某个特定的连接方式或者主机设置代理,使用 scheme://hostname 作为 key, 它会针对指定的主机和连接方式进行匹配。
proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'}
-
socks
需要安装第三方库 pip install requests[socks]proxies = { 'http': 'socks5://user:pass@host:port', 'https': 'socks5://user:pass@host:port' }
05 会话对象
会话对象可以跨请求保持某些参数,也会在同一个session实例发出的所有请求之间保持cookie
跨请求保持cookie
s = requests.Session()
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")
print(r.text)
# '{"cookies": {"sessioncookie": "123456789"}}'
但方法级别的参数也不会被跨请求保持
s = requests.Session()
r = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(r.text)
# '{"cookies": {"from-my": "browser"}}'
r = s.get('http://httpbin.org/cookies')
print(r.text)
# '{"cookies": {}}'