requests库入门-11-自定义请求
来源:互联网 发布:奥米姿淘宝 编辑:程序博客网 时间:2024/06/16 11:29
我们已经学会了通过requests.get()或者requests.post()实现发送请求。看起来很简单,是不是,也很好用。但是你知道requests底层是如何实现的吗。还有,我们有时候需要定义一些我们自己特定情况下的请求。为了解决这个问题,你需要遇到requests的文档中高级的部分。
1.文档位置
浏览器打开http://cn.python-requests.org/zh_CN/latest/user/advanced.html
你需要阅读下 “会话对象”,“准备的请求”,“请求和响应”这些内容,需要了解这个特点:
会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie,期间使用urllib3
的 connection pooling功能。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。
这有一个好处,大大节约了性能。因为,每次发送HTTP请求,tcp连接都需要经过三次握手。如果我们每个请求都需要连接一次,握手三次,然后断开。那么这个测试大量接口用例的时候,就会变得很慢很慢,效率很低。
2. Session发送请求,底层实现原理
在一个Session对象下,session负责代理,超时和一些验证的设置。然后我们把请求的body,headers ,auth封装在一个PreparedRequest对象里,通过session对象,执行send()方法,把准备请求对象给发送出去,这样我们就得到了相应对象,一个response主要有text和json方法。也就是显示相应主体内容的根据不同格式去显示或者打印出来。
3. 根据这个原理,举例一个自定义请求
import jsonimport requestsfrom requests import exceptionsURL = 'https://api.github.com'def build_uri(endpoint): return '/'.join([URL, endpoint])def better_output(json_str): return json.dumps(json.loads(json_str), indent=4)def custom_request(): from requests import Request, Session s = Session() # 初始化一个session headers = {'User-Agent':'fake1.3.4'} # fake是伪装的意思,就是设置一个假的 request = Request('GET', build_uri('user/emails'), auth=('xxxxx','xxxxxx'), headers=headers) prepped = request.prepare() #初始化一个prepare对象,用来包装请求的headers和body print(prepped.body) # 打印出来应该是空,毕竟目前还没有发送请求 print(prepped.headers) response = s.send(prepped, timeout=5) # 通过session对象调用发送请求,内容是prepped包装好的请求 print(response.status_code) print(response.headers) print(response.text)if __name__ == '__main__': custom_request()运行结果
None{'User-Agent': 'fake1.3.4', 'Authorization': 'Basic QW50aG9ueWxpdTg2OmNhJGhjMHdB'}200{'Date': 'Tue, 29 Aug 2017 08:44:55 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '84', 'Server': 'GitHub.com', 'Status': '200 OK', 'X-RateLimit-Limit': '5000', 'X-RateLimit-Remaining': '4999', 'X-RateLimit-Reset': '1503999895', 'Cache-Control': 'private, max-age=60, s-maxage=60', 'Vary': 'Accept, Authorization, Cookie, X-GitHub-OTP, Accept-Encoding', 'ETag': '"64093aa6319014f3e0a3d4b785fce6dd"', 'X-GitHub-Media-Type': 'github.v3; format=json', 'Access-Control-Expose-Headers': 'ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval', 'Access-Control-Allow-Origin': '*', 'Content-Security-Policy': "default-src 'none'", 'Strict-Transport-Security': 'max-age=31536000; includeSubdomains; preload', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'deny', 'X-XSS-Protection': '1; mode=block', 'X-Runtime-rack': '0.060934', 'X-GitHub-Request-Id': '0FC7:2E7F1:92D36D:BBA2E7:59A52986'}[{"email":"axxxxxx@msn.com","primary":true,"verified":true,"visibility":"public"}]结果分析:
一开始输出body内容是空,因为我们只是准备了一个请求,还没有执行发送,可能没有响应内容。200表示请求成功,后面输出了响应头部信息和响应的text内容。
- requests库入门-11-自定义请求
- requests库入门-10-请求异常
- requests库入门-4-HTTP请求方法和用requests举例不带参数的请求
- requests库入门-5-带参数的请求类型
- requests库入门-6-Params参数请求举例
- requests库入门-7-json参数请求举例
- Requests库入门
- Requests库入门
- Requests库入门
- Requests库的入门
- Requests库入门
- Requests 库入门
- requests库入门-1-安装requests库
- Python网页请求库Requests
- requests入门
- 利用requests库post一张图片请求
- 爬虫:HTTP请求和requests库
- requests库的请求头部信息修改
- 7. Reverse Integer(反转整型) —— Java
- java八种基本数据类型
- 剑指offer(29)—最小的K个数
- 关于Edittext首位为0多种情况考虑
- WEB 输入校验正则表达式
- requests库入门-11-自定义请求
- 判断字符数组中是否所有的字符只出现了一次(左程云)非递归堆排序实现
- UGUI 学习笔记 2 静态字体
- poj 3616 Milking Time
- 软件测试——测试流程重要性
- LeetCode(38)--Count and Say
- hibernate_事务处理、session管理
- C# 后台分页
- 两分钟理解Android中PX、DP、SP的区别