Requests 模块简介与安装
在python的标准库中,随人提供了urllib,utllicb2,httplib,但是做接口测试,requests使用更加方便快捷,正如官方说的,“让HTTP服务人类”。
Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,Requests它会比urllib更加方便,可以节约我们大量的工作。
Requests模块安装:
安装方式一:
执行 pip installl -U requests 联网安装 requests
安装方式二:
进入https://pypi.org/project/requests/
下载并解压requests-2.19.1.tar.gz,然后用cmd进入解压目录,使用命令Python setup.py install 安装requests
备注:在pycharm中使用的时候如果无法显示模块,必须通过pycharm -file -setting -project interpreter 再安装导入一次。
Requests 模拟http请求
1、模拟get请求
import requests |
上例发送无参数的get请求,response.content是二进制模式,可以下载视频之类的,如果想看的话需要decode成utf-8格式。而response.text返回的是Unicode格式,通常需要转换为utf-8格式,否则就是乱码。
如果想用text方法并解决乱码维妮塔,可以通过如下代码实现:
print(response.content.decode('utf-8')) |
2、模拟带参数的get请求
import requests |
上面引用微信平台的接口为例,其中APPID和APPSECRET值获取的方式是:
import requests |
上述例子是百度进行查询的接口,在实际中需要添加User-Agent头部信息,否则请求返回的数据错误。
Headers=headerinfo 表示如果需要增加请求头,可以把dict类型的键值对传给headers参数即可。
接口信息如下:
接口功能:新建用户标签
请求方式:POST
接口地址:https://api.weixin.qq.com/cgi-bin/tags/create?access_token=ACCESS_TOKEN
上传数据格式:json数据{"tag":{"name":"广东"}}
import requests |
备注:json.dumps(),用于将dict类型的而数据转成json格式编码的字符串。
通过上面的例子,可以知道,post请求的参数是通过data方式来传递的。Post的请求参数一般有from表单、json数据、文件等。用requests模块处理方式如下:
from 表单(使用dict类型传输):
postResponse = requests.post(url,data={'key':'value'})
json数据:
方式一:(需要使用json模块)
jsonParams = {'key':'value'} Headers = {'Content-Type':'application/json'} postJsonResponse = requests.post(url,headers=headers,data=json.dumps(jsonParams)) |
方式二:
jsonParams = {'key':'value'} headres = {'Content-Type':'application/json'} postJsonResponse = requests.post(url,headers=headers,json=jsonParams) |
文件上传:
简单处理:
file_path = 'C:/Users/kcadmi/Desktop/juneyao.docx' |
显式地设置文件名,文件类型和请求头;
files={'file':('report.xls',open('report.xls','rb'),'application/vnd.ms-excel',{'Expires':'0'})} |
Requests官方帮助文档实例链接:
http://httpbin.org/post
Requests 模块获取响应内容
响应包括响应行、响应头、响应正文内容,这些返回的响应信息都可以通过Requests模块获取。这些获取到的响应内容也是接口测试执行得到的实际结果。
获取响应行:
r = requests.get("https://www.baidu.com")
print(r.status_code) # 获取响应状态码
print(r.reason) # 获取响应信息
# 获取响应头
print(r.headers) # 获取响应头,返回的是dict类型,可以继续使用get获取指定的值
# 获取其它响应信息:
print(r.url) # 获取请求地址
print(r.cookies) # 获取cookies
print(r.encoding) # 获取响应的编码格式
依据不同响应正文内容的情况,Requests模块有四块不同的处理方式:
响应内容:
r = requests.get("https://www.baidu.com")
print(r.text)
Requests 会自动解码来自服务器的内容。大多数unicode字符集都能被五逢地解码。请求发出后,Requests 会基于HTTP头部对响应的编码作出有根据的推测。当你访问 r.text之时,Requests 会使用,其推测的文本编码。r.text 使用后乱码的几率很大,可以先用r.encoding属性来改变编码,如下所示:
r = requests.get("https://www.baidu.com")
r.encoding = 'utf-8'
print(r.text)
二进制响应内容:
对于非文本请求,r.content能以字节的方式访问请求响应体。且Requests 模块会自动为你解码gzip 和 deflate 传输编码的响应数据。
使用r.content处理普通的行营返回:
r = requests.get("https://www.baidu.com")
print(r.content.decode('utf-8'))
使用r.content 下载图片文件:
from PIL import Image
from io import BytesIO
r = requests.get('https://www.baidu.com/img/bd_logo1.png')
img = image.open(BytesIO(r.content))
img.save('test.png')
JSON 响应内容:
Requests 中有一个内置的JSON解释器r.json(),处理返回的JSON数据,使用后,会把返回的数据作为一个python中的json数据对象看待。如果JSON解释失败,r.json()就会抛出异常。
举例:
data = {'grant_type':'client_credential','appid':'wx8f5d6a0a65df03a2','secret':'fbeaae831dbb54a981faf12d554a5352'}
response = requests.get("https://api.weixin.qq.com/cgi-bin/token",params=data)
jsondata=response.json()
print(jsondata['access_token']) # 普通键值对直接取值
原始响应内容:(一般不使用)
如果需要获取来自服务器的原始套接字响应,可以使用r.raw,如果确定要获取的话,还需要在初始请求中设置stream=True。
r = requests.get('https://www.baidu.com',stream=True)
print(r.raw.read(1))
Requests 模拟高级操作
代理(英文:Proxy),也称网络代理,是一种特殊的网络服务,英文全称是(Proxy Server),其功能就是代理网络用户去获取网络信息。形象的说:它是网络信息的中转站。代理服务器就好像一个大的Cache,这样就能显著提高浏览器速度和效率。
Requests 模块设置代理的方式如下:
普通代理:
import requests |
包含用户名和密码:
import requests
proxies = {"http":"http://user:password@127.0.0.1:9743/"}
response = requests.get('https://www.taobao.com',proxies=proxies)
Requests模块可以设置接收数据的超时时间,超出设定的时间还没有数据返回,就抛出异常。超时设置有两种类型表达:float、tuple
import requests response_02 = requests.get('https://www.baidu.com',timeout=(0.1,0.2)) # 0.1代表链接超时,0.2表示接收数据的超时时间(单位是秒) |
接收数据的超时时间(单位是秒)
如果远端服务器很慢,你可以让Request永远等待,传入一个None作为timeout值
在请求url时,服务器会自动把我们的请求重定向,可以使用r.history来查看重定向。如果不想进行自动重定向,可以用参数allow_redirects关闭。
r = requests.get("http://www.360buy.com") |
部分接口需要先登录网址,才能有权限进行调用,这时可以使用到session,具体操作时:先使用网址的登录api进行登录,得到session后,然后用该session来请求其它的接口。示例代码如下:
s=requests.Session()
login_data={'form_email':'youremail@example.com','form_password':'yourpassword'}
s.post("http://pythontab.com/testLogin",login_data)
r=s.get('http://pythontab.com/notification/')
5、请求中携带cookies
对于某些网站,登录然后从浏览器中获取cookies,以后就可以直接拿着cookie登录了,
无需输入用户名密码。
import requests
Cookies={'user_session':'value'}
response=requests.get('https://github.com/settings/emails',cookies=Cookies)
6、SSL Cert Verification
很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书如知乎、百度等是可带可不带担忧硬性要求的,则必须待,比如对于定向的用户,拿到证书后才有权限访问某个特定网站。
举例:https://www.12306.cn
import requests Pip install -upgrade --force-reinstall ‘requests==2.6.0’ urlib3 from requests.package import urlib3 Urlib3.disable_warnings() # 关闭警告 Responst = requests.get(‘https://www.12306.cn’,verify=False) # 加上证书:(最好的解决方案) Response = requests.get(‘https://wwww.12306.cn’,cert=(‘/path/server.crt’,’/path/key’)) |
遇到网络问题(如:DNS查询失败、拒绝链接等)时,Requests会抛出一个connectionError异常。如果HTTP请求返回不成功的状态码,Response.raise_for_status()会排除一个HTTPError异常。
若请求超时,则抛出一个Timeout异常。
所有Requests显示抛出的异常都继承自requests.exceptions.RequestException.
import requests |
页面更新:2024-03-10
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号