Requests模块简介安装
Requests模块简介与安装
在python的标准库中,随人提供了urllib,utllicb2,httplib,但是做接口测试,requests使用更加方便快捷,正如官方说的,让HTTP服务人类。
Requests是用python语言基于urllib编写的,采用的是Apache2Licensed开源协议的HTTP库,Requests它会比urllib更加方便,可以节约我们大量的工作。
Requests模块安装:
安装方式一:
执行pipinstalllUrequests联网安装requests
安装方式二:
进入https:pypi。orgprojectrequests
下载并解压requests2。19。1。tar。gz,然后用cmd进入解压目录,使用命令Pythonsetup。pyinstall安装requests
备注:在pycharm中使用的时候如果无法显示模块,必须通过pycharmfilesettingprojectinterpreter再安装导入一次。
Requests模拟http请求
1、模拟get请求
importrequests
responserequests。get(https:www。baidu。com)
print(response。content。decode(utf8))
上例发送无参数的get请求,response。content是二进制模式,可以下载视频之类的,如果想看的话需要decode成utf8格式。而response。text返回的是Unicode格式,通常需要转换为utf8格式,否则就是乱码。
如果想用text方法并解决乱码维妮塔,可以通过如下代码实现:
print(response。content。decode(utf8))
print(response。text)
2、模拟带参数的get请求
importrequests
写法一:
responserequests。get(https:api。weixin。qq。comcgibintoken?granttypeclientcredentialappidwx6e80aecfffd74d44secret8e87c882c1076e95f675db64a77925bb)
print(response。content。decode(utf8))
写法二:
data{granttype:clientcredential,appid:wx6e80aecfffd74d44,secret:8e87c882c1076e95f675db64a77925bb}
responserequests。get(https:api。weixin。qq。comcgibintoken,paramsdata)
print(response。content。decode(utf8))
上面引用微信平台的接口为例,其中APPID和APPSECRET值获取的方式是:进入微信公众平台开发者文档:https:mp。weixin。qq。comwikihome进入开始开发接口测试号申请菜单,通过微信扫一扫生成测试号扫码后,生成appID和appsecret自定义请求头
importrequests
data{wd:requests接口测试}
headerinfo{
useragent:Mozilla5。0(WindowsNT10。0;Win64;x64)AppleWebKit537。36(KHTML,likeGecko)Chrome104。0。0。0Safari537。36
}
responserequests。get(https:www。baidu。com,paramsdata,headersheaderinfo)
print(response。content。decode(utf8))
上述例子是百度进行查询的接口,在实际中需要添加UserAgent头部信息,否则请求返回的数据错误。
Headersheaderinfo表示如果需要增加请求头,可以把dict类型的键值对传给headers参数即可。模拟post请求
接口信息如下:
接口功能:新建用户标签
请求方式:POST
接口地址:https:api。weixin。qq。comcgibintagscreate?accesstokenACCESSTOKEN
上传数据格式:json数据{tag:{name:广东}}
importrequests
importjson
urlhttps:api。weixin。qq。comcgibintagscreate
info{tag:{name:广东11}}
data{accesstoken:61r40JB6tNPhNori626wxl9RN27F6oiq0vLvg9Nzt4l1g2Vyr4Zk4ySzs5CoER8oxblbQFcpsGAiHX1zUPOJPEmE5QQq0NjHlVSlC8yUfkOS7pfk7OvZzL5xJq65HAPT12FtCZOzsQ19qDYTcADARMH}token值为之前获取accesstoken的值
headers{ContentType:applicationjson}发送json数据必带的头部信息
responserequests。post(url,paramsdata,datajson。dumps(info),headersheaders)
print(response。content。decode(utf8))
备注:json。dumps(),用于将dict类型的而数据转成json格式编码的字符串。
通过上面的例子,可以知道,post请求的参数是通过data方式来传递的。Post的请求参数一般有from表单、json数据、文件等。用requests模块处理方式如下:
from表单(使用dict类型传输):
postResponserequests。post(url,data{key:value})
json数据:
方式一:(需要使用json模块)jsonParams{key:value}
Headers{ContentType:applicationjson}
postJsonResponserequests。post(url,headersheaders,datajson。dumps(jsonParams))
方式二:jsonParams{key:value}
headres{ContentType:applicationjson}
postJsonResponserequests。post(url,headersheaders,jsonjsonParams)
文件上传:
简单处理:
filepathC:UserskcadmiDesktopjuneyao。docx
files{file:open(filepath,rb)}
fileResponserequests。post(url,filesfiles)
显式地设置文件名,文件类型和请求头;
files{file:(report。xls,open(report。xls,rb),applicationvnd。msexcel,{Expires:0})}
fileResponserequests。post(url,filesfiles)
Requests官方帮助文档实例链接:
http:httpbin。orgpost
Requests模块获取响应内容
响应包括响应行、响应头、响应正文内容,这些返回的响应信息都可以通过Requests模块获取。这些获取到的响应内容也是接口测试执行得到的实际结果。
获取响应行:
rrequests。get(https:www。baidu。com)
print(r。statuscode)获取响应状态码
print(r。reason)获取响应信息
获取响应头
print(r。headers)获取响应头,返回的是dict类型,可以继续使用get获取指定的值
获取其它响应信息:
print(r。url)获取请求地址
print(r。cookies)获取cookies
print(r。encoding)获取响应的编码格式
依据不同响应正文内容的情况,Requests模块有四块不同的处理方式:
响应内容:
rrequests。get(https:www。baidu。com)
print(r。text)
Requests会自动解码来自服务器的内容。大多数unicode字符集都能被五逢地解码。请求发出后,Requests会基于HTTP头部对响应的编码作出有根据的推测。当你访问r。text之时,Requests会使用,其推测的文本编码。r。text使用后乱码的几率很大,可以先用r。encoding属性来改变编码,如下所示:
rrequests。get(https:www。baidu。com)
r。encodingutf8
print(r。text)
二进制响应内容:
对于非文本请求,r。content能以字节的方式访问请求响应体。且Requests模块会自动为你解码gzip和deflate传输编码的响应数据。
使用r。content处理普通的行营返回:
rrequests。get(https:www。baidu。com)
print(r。content。decode(utf8))
使用r。content下载图片文件:
fromPILimportImage
fromioimportBytesIO
rrequests。get(https:www。baidu。comimgbdlogo1。png)
imgimage。open(BytesIO(r。content))
img。save(test。png)
JSON响应内容:
Requests中有一个内置的JSON解释器r。json(),处理返回的JSON数据,使用后,会把返回的数据作为一个python中的json数据对象看待。如果JSON解释失败,r。json()就会抛出异常。
举例:
data{granttype:clientcredential,appid:wx8f5d6a0a65df03a2,secret:fbeaae831dbb54a981faf12d554a5352}
responserequests。get(https:api。weixin。qq。comcgibintoken,paramsdata)
jsondataresponse。json()
print(jsondata〔accesstoken〕)普通键值对直接取值
原始响应内容:(一般不使用)
如果需要获取来自服务器的原始套接字响应,可以使用r。raw,如果确定要获取的话,还需要在初始请求中设置streamTrue。
rrequests。get(https:www。baidu。com,streamTrue)
print(r。raw。read(1))
Requests模拟高级操作代理设置
代理(英文:Proxy),也称网络代理,是一种特殊的网络服务,英文全称是(ProxyServer),其功能就是代理网络用户去获取网络信息。形象的说:它是网络信息的中转站。代理服务器就好像一个大的Cache,这样就能显著提高浏览器速度和效率。
Requests模块设置代理的方式如下:
普通代理:
importrequests
proxies{http:http:127。0。0。1:8888,https:https:127。0。0。1:8888}
rrequests。get(https:www。taobao。com,proxiesproxies)
print(r。content。decode(utf8))
包含用户名和密码:
importrequests
proxies{http:http:user:password127。0。0。1:9743}
responserequests。get(https:www。taobao。com,proxiesproxies)超时设置
Requests模块可以设置接收数据的超时时间,超出设定的时间还没有数据返回,就抛出异常。超时设置有两种类型表达:float、tupleimportrequests
response01requests。get(https:www。baidu。com,timeout0。0001)表示接收数据的超时时间
response02requests。get(https:www。baidu。com,timeout(0。1,0。2))0。1代表链接超时,0。2表示接收数据的超时时间(单位是秒)
接收数据的超时时间(单位是秒)
如果远端服务器很慢,你可以让Request永远等待,传入一个None作为timeout值重定向设置
在请求url时,服务器会自动把我们的请求重定向,可以使用r。history来查看重定向。如果不想进行自动重定向,可以用参数allowredirects关闭。
rrequests。get(http:www。360buy。com)
print(r。history)
rrequests。get(http:www。360buy。com,allowredirectsFalse)session处理
部分接口需要先登录网址,才能有权限进行调用,这时可以使用到session,具体操作时:先使用网址的登录api进行登录,得到session后,然后用该session来请求其它的接口。示例代码如下:
srequests。Session()
logindata{formemail:youremailexample。com,formpassword:yourpassword}
s。post(http:pythontab。comtestLogin,logindata)
rs。get(http:pythontab。comnotification)
5、请求中携带cookies
对于某些网站,登录然后从浏览器中获取cookies,以后就可以直接拿着cookie登录了,
无需输入用户名密码。
importrequests
Cookies{usersession:value}
responserequests。get(https:github。comsettingsemails,cookiesCookies)
6、SSLCertVerification
很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书如知乎、百度等是可带可不带担忧硬性要求的,则必须待,比如对于定向的用户,拿到证书后才有权限访问某个特定网站。
举例:https:www。12306。cnimportrequests
responserequests。get(https:www。12306。cn)如果是ssl请求,首先检车证书是否合法,不合法则报错
responserequests。get(https:www。12306。cn,verifyFalse)不验证证书,报警告,返回200
Pipinstallupgradeforcereinstall‘requests2。6。0’urlib3
fromrequests。packageimporturlib3
Urlib3。disablewarnings()关闭警告
Responstrequests。get(‘https:www。12306。cn’,verifyFalse)
加上证书:(最好的解决方案)
Responserequests。get(‘https:wwww。12306。cn’,cert(‘pathserver。crt’,’pathkey’))异常处理
遇到网络问题(如:DNS查询失败、拒绝链接等)时,Requests会抛出一个connectionError异常。如果HTTP请求返回不成功的状态码,Response。raiseforstatus()会排除一个HTTPError异常。
若请求超时,则抛出一个Timeout异常。
所有Requests显示抛出的异常都继承自requests。exceptions。RequestException。
importrequests
fromrequests。exceptionsimportReadTimeout,ConnectionError,RequestException
try:
responstrequests。get(http:httpbin。orgget,timeout0。5)
print(responst。statuscode)
exceptReadTimeout:
print(Timeout)
exceptConnectionError:
print(connectionerror)
exceptRequestException:
print(Error)