Loading

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

 

posted @ 2019-06-30 13:31  yonugleesin  阅读(707)  评论(0编辑  收藏  举报