一、 特性
- 支持keep-alive的连接池
- 支持通用的域名以及URL地址
- 支持使用cookie
- 支持使用类似浏览器的SSL验证
- 文件上传、下载
等等
二、 安装
通过pip安装
pip install requests源码安装
git clone git://github.com/requests/requests.git
cd requests
pip install
三、 发送请求
1. 请求方法
1.1. GET
即通过requests发送一个GET请求,需要在URL里请求的参数可通过params传递。
r = requests.get(url="", params={}, headers={}, cookies={})
1.2. POST
与GET不同的是,POST请求新增了一个可选参数data,需要通过POST请求传递的body里的数据可以通过data传递。
r = requests.post(url="", data ={}, params={}, file={}, headers={}, cookies={})
1.3. PUT
r = requests.post(url="", data ={}, params={}, headers={}, cookies={})
1.4. DELETE
r = requests.delete(url="", data ={}, params={}, headers={}, cookies={})
2. 请求参数
2.1 params
当访问一个URL时,我们经常需要发送一些查询的字段作为过滤信息,例如:httpbin.com/get?key=val,这里的key=val就是限定返回条件的参数键值对。
当我们利用python的requests去发送一个需要包含这些参数键值对时,可以将它们传给params。如下:
payload = {'key1':'value1', 'key2':'value2'}
r = requests.get('http://httpbin.com/get, params = payload)
2.2 headers
用户也可以自己设定请求头,如下:
url = 'https://api.github.com/some/endpoint'
headers = {'Accept': 'application/json'}
r = requests.get(url, headers = headers)
2.3 data
有时候,用户需要将一些数据放在请求的body内;这时候,就需要对data传参了(仅POST, DELETE, PUT等方法有该参数,GET没有,因为GET请求没有body哦)
payload = {'key1' : 'value1', 'key2' : 'value2'}
r = requests.post('http://httpbin.org/post', data = payload)
2.4 file
也可以通过requests传一些文件哦,使用的是file参数:
url = 'http://httpbin.org/post'
files = {'file' : open('report.xls', 'rb')
r = requests.post(url, files = files)
2.5 cookie
也可以通过requests设定cookie哦:
url = 'http://httpbin.org/post'
cookies = dict(cookies_are = 'working')
r = requests.get(url, cookies = cookies)
2.6 verify
requests还支持https哦,如同一个浏览器一样检查SSL证书哒。这里就需要谈到verify参数,这个参数默认呢是True也就是打开状态。
但在日常不需要验证SSL证书的情况下,为了避免麻烦,我们可以将它简单粗暴的设为False。
但在某些需要验证SSL的情况下,verify参数就不能随意关掉啦。可以将CA_BUNDLE文件的路径传递给verify,像这样:
requests.get('https://github.com', verify = 'path/to/certfile')
3. Session
当我们需要使用keep-alive建立一个TCP持久的连接时,就需要用到requests的Session对象去创建连接池啦,Session可以大大提升性能哦。
Session对象可以使用requests API的所有方法。例如:
session = requests.Session()
session.get('http://httpbin.org/cookies/set/sessioncookie/123')
Session也可以用来为request方法提供一些默认数据:
session = requests.Session()
session.auth = ('user' : 'pass')
session.headers.update({'test' : 'true'})
session.get('http://httpbin.org', headers = {'test2' : 'true'})
以上代码中,'test'以及'test2'都会被传递。
3.1 cookies的传递
但是,需要注意的是,通过session发送的某个请求中的参数并不能在不同请求中保持。这句话可能比较难理解,请看下面的代码:
session = requests.Session()
r = session.get('http://httpbin.org/cookies', cookies={'test' : 'true'})
print(r.text)
# '{"cookies": {"from-my": "browser"}}'
以上通过Session发送了一个带有cookies参数的get请求,让我再通过Session发送一个不带cookies参数的get请求:
r = session.get('http://httpbin.org/cookies')
print(r.text)
# '{"cookies": {}}'
通过打印出的结果我们可以发现,之前通过Session.get()设置的cookies不见了。
那么问题来了,究竟该如何设置持久的cookies呢?
其实,可以通过Session的cookies属性直接设置持久的cookies:
session = requests.Session()
session.cookies = {"from-my": "browser"}
3.2 Session的关闭
为了避免资源浪费,建立的TCP请求需要用后及时关闭。所以建立起的Session也需要在用完之后及时关闭。
我们可以如何实现这个需求呢?
with requests.Session() as s:
s.get('http://httpbin.org/cookies')
如上代码,随着with语句块的结束,Session的生命也走到了尽头。
4. 返回结果
有请求就会有返回,那么返回结果里都有些什么呢?该如何查看呢?
当我们发送了如下请求:
r = requests.get('https://api.github.com/events')
r就是这个请求的返回结果,而一般requests会自动的将结果解码,我们可以通过r.encoding来查看或是修改其解码的方式。
当然也可以使用r.json()来将结果转换成json,如果不能转换,则会抛一个"No JSON object could be decoded"的异常哦