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)