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值获取的方式是:

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

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参数即可。

  1. 模拟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 模拟高级操作

  1. 代理设置

代理(英文: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)

  1. 超时设置

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

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

  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 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’))

  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')

展开阅读全文

页面更新:2024-03-10

标签:模块   接口   异常   证书   参数   类型   方式   简介   内容   数据   信息

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top