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" )
节后跨境航班量升价跌错峰机票价格便宜两成以上来源中国新闻网中新网北京2月8日电(记者李金磊)国家移民管理局数据显示,2月6日全国出入境人员数量达到67。6万人次,创新冠疫情以来新高,较乙类乙管政策实施前日均增长124。2。中
春光正好重庆璧山邀你去打卡春游封面新闻记者李茂佳立春过后,虽然早晚还有些许寒凉,但越来越有春天的样子了。重庆璧山区作为一座远近闻名的公园城市,不仅拥有各式各样的公园,还有各种诱人美食,是春游打卡的好去处。赏花观
圆融寺这次到河南云台山去看冰瀑,回程时顺便去了圆融寺。圆融寺在焦作市的边上,比较偏。我去的时候,正好刮大风,黄尘铺天盖地吹过来,但刮到寺庙前的停车场就不走了。我对佛教不甚了解。据说,这圆
土耳其千年古堡毁于地震来源环球时报环球时报特约记者任寒飞日前土耳其和叙利亚遭遇强烈地震,引发巨大灾难。土耳其知名的历史文化遗迹和热门旅游景点加济安泰普古堡在地震中严重损毁。这座古堡位于加济安泰普省加济安
苦熬三年之久,那些濒临倒闭的旅行社又满血复活了历经三年寒冬之后,备受重创的旅行社在春节迎来了久违的热闹,而出境团队游的重启进一步引爆了旅行社的热度,那些濒临倒闭的旅行社会满血复活吗?去年12月底,乙类乙管政策的发布为旅游市场的
世纪公园里因海洋油污没了气息的黑喉潜鸟,将在上海自博馆展翅那只在上海世纪公园因海洋油污没了气息的黑喉潜鸟,不久后或将在上海自然博物馆,再次展翅。上周,不少观鸟爱好者在上海市浦东新区世纪公园内发现一只颈部到腹部沾染大片油污的黑喉潜鸟,数日后
跟我在苏黎世一日游来源人民网人民日报海外版图为瑞士苏黎世湖美景。开栏的话读万卷书,行万里路。留学时,学子们不仅在课堂中学习专业知识,也通过旅行感受美好风景,了解外国的文化与风俗,探索世界的未知与精彩
沂蒙山好风光姜家崮姜家崮位于夏蔚镇与泉庄镇交界处,王庄北5。5公里处。海拔617米,面积1平方公里。崮顶方正险峻,是沂水县境内第二高崮。该崮因早年曾有姜姓人居此而得名姜家崮。无论从哪个地方看,都显得
约谈整改从严查处云南将19家旅行社纳入黑榜云南省文化和旅游厅7日发布通知,决定将全省2023年1月投诉量排名靠前的19家旅行社列入全省重点监管名单。请属地文化和旅游部门对重点监管名单所列旅行社进行约谈整改,列入州市红黑榜的
成都周边10大热门徒步出炉,究竟哪条路线最火?春天到了,又到了外出郊游徒步的时候啦今天小师妹给大家整理了成都周边10大热门徒步1日游路线,喜欢可以点赞收藏哟,下次有时间安排上!。1龙泉仰天窝徒步时长34h徒步路况全程石板路,坡
来桦甸枫雪部落感受冰雪民俗魅力,体验假日酷爽激情在桦甸市八道河子镇肇大鸡山脚下,有一处非常适合文艺青年,摄影美术爱好者前来打卡的地儿,那就是有着古朴民俗之美的枫雪部落。2月6日,雪后的枫雪部落银装素裹,用四根粗犷圆木搭建的大门上