1、Requests发送HTTP请求html
案例:选定某个测试的URL,利用requests库内置的不一样的方法来发送不一样类型(GET/POST/PUT/DELETE)的http请求,并输出响应的状态码python
请求方式web |
请求URLjson |
GETapi |
http://httpbin.org/get浏览器 |
POST服务器 |
http://httpbin.org/postcookie |
PUT网络 |
http://httpbin.org/putsession |
DELETE |
http://httpbin.org/delete |
request basic.py
# 导入requests库
import requests
# 定义base_url做为基础被测URL
base_url = 'http://httpbin.org'
# 发送get请求;打印响应状态码
r = requests.get(base_url+'/get')
print(r.status_code)
# 发送POST请求;打印响应状态码
r = requests.post(base_url+'/post')
print(r.status_code)
# 发送PUT请求;打印响应状态码
r = requests.put(base_url+'/put')
print(r.status_code)
# 发送DELETE请求,打印响应状态码
r = requests.delete(base_url+'/delete')
print(r.status_code)
执行结果:
发送4种不一样请求,对应响应状态码都是200,请求发送OK
2、Requests参数传递
1.传递URL参数
案例:利用Requests库,在GET请求中使用查询字符串(Query String)传递参数。
# 导入requests库
import requests
# 定义base_url做为基础被测URL
base_url = 'http://httpbin.org'
# 定义请求所需的参数,参数之间以英文逗号隔开
param_data = {'uname':'Test00001','pwd':'123456'}
# 发送GET请求,格式如:requests.get(url,params)
r = requests.get(base_url+'/get',params=param_data)
print(r.url) # 输出请求的url
print(r.status_code) #输出响应的状态码
执行结果:
2.传递Body参数
案例:利用Requests库,在POST请求的请求体(Request Body)中传递参数
import requests
base_url = 'http://httpbin.org'
form_data = {'uname':'Test00002','pwd':'123456'}
# 发送POST请求,格式如:requests.post(url,data)
r = requests.post(base_url+'/post',data=form_data)
print(r.text) # 返回响应内容
执行结果:
3、Requests请求头设置
1.设置Request Headers
案例:利用Requests库,为POST请求添加HTTP Headers,此时须要传递一个字典类型的数据给headers参数
import requests
base_url = 'http://httpbin.org'
form_data = {'uname':'Test00003','pwd':'123456'}
header = {'user-agent':'Mozilla/5.0'}
r = requests.post(base_url+'/post',data=form_data,headers=header)
print(r.text) #以文本形式返回响应内容
执行结果:
print(r.text)表明以文本形式返回响应内容
若以上代码修改成print(r.json()),表明以json形式返回响应内容,以下:
2.Request Headers爬虫应用
爬虫程序经过定制Request Headers来模拟浏览器的访问行为,以应对网站的反爬虫策略,避免被封。
如:爬取知乎页面元素时,须要设置与浏览器一致的请求头,而后再发送请求
测试url:https://www.zhihu.com/explore
情形1:不设置Request Headers
import requests
r = requests.get('https://www.zhihu.com/explore')
print(r.text)
执行结果:
400状态,错误请求,服务器没法解析请求
情形2:设置Request Headers
(从浏览器Copy一份User-Agent做为设置的Headers)
import requests
header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
r = requests.get('https://www.zhihu.com/explore',headers=header)
print(r.text)
执行结果:
可正常返回页面的元素
4、Requests Cookies设置
1.设置Cookies
经过cookies参数能够设置Cookie
request advanced.py
import requests
base_url = 'http://httpbin.org'
cookie = {'uid':'666'}
r =requests.get(base_url+'/cookies',cookies=cookie)
print(r.text)
执行结果:
2.获取Cookies
首页对某个站点发起请求,而后获取其Cookies(经过调用cookies属性便可获取所请求站点的cookies)
r = requests.get('http://www.baidu.com')
print(r.cookies)
print(type(r.cookies))
for key,value in r.cookies.items():
print(key+':'+value)
执行结果:
从以上输出结果中能够观察到:
1)所获取的cookies的类型是RequestCookieJar类型
2)用items()方法将所获取的cookies转化为元组组成的列表,而后遍历输出每个cookie的名称和值,实现cookies的遍历解析
5、Requests超时设置 & 文件上传
1.超时设置
将timeout做为参数项,若响应超过设置的时间后即中止等待响应,以防某些请求没有响应而一直处于等待状态
1)先获取响应时间
import requests
base_url = 'http://httpbin.org'
cookie = {'uid':'666'}
r = requests.get(base_url+'/cookies',cookies=cookie)
print(r.text)
print(r.elapsed.total_seconds()) # 获取响应时间(s)
2)设置等待响应的超时时间
cookie = {'uid':'666'}
r = requests.get(base_url+'/cookies',cookies=cookie,timeout=0.5)
print(r.text)
执行结果:(链接超时,抛出异常)
requests.exceptions.ConnectTimeout: HTTPConnectionPool(host='httpbin.org', port=80): Max retries exceeded with url: /cookies (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x02043BB0>, 'Connection to httpbin.org timed out. (connect timeout=0.5)'))
2.文件上传
Requests利用files做为参数模拟提交文件数据
file = {'file':open('test.bmp','rb')} #rb表示用二进制格式打开指定目录下的文件,且用于只读
r =requests.post(base_url+'/post',files=file)
print(r.text)
执行结果:
指定目录下(本次与脚本文件在同一目录)的图片数据通过编码已经提交ok
6、Session会话对象
会话(Session):Session对象存储特定用户会话所需的属性及配置信息。当用户在应用程序的Web页面之间跳转时,存储在Session对象中的变量将在整个用户会话过程当中一直存在,以确保在不一样页面中操做的是同一个用户。
在接口测试过程当中接口之间常常有依赖关系,如某个接口中的数值传递到另一个接口做为参数传递使用。
案例:A请求是设置 Cookie,B请求是获取Cookie。若没有Session保存机制的状况下,B接口是无法获取到A接口设置的Cookie值。
# 设置Cookies。{name}/{value}分别设置Cookie的名称和值
http://www.httpbin.org/cookies/set/{name}/{value}
# 获取Cookies
http://www.httpbin.org/cookies
场景①:未启用Session保存机制
执行代码:
# A接口设置Cookie
r = requests.get(base_url+'/cookies/set/uid/666')
print(r.text)
print('--------------------')
# B接口获取Cookie
r = requests.get(base_url+'/cookies')
print(r.text)
执行结果:
场景②:启用Session保存机制
Requests的会话对象可以跨请求保持某些参数,也会在同一个Session实例发出的全部请求之间保持cookie一致。
适用场景:利用Session能够模拟同一个会话,如模拟登陆成功以后再进行后续操做
执行代码:
# 生成会话对象
s = requests.session()
# 利用会话对象调用接口A并设置cookie
r = s.get(base_url+'/cookies/set/uid/666')
print(r.text)
print('--------------------')
# 利用同一会话对象调用接口B并获取cookie
r = s.get(base_url+'/cookies')
print(r.text)
执行结果:
7、SSL验证 & 代理设置
1.SSL证书验证
Requests能够模拟Web浏览器,实现对HTTPS请求来验证SSL证书。SSL验证默认是开启的,若证书验证失败,Requests会抛出SSLError;若不想验证SSL则可使用verify参数(verify=False)关闭验证SSL。
以验证12306网站的证书为例,以下:
1)保持默认开启SSL证书验证,发送请求
执行代码:
import requests
r = requests.get('https://www.12306.cn')
print(r.text)
执行结果:
ssl.CertificateError: hostname 'www.12306.cn' doesn't match either of 'webssl.chinanetcenter.com', 'i.l.inmobicdn.net', ...
PS:12306的证书是本身颁发给本身的,若不关闭SSL认证时,会出现认证失败
2)利用verify参数关闭验证SSL
执行代码:
import requests
r = requests.get('https://www.12306.cn',verify=False)
print(r.text)
执行结果:
2.代理设置
代理(Proxy):网络代理是一种特殊的网络服务,容许一个网络终端(客户端)经过代理服务与另外一个网络终端(服务器)进行非直接的链接。代理服务器位于客户端和服务端之间,代理服务器接收客户端的请求,而后代替客户端向目标网站发出请求,全部的流量路由均来自代理服务器的IP地址,从而实现获取一些不能直接获取的资源。
测试过程当中,有的接口在请求少许次数时,可正常获取内容。但若大量频繁请求(如:性能测试场景),服务器可能会开启验证,甚至直接把IP封禁。为了防止以上状况影响正常测试,此时就须要设置代理来解决。在Requests中须要用到proxies参数,在爬虫时也会经常使用到代理设置。
测试过程当中所需的代理IP,可参考:西刺免费代理IP
选取某个代理IP进行测试:
类型:HTTP
IP地址:118.190.95.35
端口:9001
执行代码:
proxy = {'http':'118.190.95.35:9001'}
r = requests.get(base_url+'/get',proxies=proxy)
print(r.text)
执行结果:
以上返回结果中,origin参数即为请求时所设置的代理IP(若不设置代理IP,则origin显示为所用测试机的IP)
8、身份认证
身份认证:不少接口都须要身份认证,Requests支持多种身份认证,如:BasicAuth、DigestAuth...
执行代码:
import requests
from requests.auth import HTTPBasicAuth
from requests.auth import HTTPDigestAuth
base_url = 'http://httpbin.org'
# BasicAuth认证
r = requests.get(base_url+'/basic-auth/test00001/111111',auth=HTTPBasicAuth('test00001','111111'))
print(r.text)
print('------------------')
# DigestAuth认证
r = requests.get(base_url+'/digest-auth/auth/test00002/222222',auth=HTTPDigestAuth('test00002','222222'))
print(r.text)
执行结果:
9、流式请求
流式请求:有的接口返回值包含有多个结果,而很是规的返回一个结果。好比查询接口,其返回值为排在前面固定数量的多个结果。
案例
请求接口:http://httpbin.ors/streas/{n}
n表示返回结果集的数量,好比输入10则会返回10个不一样id的结果,以下:
r = requests.get(base_url+'/stream/10')
print(r.text)
针对此类型接口,对结果集的处理须要使用iter_lines()迭代方法来处理。以下:
iter_lines() 函数说明:http://docs.python-requests.org/zh_CN/latest/api.html
执行代码:
import requests
import json
# 发送流式请求,stream=True表示接受流式请求,返回多个结果
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): # unicode解码方式
if line:
data = json.loads(line) # 将响应的json数据转换为python数据(字典类型)
print(data['id']) #输出每一个结果(字典类型)中id键对应的值
执行结果:
PS:
json.loads() 函数实现:json格式的字符串(str) ==> python格式的字典(dict)
原文:https://www.jianshu.com/p/6a44eca9841d