Python接口自动化——Requests基础功能

2021-08-09 11:22:56 浏览数 (1)

Cookie设置

设置cookie

通过cookies参数可以设置Cookie

request_advance.py

代码语言:javascript复制
import requests

cookie={'user':'51zxw'}
r=requests.get(base_url '/cookies',cookies=cookie)
print(r.text)

运行结果:

代码语言:javascript复制
{"cookies":{"user":"51zxw"}}
获取cookie

请求百度首页,然后获取cookie,实现如下:

代码语言:javascript复制
# 获取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)

运行结果:

代码语言:javascript复制
<class 'requests.cookies.RequestsCookieJar'>
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
BDORZ:27315

调用了 cookies 属性即可成功得到了 Cookies,可以发现它是一个 RequestCookieJar 类型,然后我们用 items() 方法将其转化为元组组成的列表,遍历输出每一个 Cookie 的名和值,实现 Cookies 的遍历解析。

超时

你可以让requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应。防止某些请求没有响应而一直处于等待状态。

下面案例故意设置一个很小的超时时间,为了来看一下超时后的一个响应处理,但是实际测试过程中不要设置这样短。

代码语言:javascript复制

r=requests.get(base_url '/cookies',cookies=cookies,timeout=0.001)
print(r.text)

超时响应异常

代码语言:javascript复制
 raise ConnectTimeout(e, request=request)
requests.exceptions.ConnectTimeout: HTTPConnectionPool(host='httpbin.org', port=80): Max retries exceeded with url: /cookies (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x00000152590199E8>, 'Connection to httpbin.org timed out. (connect timeout=0.001)'))

文件上传

Reqeuests 可以使用参数files模拟提交一些文件数据,假如有的接口需要我们上传文件,我们同样可以利用它来上传,实现非常简单,实例如下:

代码语言:javascript复制
#上传文件
file={'file':open('zxw_logo.png','rb')}
r=requests.post(base_url '/post',files=file)
print(r.text)

会话对象

会话(Session)

在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。

比如你先进行了登录操作,然后打开个人中心详情页面,个人中心详情页面如何知道展示的是刚刚登录的这个用户的信息,那么这里就需要使用Session来存储相关信息。

在接口测试过程中接口之间经常有依赖关系,比如下面这两个请求一个是设置Cookie,另外一个是获取cookie,在没有Session保存机制的情况下,第二个接口无法获取第一个接口设置的Cookie值。

代码语言:javascript复制
#设置cookie
r=requests.get(base_url '/cookies/set/user/51zxw')
print(r.text)

#获取Cookie
r=requests.get(base_url '/cookies')
print(r.text)

响应数据

代码语言:javascript复制
{
  "cookies": {
    "user": "51zxw"
  }
}

{
  "cookies": {}
}

Request的会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie。具体使用如下:

代码语言:javascript复制
#生成会话对象
s=requests.Session()

#设置Cookie
r=s.get(base_url '/cookies/set/user/51zxw')
print(r.text)

#获取Cookie
r=s.get(base_url '/cookies')
print(r.text)

运行结果

代码语言:javascript复制
{
  "cookies": {
    "user": "51zxw"
  }
}

{
  "cookies": {
    "user": "51zxw"
  }
}

所以,利用 Session 我们可以做到模拟同一个会话,而且不用担心 Cookies 的问题,通常用于模拟登录成功之后再进行下一步的操作。

SSL证书验证

Requests 可以为 HTTPS 请求验证 SSL 证书,就像 web 浏览器一样。SSL 验证默认是开启的,如果证书验证失败,Requests 会抛出 SSLError: 如果不想验证SSL则可以使用verify参数关闭验证SSL。

下面是验证12306网站的证书。

代码语言:javascript复制
r=requests.get('https://www.12306.cn')
#关闭验证SSL
#r=requests.get('https://www.12306.cn',verify=False)
print(r.text)

运行结果:

