Requests模块简介安装
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
response = requests.get( "https://www.baidu.com" )
print (response.content.decode( "utf-8" ))
上例发送无参数的get请求,response.content是二进制模式,可以下载视频之类的,如果想看的话需要decode成utf-8格式。而response.text返回的是Unicode格式,通常需要转换为utf-8格式,否则就是乱码。
如果想用text方法并解决乱码维妮塔,可以通过如下代码实现:
print (response.content.decode( "utf-8" ))
print (response.text)
2、模拟带参数的get请求
import requests
# 写法一:
response = requests.get("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx6e80aecfffd74d44&secret=8e87c882c1076e95f675db64a77925bb")
print(response.content.decode("utf-8"))
# 写法二:
data = { "grant_type" : "client_credential" , "appid" : "wx6e80aecfffd74d44" , "secret" : "8e87c882c1076e95f675db64a77925bb" }
response = requests.get( "https://api.weixin.qq.com/cgi-bin/token" , params =data)
print (response.content.decode( "utf-8" ))
上面引用微信平台的接口为例,其中APPID和APPSECRET值获取的方式是:进入微信公众平台开发者文档:https://mp.weixin.qq.com/wiki/home/进入开始开发 -- 接口测试号申请菜单,通过微信扫一扫生成测试号扫码后,生成appID和appsecret自定义请求头
import requests
data = {"wd":"requests 接口测试"}
header_info = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
response = requests.get("https://www.baidu.com",params=data,headers=header_info)
print(response.content.decode("utf-8"))
上述例子是百度进行查询的接口,在实际中需要添加User-Agent头部信息,否则请求返回的数据错误。
Headers=headerinfo 表示如果需要增加请求头,可以把dict类型的键值对传给headers参数即可。模拟post请求
接口信息如下:
接口功能:新建用户标签
请求方式:POST
接口地址:https://api.weixin.qq.com/cgi-bin/tags/create?access_token=ACCESS_TOKEN
上传数据格式:json数据{"tag":{"name":"广东"}}
import requests
import json
url = "https://api.weixin.qq.com/cgi-bin/tags/create"
info = { "tag" :{ "name" : "广东11" }}
data={ "access_token" : "61_r40JB_6tNPhNori626wxl9RN27F6-oiq0vLvg9Nzt4l1g2Vyr4Zk4ySzs5_CoER8oxblbQFcpsGAiHX1zUPOJPEmE5QQq0N-jHlVSlC8yUfkOS7pfk7OvZzL5_xJq65HAPT12FtCZOzsQ19qDYTcADARMH" } # token值为之前获取access_token的值
headers = { "Content-Type" : "application/json" } # 发送json数据必带的头部信息
response=requests.post(url, params =data, data =json.dumps(info), headers =headers)
print (response.content.decode( "utf-8" ))
备注: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" : open (file_path, "rb" )}
fileResponse = requests.post( url = "" , files =files)
显式地设置文件名,文件类型和请求头;
files={ "file" :( "report.xls" , open ( "report.xls" , "rb" ), "application/vnd.ms-excel" ,{ "Expires" : "0" })}
fileResponse=requests.post(url, files =files)
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
proxies = { "http" : "http://127.0.0.1:8888" , "https" : "https://127.0.0.1:8888" }
r = requests.get( "https://www.taobao.com" , proxies =proxies)
print (r.content.decode( "utf-8" ))
包含用户名和密码:
import requests
proxies = { "http" : "http://user:password@127.0.0.1:9743/" }
response = requests.get( "https://www.taobao.com" , proxies =proxies) 超时设置
Requests模块可以设置接收数据的超时时间,超出设定的时间还没有数据返回,就抛出异常。超时设置有两种类型表达:float、tupleimport requests
response_01 = requests.get( "https://www.baidu.com" , timeout = 0.0001 ) # 表示接收数据的超时时间
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" )
print (r.history)
r = requests.get( "http://www.360buy.com" , allow_redirects = False ) session处理
部分接口需要先登录网址,才能有权限进行调用,这时可以使用到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.cnimport requests
response = requests.get( "https://www.12306.cn" ) # 如果是ssl请求,首先检车证书是否合法,不合法则报错
response = requests.get( "https://www.12306.cn" , verify = False ) #不验证证书,报警告,返回200
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
from requests.exceptions import ReadTimeout,ConnectionError,RequestException
try :
responst = requests.get( "http://httpbin.org/get" , timeout = 0.5 )
print (responst.status_code)
except ReadTimeout:
print ( "Timeout" )
except ConnectionError:
print ( "connection error" )
except RequestException:
print ( "Error" )
我也希望我的家乡好,河南,少偏见大家好,我是一个河南人,身处异地上学,室友都是其他省份的,所以经常会讨论一下各自家乡的问题及经济发展,讨论到热点问题有时候还会争论一番,今天作为河南的儿子,我简单带大家聊聊。前些年
硬刚特斯拉,集度何以打破偏见?汽车电动化转型完成之后,便是智能化的博弈。毫无疑问,现如今的汽车行业,正在经历着一场巨变。而在这次时代的变革之中,电动化智能化作为汽车进化的关键词,不仅令车企们竞相追捧,更是在消费
孩子有这几个痣,或是好福气的寓意,看看你家孩子有几个呢有的孩子一生下来身上就有胎记,有的孩子在成长的过程中,身上会长出几颗痣,有的痣可能随着孩子的成长而慢慢消失,而有的痣永远不会自己消失。其实痣的生长部位不同,也会有不同的讲究。痣的局
俗语老泄残精,人穷寿尽有什么寓意?守住残精,做好三不时代在发现,现在什么都讲科学,对于民间一些老人口中说的俗语,是否科学呢?在现在来说,有没有道理?比如老泄残精,人穷寿尽这句,是什么意思?有什么寓意呢?人老了,想要健康长寿,到底应该
抛开偏见和固执,西热力江告诉你大学生球员不比青训球员差姚明接任中国篮协主席以后,对中国篮球进行了全方位的改革,虽然到现在效果并不是很明显,但有一样却是意义深远,被很多球迷认可。那就是如今的CBA也有了自己的选秀大会,大学生球员也可以通
唐诗宋词里伶俐可爱的女孩儿名字,每一个都寓意不凡刘勰的文心雕龙中有这样的话夫缀文者情动而辞发,观文者披文以入情,沿波讨源,虽幽必显。意思是文学创作,总是由内而外,即先有客观现实的感发而产生的内在情态,这种情态通过辞章表达出来,阅
人如果太相信自己耳朵听到的东西,往往容易产生错误的判断和偏见白落梅在你若安好,便是晴天里写道真正的情,清清淡淡,平平整整,安安静静地摆在那里,从来都不需要太用力。不管和谁在一起,温柔以待,你用的力量小了,但是情感变得丰富温暖了,比起尖锐的批
诗词里古色古香的男孩名字,个个寓意丰富带来好运一个好名字往往蕴涵着起名者的期望和鼓励,也给名字的主人以鼓励,使他能朝着自己的目标和理想前进,努力使自己能名副其实。好名字能带来好的运气并不是什么迷信的说法,而是有其一定道理的。虽
俄罗斯为啥没有几个黑人?六十年前黑人在红场游行时就已有了答案如果您喜欢这篇作品,欢迎点击右上方关注。感谢您的鼓励与支持,希望能给您带来舒适的阅读体验。吸引黑人这是让人十分疑惑的一件事!偌大的俄罗斯,生活着的黑人竟寥寥可数。为什么发展十分不错
利用好每一次危机说当前我们正在经历新一轮经济危机,不为过吧。虽然大家的情绪很低迷,我仍然不得不说一些大逆不道的话富人正在靠危机,赚钱。01hr大家发现没有,现在普通人信心非常低迷,都在捂着钱包过日
孩子说老师又快找我的事儿了头条创作挑战赛我在路上走着,听着前面的两个小男孩聊天。一个男孩说今天上午我被老班批了一顿,他嫌我上课打瞌睡。另一个男孩说你老班没有我老班狠。我感觉这几天老班老想找我的事儿,已经盯了