Python.Requests库进阶应用
cookie设置
设置Cookie
import requests cookie = {'hero': 'alix'} r_cookie = requests.get(base_url + '/cookies', cookies= cookie) print(r_cookie.text)
运行结果
{ "cookies": { "hero": "alix" } }
获取cookie
请求百度首页,然后获取cookie,实现如下:
r = requests.get('http://www.baidu.com') print(type(r.cookies)) print(r.cookies) for key,value in r.cookies.items(): print(key + ":" + value)
调用cookies属性即可成功得到cookies,可以发现它是一个RequestCookieJar类型,然后使用items()犯方法将其转化为元祖组成的俩表,表里输出每一个Cookie的名和值,实现Cookies的遍历解析。
超时
你可以让requests在经过timeout参数设定的描述时间之后停止等待响应。防止某些请求没有响应而一致处于等待状态。
下面的案例故意设置一个很小的超时时间,为了来看一下超时后的一个响应处理。
cookie = {'hero': 'ariliya'} r_timeout = requests.get(base_url + '/cookies', cookies=cookie, timeout=0.001) print(r_timeout.text)
超时异常
requests.exceptions.ConnectTimeout: HTTPConnectionPool(host='httpbin.org', port=80): Max retries exceeded with url: /cookies (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x0000017E45DFC860>, 'Connection to httpbin.org timed out. (connect timeout=0.001)'))
文件上传
Requests可以使用参数files模拟提交一些文件数据,计入有的接口需要我们上传文件,我们同样可以利用它来上传,实现非常简单,实例如下:
file = {'file': open('01.jpg', 'rb')} r_up = requests.post(base_url + '/post', files=file) print(r_up.text)
Tips:上传的文件要放在同一目录
会话对象
在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户i绘画所需的属性及配置信息。这样,当用户在应用程序在web页之间跳转时,存储在Session对象中的变量将不会丢失,二十在整个用户会话中一致存在下去。
比如你先进行了登陆操作,人后打开个人中心详情页面,个人中心详情页面如何知道展示的是刚刚登陆的这个用户的信息,这里就需要使用Session来存储相关信息。
在接口测试过程中接口之间经常有依赖关系,比如下面这两个请求义格式cookie另一个时获取cookie,在没有session保存几职的情况下,第二个接口无法获取第一个接口设置的cookie值
# 设置cookie r = requests.get(base_url + '/cookies/set/hero/leesin') print(r.text) # 获取cookie,这里cookie为空,需要session保存在获取cookie r01 = requests.get(base_url + '/cookies') print(r01.text)
返回值
{ "cookies": { "hero": "leesin" } } { "cookies": {} }
Requests的会话对象让你能够跨请求保持某些参数。他也会在同一个session实例发出的所有请求之间保持cookie。
# 生成会话对象 s = requests.session() # 设置cookie r = s.get(base_url + '/cookies/set/hero/leesin') print(r.text) # 获取cookie r01 = s.get(base_url + '/cookies') print(r01.text)
返回值
{ "cookies": { "hero": "leesin" } } { "cookies": { "hero": "leesin" } }
所以,利用session可以做到模拟同一个会话,而且不用单行cookies的问题,通常用于模拟登陆成功之后再进行下一步的操作
代理设置
代理(Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络中断(一般为客户端)通过这个服务与另一个网络中断(一般为服务器)进行非直接的连接
代理服务器位于客户端和访问互联网之间,服务器接收客户端的请求,然后代替客户端向目标网站发出请求,所有的流量路由均来自代理服务器的ip地址,从而获取一些不能直接获取的资源。
对于有些接口,在测试的时候请求几次,能正常获取内容。但是一旦开始大规模频繁请求(如性能的是)服务器可能就会开启验证;甚至把ip禁掉。为了防止这种情况发生就需要代理来解决这个问题,在Requests中需要通道proxies这个参数,在爬虫中常会用到代理。
代理设置
proxie = {'http': 'http://114.230.69.81:9999'} r = requests.get(base_url + '/get', proxies=proxie) print(r.text)
身份认证
很多接口都需要身份认证,Request支持多种身份认证
用下面案例验证2种省份类型:BasicAuth 和 DigestAuth
from requests.auth import HTTPBasicAuth from requests.auth import HTTPDigestAuth #BasicAuth r_basic = requests.get(base_url + '/basic-auth/hero/leesin', auth= HTTPBasicAuth('hero', 'leesin')) print(r_basic.text) #DigestAuth r_digest = requests.get(base_url + '/digest-auth/auth/hero/leesin', auth= HTTPDigestAuth('hero', 'leesin')) print(r_digest.text)
返回值
{ "authenticated": true, "user": "hero" } { "authenticated": true, "user": "hero" }
流式请求
有一些接口返回值比较特殊,不是单词返回一个结果,二十多个结果,比如,某个查询接口,返回值为排名榜前10的商品信息。
实践案例
请求接口如下:
http://httpbing.org/stream/{num}
num表示返回结果集的数量,比如输入10则返回10个不同的id结果
针对这种类型的接口我们对结果集的处理需要使用迭代方法iter_lines()来处里:
import json r = requests.get(base_url + '/stream/10', stream = True) # print(r.encoding) # 如果响应内容没有设置编码,则默认设置为utf-8 if r.encoding is None: r.encoding = 'utf-8' # 对响应结果进行迭代处理 for line in r.iter_lines(decode_unicode=True): if line: data = json.loads(line) print(data['id'])
返回值
0
1
2
3
4
5
6
7
8
9