代码语言:javascript复制
raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='www.12306.cn', port=443): Max retries exceeded with url: / (Caused by SSLError(CertificateError("hostname 'www.12306.cn' doesn't match either of 'webssl

Tips:12306的证书是自己颁发给自己的,所以会出现认证失败。

代理设置

代理简介

代理(Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。

代理服务器位于客户端和访问互联网之间,服务器接收客户端的请求,然后代替客户端向目标网站发出请求,所有的流量路由均来自代理服务器的IP地址,从而获取到一些不能直接获取的资源。

对于有些接口,在测试的时候请求几次,能正常获取内容。但是一旦开始大规模频繁请求(如性能测试)服务器可能会开启验证,甚至直接把IP给封禁掉。那么为了防止这种情况的发生,我们就需要设置代理来解决这个问题,在 Requests 中需要用到 proxies 这个参数,在爬虫中会常用到代理。

西刺免费代理IP

代码语言:javascript复制
#代理设置
proxies={'http':'http://219.141.153.41:80'}
r=requests.get(base_url '/get',proxies=proxies)
print(r.text)

运行结果如下:可以看到origin参数即为我们设置的代理ip

代码语言:javascript复制
{
  "args": {},
  "headers": {
    "Accept": "text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Encoding": "gzip, deflate",
    "Accept-Language": "en-US,en;q=0.5",
    "Cache-Control": "max-age=86400",
    "Connection": "close",
    "Host": "httpbin.org",
    "User-Agent": "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52"
  },
  "origin": "219.141.153.41",
  "url": "http://httpbin.org/get"
}

身份认证

很多接口都需要身份认证,Requests支持多种身份认证,具体使用方法如下:

下面案例主要验证了2种身份类型:BasicAuthdigestAuth

代码语言:javascript复制
from requests.auth import HTTPBasicAuth
from requests.auth import HTTPDigestAuth

#身份认证-BasicAuth
r=requests.get(base_url '/basic-auth/51zxw/8888',auth=HTTPBasicAuth('51zxw','8888'))
print(r.text)

#身份认证——DigestAuth
r=requests.get(base_url '/digest-auth/auth/zxw/6666',auth=HTTPDigestAuth('zxw','6666'))
print(r.text)

运行结果:

代码语言:javascript复制
{"authenticated":true,"user":"51zxw"}

{"authenticated":true,"user":"zxw"}

流式请求

有一些接口返回值比较特殊,不是单纯返回一个结果,而是多个结果,比如某个查询接口,返回值为排行榜前10的商品信息。

实践案例

请求接口如下:

代码语言:javascript复制
http://httpbin.org/stream/{num}

num 表示返回结果集的数量,比如输入10 则会返回10个下面这种不同id的结果

代码语言:javascript复制
{"url": "http://httpbin.org/stream/10", "args": {}, "headers": {"Host": "httpbin.org", "Connection": "close", "Accept": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER", "Referer": "http://httpbin.org/", "Accept-Encoding": "gzip, deflate, sdch", "Accept-Language": "zh-CN,zh;q=0.8", "Cookie": "_gauges_unique_hour=1; _gauges_unique_day=1; _gauges_unique_month=1; _gauges_unique_year=1; _gauges_unique=1"}, "origin": "110.52.4.234", "id": 0}
{"url": "http://httpbin.org/stream/10", "args": {}, "headers": {"Host": "httpbin.org", "Connection": "close", "Accept": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER", "Referer": "http://httpbin.org/", "Accept-Encoding": "gzip, deflate, sdch", "Accept-Language": "zh-CN,zh;q=0.8", "Cookie": "_gauges_unique_hour=1; _gauges_unique_day=1; _gauges_unique_month=1; _gauges_unique_year=1; _gauges_unique=1"}, "origin": "110.52.4.234", "id": 1}
{"url": "http://httpbin.org/stream/10", "args": {}, "headers": {"Host": "httpbin.org", "Connection": "close", "Accept": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER", "Referer": "http://httpbin.org/", "Accept-Encoding": "gzip, deflate, sdch", "Accept-Language": "zh-CN,zh;q=0.8", "Cookie": "_gauges_unique_hour=1; _gauges_unique_day=1; _gauges_unique_month=1; _gauges_unique_year=1; _gauges_unique=1"}, "origin": "110.52.4.234", "id": 2}
更多内容省略
...

针对这种类型的接口我们对结果集的处理需要使用迭代方法iter_lines()来处理,具体使用如下:

代码语言:javascript复制
import json

r=requests.get(base_url '/stream/10',stream=True)

#如果响应内容没有设置编码,则默认设置为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'])

返回结果:

代码语言:javascript复制
0
1
2
3
4
5
6
7
8
9

0 人点赞