Python自动化测试requests模块

一、简介

requests库是 python 用来发送 http 请求。它是 Python 语言里网络请求库中最好用的,没有之一。
requests 库有完善详尽的[官方文档]https://docs.python-requests.org/zh_CN/latest/?utm_source=testingpai.com

二、发送请求

1 请求方法

每一个请求方法都有一个对应的 API,比如 GET 请求就可以使用 get() 方法

import requests
resp = requests.get('https://www.baidu.com')
resp = requests.post('http://httpbin.org/post', data = {'key':'value'})
requests.put('http://httpbin.org/put', data = {'key':'value'})
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')

常用的请求方法是get请求和post请求

1.1 传递URL参数(针对get请求)

get请求有两种情况,一种是没有带参数的,比如,请求百度首页

resp = requests.get('https://www.baidu.com')

另一种是带URL参数的,此时需要使用params关键字参数

payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)

通过打印输出该 URL,你能看到 URL 已被正确编码:

print(r.url)
http://httpbin.org/get?key2=value2&key1=value1

有时候会遇到相同的 url 参数名,但有不同的值,而 python 的字典又不支持键的重名,那么我们可以把键的值用列表表示

payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('http://httpbin.org/get', params=payload)
print(r.url)
http://httpbin.org/get?key1=value1&key2=value2&key2=value3

1.2 传递表单参数(data 参数)(针对post请求)

一般上post请求才有表单参数,但是不是所有的post请求都是用表单参数
通常,你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。

要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:

resp = requests.post('http://httpbin.org/post', data = {'key':'value'})
resp.json()

1.3 传递json参数

使用 json 参数直接传递,然后它就会被自动编码

dic = {'key': 'value'}  # 字典
resp = requests.post('http://httpbin.org/post', json=dic)
print(resp.json())

1.4 files参数上传文件

url = 'http://httpbin.org/post'
files = {'file': open('test.xls', 'rb')}
r = requests.post(url, files=files)
r.text

1.5 自定义headers

自定义请求headers,把字典数据传递给 headers 参数

url = 'http://httpbin.org/get'
headers = {'user-agent': 'abc/0.0.1'}
resp = requests.get(url, headers=headers)
resp.json()

1.6 自定义 Cookies

Requests 中自定义 Cookies 也不用再去构造 CookieJar 对象,直接将字典递给 cookies 参数。

url = 'http://httpbin.org/get'
cookies = {'cookies_are': 'working'}
resp = requests.get(url, cookies=cookies)
resp.json()

定义什么cookies就返回什么cookies

1.7 设置代理

当我们需要使用代理时,同样构造代理字典,传递给 proxies 参数。

proxies = {
  'http': 'http://10.10.1.10:3128',
  'https': 'http://10.10.1.10:1080',
}

requests.get('http://example.org', proxies=proxies)

http请求走http对应的地址,https请求走https对应的地址,如果代理不支持https,即使key为https的地址写了http开头,也是不可用

VPN代理:
电脑开启了VPN后,要找到这个VPN的端口是什么,比如我的VPN占用的端口是:11000
Python代码中这样写:

proxies = {
  'http': 'http://127.0.0.1:11000',
  'https': 'http://127.0.0.1:10000',
}

127.0.0.1就是本地的IP地址,上述设置中,最好http和https都写,单写一个有可能代理不上
开启fiddler后,不设置代理Python发送https请求也会失败(请求http正常),因为fiddler也是一个代理软件,需要设置代理(端口是fiddler中设置的,一般设置8888)

1.8 重定向

在网络请求中,我们常常会遇到状态码是 3 开头的重定向问题,在 Requests 中是默认开启允许重定向的,即遇到重定向时,会自动继续访问。

resp = requests.get('http://github.com', allow_redirects=False)
resp.status_code

1.9 禁止证书验证

方法1:
有时候我们使用了抓包工具,这个时候由于抓包工具提供的证书并不是由受信任的数字证书颁发机构颁发的,所以证书的验证会失败,所以我们就需要关闭证书验证。

在请求的时候把 verify 参数设置为 False 就可以关闭证书验证了。

import requests
resp = requests.get('https://httpbin.org/get', verify=False)

但是关闭验证后,会有一个比较烦人的 warning,可以使用以下方法关闭警告:

from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

