requests模块在哪里 (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 requestsresponse = 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值获取的方式是:

  1. 进入微信公众平台开发者文档:https://mp.weixin.qq.com/wiki/home/
  2. 进入开始开发 -- 接口测试号申请菜单,通过微信扫一扫生成测试号
  3. 扫码后,生成appID和appsecret
  1. 自定义请求头

import requestsdata = {"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参数即可。

  1. 模拟post请求

接口信息如下:

接口功能:新建用户标签

请求方式:POST

接口地址:https://api.weixin.qq.com/cgi-bin/tags/create?access_token=ACCESS_TOKEN

上传数据格式:json数据{"tag":{"name":"广东"}}

import requests import jsonurl = "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 BytesIOr = 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 模拟高级操作

  1. 代理设置

代理(英文:Proxy),也称网络代理,是一种特殊的网络服务,英文全称是(Proxy Server),其功能就是代理网络用户去获取网络信息。形象的说:它是网络信息的中转站。代理服务器就好像一个大的Cache,这样就能显著提高浏览器速度和效率。

Requests 模块设置代理的方式如下:

普通代理:

import requestsproxies = { '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 requestsproxies = { "http" : "http://user:password@127.0.0.1:9743/" }response = requests.get( 'https://www.taobao.com' , proxies =proxies)

  1. 超时设置

Requests模块可以设置接收数据的超时时间,超出设定的时间还没有数据返回,就抛出异常。超时设置有两种类型表达:float、tuple

import requestsresponse_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值

  1. 重定向设置

在请求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 )

  1. 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.cn

import requestsresponse = 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’))

  1. 异常处理

遇到网络问题(如: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' )