网站计算机速成培训班,江苏省网站建设,淮北矿业集团工程建设公司网站,安康网站建设技巧
requests库 什么是Requests #xff1f;Requests 是⽤Python语⾔编写#xff0c;基于urllib#xff0c;采⽤Apache2 Licensed开源协议的 HTTP 库。它⽐ urllib 更加⽅便#xff0c;可以节约我们⼤量的⼯作#xff0c;完全满⾜HTTP测试需求。 安装#xff1a;cm…
requests库 什么是Requests Requests 是⽤Python语⾔编写基于urllib采⽤Apache2 Licensed开源协议的 HTTP 库。它⽐ urllib 更加⽅便可以节约我们⼤量的⼯作完全满⾜HTTP测试需求。 安装cmd命令行执行pip install requests HTTP 请求方法 HTTP 协议 Hyper Text Transfer Protocol一个基于TCP/IP通信协议来传递数据包括html文件、图像、结果等即是一个客户端和服务器端请求和应答的标准。根据HTTP 标准HTTP 请求可以使用多种请求方法。 HTTP 0.9只有基本的文本GET请求没有固定的版本号不支持请求头。HTTP 1.0完善的请求/响应模型并将协议补充完整定义了三种请求方法GETPOST和HEAD方法。HTTP 1.1在1.0的基础上进行更新新增了五种请求方法OPTIONSPUTDELETETRACE和CONNECT方法。HTTP 2.0未普及请求/响应首部的定义基本没有改变只是所有首部键必须全部小写而且请求行要独立为:method、:scheme、:host、:path这些键值对。 序号 方法 描述 1 GET 请求指定的页面信息并返回实体主体。 2 HEAD 类似于 GET 请求只不过返回的响应中没有具体的内容用于获取报头。 3 POST 向指定资源提交数据进行处理请求例如提交表单或者上传文件数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。 5 DELETE 请求服务器删除指定的页面。 6 CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 7 OPTIONS 允许客户端查看服务器的性能。 8 TRACE 回显服务器收到的请求主要用于测试或诊断。 9 PATCH 是对 PUT 方法的补充用来对已知资源进行局部更新 。 HTTP请求常用的Get和Post两种方法 GET是从服务器上获取数据POST是向服务器传送数据 GET请求参数都显示在浏览器网址上HTTP服务器根据该请求所包含URL中的参数来产生响应内容也就是说GET请求的参数是URL的一部分。比如百度requests模块 POST请求参数是在请求体当中消息长度没有限制且以隐式的方式进行传送通常用来向HTTP服务器提交量比较大的数据比如请求中包含许多参数或者文件上传操作等请求的参数包含在“Content-Type”消息头里指明该消息体的媒体类型和编码 发送GET请求 关键代码requests.get(url) 参数说明若需要传请求参数可直接在 url 后面添加也可以在调用get()方法时通过关键字params传入需要注意的是params需要传入dict字典类型。 下面以请求百度为例发送get请求 import requests# 通过url直接加上请求参数与通过params传参效果是一样的
response requests.get(urlhttp://www.baidu.com/s?wdrequests模块)
# 通过params传参
response2 requests.get(urlhttp://www.baidu.com/s, params{wd: requests模块})
print(response.status_code) # 打印状态码
# print(response.text) # 获取响应内容 运行结果
C:\software\python\python.exe D:/learn/test.py
200Process finished with exit code 0 发送POST请求 关键代码requests.post(url, data) 参数说明可传dict类型也可传json类型dict类型使用关键字data传参json类型则为使用关键字json传参。若无需传参可不传。
register_url http://127.0.0.1:666/index/register# 添加请求头需要就传
header {Content-Type: application/json
}# json类型的参数
json {mobile_phone: 15612345678,pwd: Test1234,type: 0
}
# 发送post请求
response requests.post(urlregister_url, jsonjson, headersheader)
print(response.json())# 打印结果{code: 200, msg: success, password: 321, username: 123} 上面举例为json类型的传参json和dict类型的数据结构表面上看有点相似那怎么判断什么时候用json什么时候用dict呢只要查看请求头需要哪种就传哪种表单类型的参数即Content-Type: application/x-www-form-urlencoded就使用关键字data去传dcit类型的参数像上面举例的Content-Type: application/jsonjson类型的参数一定要使用关键字json去传递。 获取响应数据 常见的属性 response.status_code获取响应状态码response.cookies获取cookiesresponse.headers获取头部信息response.url获取urlresponse.text自动识别文本中的编码格式进行解码但有时候不准确会出现乱码response.content.decode(utf-8)response.content获取字节流的数据进行decode解码默认是utf8response.json()json方法可以将json字符串转换成对应的python类型的数据接口返回的数据99%都是json类型的 import requestsresponse requests.get(urlhttp://www.baidu.com/s?wdrequests模块)
# response requests.get(urlhttp://www.baidu.com/s, params{wd: requests模块})print(这是status_code{}\n.format(response.status_code))print(这是cookies.{}\n.format(response.cookies))print(这是headers.{}\n.format(response.headers))print(这是url.{}\n.format(response.url))# print(这是响应页面文本信息.{}\n.format(response.text)) # 因为返回数据太长不作运行
# print(这是获取的字节流数据decode解码.{}\n.format(response.content.decode())) 运行结果
C:\software\python\python.exe D:/learn/test.py
这是status_code200这是cookies.RequestsCookieJar[Cookie BAIDUID6EC84DD4DE623D1500B3D0E771D1D3FA:FG1 for .baidu.com/, Cookie BIDUPSID6EC84DD4DE623D15C087081CA8B7A6D9 for .baidu.com/, Cookie H_PS_PSSID32292_1441_32355_32328_31253_32348_32046_32394_32429_32115_32437 for .baidu.com/, Cookie PSINO6 for .baidu.com/, Cookie PSTM1596554477 for .baidu.com/, Cookie delPer0 for .baidu.com/, Cookie BDSVRTM11 for www.baidu.com/, Cookie BD_CK_SAM1 for www.baidu.com/]这是headers.{Bdpagetype: 3, Bdqid: 0xf2cd9ccf00070e08, Cache-Control: private, Ckpacknum: 2, Ckrndstr: f00070e08, Connection: keep-alive, Content-Encoding: gzip, Content-Type: text/html;charsetutf-8, Date: Tue, 04 Aug 2020 15:21:17 GMT, P3p: CP OTI DSP COR IVA OUR IND COM , CP OTI DSP COR IVA OUR IND COM , Server: BWS/1.1, Set-Cookie: BAIDUID6EC84DD4DE623D15C087081CA8B7A6D9:FG1; expiresThu, 31-Dec-37 23:55:55 GMT; max-age2147483647; path/; domain.baidu.com, BIDUPSID6EC84DD4DE623D15C087081CA8B7A6D9; expiresThu, 31-Dec-37 23:55:55 GMT; max-age2147483647; path/; domain.baidu.com, PSTM1596554477; expiresThu, 31-Dec-37 23:55:55 GMT; max-age2147483647; path/; domain.baidu.com, BAIDUID6EC84DD4DE623D1500B3D0E771D1D3FA:FG1; max-age31536000; expiresWed, 04-Aug-21 15:21:17 GMT; domain.baidu.com; path/; version1; commentbd, delPer0; path/; domain.baidu.com, BD_CK_SAM1;path/, PSINO6; domain.baidu.com; path/, BDSVRTM11; path/, H_PS_PSSID32292_1441_32355_32328_31253_32348_32046_32394_32429_32115_32437; path/; domain.baidu.com, Traceid: 1596554477018818305017495812540276870664, Vary: Accept-Encoding, X-Ua-Compatible: IEEdge,chrome1, Transfer-Encoding: chunked}这是url.http://www.baidu.com/s?wdrequests%E6%A8%A1%E5%9D%97Process finished with exit code 0 高级操作 在上面我们基本了解了requests库的基本用法如GET、POST请求以及response的属性接下来我们再看下requests库的一些高级用法如下载/上传文件、Cookies设置、代理设置等 文件下载 与发送请求区别无二只是保存时需要处理一下如下载图片把获取图片的二进制数据然后用二进制写入文件即可。
import requestsresponse requests.get(https://github.com/favicon.ico)# 获取二进制数据然后写入文件
with open(favicon.ico,wb)as f:f.write(response.content)f.close 文件上传
关键代码requests.post(utl, filesfiles)
import requestsfile {file:open(favicon.ico,rb)} # 将之前抓取的github图标以二进制格式读取response requests.post(http://httpbin.org/post, files file)print(response.text) SSL证书验证 为什么会有SSL证书验证SSL是什么 SSL协议是网络层和传输层的协议。SSLSecure Sockets Layer 安全套接层协议及其继任者TLSTransport Layer Security传输层安全协议是为网络通信提供安全及数据完整性的一种安全协议。 HTTPS是兼容HTTP的可以把HTTPS理解为HTTP over TSL即HTTPS是HTTP协议和TSL协议的组合。HTTPS在传输数据时同样会先建立TCP连接建立起TCP连接后会建立TSL连接。请求可以为HTTPS请求验证SSL证书就像我们使用的浏览器一样SSL验证默认是开启的如果证书验证失败请求会抛出一个SSLError如下图 碰到请求SSL验证的我们是可以直接跳过不验证的通过设置verifyFalse就可关闭错误提示跳过SSL验证这里只是忽略了SSL验证并不是没有了SSL验证它仍然会存在一个警告信息InsecureRequestWarning。
import requests
#通过一下两行代码即可把警报消除即使verifyFalse报警还是存在的
from requests.packages import urllib3urllib3.disable_warnings()response requests.get(https://www.12306.cn,verify False)
print(response.status_code) 保持会话 在requests中如果直接使用get()或post()等方法是可以做到模拟网页的接口请求但是每次发起请求结束后它就结束了并不会保存相关的验证信息如cookies/token比如第一次使用post()请求登录了某个网站第二次想获取成功登录后的用户个人信息再一次发起post()请求时它会要求你需求先登录明明第一次请求时已经登录了为什么第二次还提示要先登录呢实际上两次请求相当于使用了两个浏览器去访问是两个完全不相关的会话因此第二次请求是拿不到用户信息的。 requests中的session对象能够让我们跨http请求保持某些参数即让同一个session对象发送的请求头携带某个指定的参数。当然最常见的应用是它可以让cookie保持在后续的一串请求中。 # 创建一个session对象使它能够自动记录上一次请求中的cookie信息
se requests.session()# 登录接口
login_url http://www.test.com/api/member/login
login_data {mobilephone: 15612345678,pwd: Test1234
}
res se.post(urllogin_url, datalogin_data)# 登录后查询用户最近的订单记录
order_record_url http://www.test.com/api/member/order
record_data {beginTime: 2020-08-01,endTime: 2020-08-15
}
res2 se.post(urlorder_record_url, datarecord_data)
print(res2.json()) requests封装 凡是需要重复使用的我们都可以对它进行二次封装写成我们自己的版本还可以在封装过程中加入我们想要的内容使用的时候直接调用即可。
import requestsclass SendSessionRequest:使用session鉴权的接口记录cookies/tokendef __init__(self):self.session requests.session()def requests(self, url, method, paramsNone, dataNone, jsonNone, headersNone):method method.lower()if method post:return self.session.post(urlurl, jsonjson, datadata, headersheaders)elif method patch:return self.session.patch(urlurl, jsonjson, datadata, headersheaders)elif method get:return self.session.get(urlurl, paramsparams)