[Code] 浅谈Python Requests

一、 特性

  1. 支持keep-alive的连接池
  2. 支持通用的域名以及URL地址
  3. 支持使用cookie
  4. 支持使用类似浏览器的SSL验证
  5. 文件上传、下载
    等等

二、 安装

  1. 通过pip安装
    pip install requests

  2. 源码安装
    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"的异常哦

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容