方法2:
在调试代码的时候,经常用到fiddler,但是代码本身不需要代理fiddler,这个时候添加下面代码,在代码请求的时候就不通过fiddler了,这样就不用关闭fiddler了

import os
os.environ['NO_PROXY'] = 'stackoverflow.com'

如果代码请求https要通过fiddler抓包,代码需要设置代理,也要安装证书(实际使用中,代码已经看到请求的参数了,一般不需要通过fiddler抓取代码的请求)在调试代码的时候,经常用到fiddler,但是代码本身不需要代理fiddler,这个时候添加下面代码,在代码请求的时候就不通过fiddler了,这样就不用关闭fiddler了

import os
os.environ['NO_PROXY'] = 'stackoverflow.com'

如果代码请求https要通过fiddler抓包,代码需要设置代理,也要安装证书(实际使用中,代码已经看到请求的参数了,一般不需要通过fiddler抓取代码的请求)
1.10 设置超时
设置访问超时,设置 timeout 参数即可。

requests.get('http://github.com', timeout=0.001)

上述可见,通过 Requests 发起请求,只需要构造好几个需要的字典,并将其传入请求的方法中,即可完成基本的网络请求。

2. 响应

通过 Requests 发起请求获取到的,是一个 requests.models.Response 对象。通过这个对象可以很方便的获取响应的内容(包括状态码、数据、响应头、响应cookies等等)。

2.1 响应数据

通过 Response 对象的 text 属性可以获得字符串格式的响应内容。

import requests
resp = requests.get('https://www.baidu.com')
resp.text

Requests 会自动的根据响应的报头来猜测网页的编码是什么,然后根据猜测的编码来解码网页内容,基本上大部分的网页都能够正确的被解码。而如果发现 text 解码不正确的时候,就需要手动的去指定解码的编码格式。

import requests
resp = requests.get('https://www.baidu.com')
resp.encoding = 'utf-8'   # 设置编码
resp.text

如果需要获得原始的二进制数据,那么使用 content 属性即可。

resp.content

如果访问之后获得的数据是 JSON 格式的,可以使用 json() 方法,直接获取转换成字典格式的数据

resp = requests.get('http://httpbin.org/get')
resp.json()

2.2 状态码

通过 status_code 属性获取响应的状态码

resp = requests.get('http://httpbin.org/get')
resp.status_code

2.3 响应头

通过 headers 属性获取响应的报头

resp.headers

2.4 服务器返回的 cookies

通过 cookies 属性获取服务器返回的 cookies

import requests
url = 'http://www.baidu.com'
resp = requests.get(url)
resp.cookies

输出的cookies

<RequestsCookieJar[Cookie(version=0, name='BDORZ', value='27315', port=None, port_specified=False, domain='.baidu.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1600346744, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)]>

2.4.1 把cookies转换成字典

# 获取登录成功后的cookie信息
cookiejar = resp.cookies  # 获取cookies

# 把cookie转换成字典
cookie = requests.utils.dict_from_cookiejar(cookiejar)

2.5 url

可以使用 url 属性查看访问的 url。

params = {'key1': 'value1', 'key2': 'value2'}
resp = requests.get("http://httpbin.org/get", params=params)
resp.url

输出

http://httpbin.org/get?key1=value1&key2=value2

3. Session

在 Requests 中,实现了 Session(会话) 功能,当我们使用 Session 时,能够像浏览器一样,在没有关闭关闭浏览器时,能够保持住访问的状态。

这个功能常常被我们用于登陆之后的数据获取,使我们不用再一次又一次的传递 cookies。

import requests
session = requests.Session()
session.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
resp = session.get('http://httpbin.org/cookies')
print(resp.text)
{
"cookies": {
"sessioncookie": "123456789"
}
}

首先我们需要去生成一个 Session 对象,然后用这个 Session 对象来发起访问,发起访问的方法与正常的请求是一模一样的。

同时,需要注意的是,如果是我们在 get() 方法中传入 headers 和 cookies 等数据,那么这些数据只在当前这一次请求中有效。如果你想要让一个 headers 在 Session 的整个生命周期内都有效的话,需要用以下的方式来进行设置:

# 设置整个headers
session.headers = {
    'user-agent': 'lemonban/0.0.1'
}
# 增加一条headers
session.headers.update({'x-test': 'true'})

4. token

待补充...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容