当前位置: 首页 > news >正文

python之requests库解析

Python requests 库全面解析

requests 是 Python 中最受欢迎的 HTTP 客户端库,以其简洁优雅的 API 设计著称。有以上使用场景:

1. API交互:与RESTful API进行交互,如获取、创建、更新或删除资源。例如:
- 从Twitter API获取推文
- 发送消息到Slack
- 调用Google Maps API进行地理编码
2. 网页抓取(Web Scraping):虽然通常与BeautifulSoup、lxml等解析库配合使用,但Requests负责获取网页内容。例如:
- 下载整个网页内容
- 获取JSON格式的动态加载数据(通过XHR请求)
3. 自动化测试:对Web服务进行自动化测试,验证API端点是否按预期工作。
4. 文件下载:下载网络资源,如图片、PDF、视频等。支持大文件流式下载。
5. 提交表单数据:模拟浏览器表单提交,如登录网站、提交数据到服务器。
6. Web服务监控:定期发送请求检查网站或服务的可用性。
7. 数据采集:从多个来源收集数据,如聚合新闻、价格比较等。
8. 身份验证和授权:处理需要认证的请求,如OAuth、基本认证等。
9. 代理和隧道:通过代理服务器发送请求,用于访问受限资源或隐藏真实IP。
10. 会话保持:使用Session对象维持会话状态,处理需要登录的网站。
11. SSL证书验证:在安全通信中验证服务器证书,或跳过验证(不推荐)。
12. 设置请求头:自定义User-Agent、Referer等请求头,模拟浏览器行为。
13. 处理Cookie:自动管理Cookie,或手动设置Cookie。
14. 流式上传:上传大文件而无需一次性读入内存。
15. 性能监控:通过钩子函数监控请求响应时间、重定向次数等。
16. 模拟浏览器行为:结合其他库(如Selenium)完成复杂交互,但Requests本身适合无JavaScript的简单交互。
17. 构建网络爬虫框架:作为底层HTTP引擎,被Scrapy等框架使用(虽然Scrapy有自己的实现,但Requests常用于小规模爬虫)。
18. 与云服务交互:如使用AWS S3、Azure Blob存储的API。
19. 发送带附件的邮件:通过邮件服务的API发送邮件。
20. 物联网(IoT):设备通过HTTP协议上报数据到服务器。
每个场景下,Requests的简洁性都体现在:
- 直观的HTTP方法(get, post, put, delete等)
- 简单的参数传递(params, data, json, headers等)
- 自动处理编码、解码
- 方便的响应处理方法(text, content, json()等)
注意:对于需要JavaScript渲染的网页,Requests无法直接处理(因为它不执行JS),此时需使用Selenium、Playwright等工具。

1.安装与基本使用

python
# 安装
pip install requests# 基本 GET 请求
import requests
response = requests.get('https://api.example.com/data')
print(response.status_code)  # 200
print(response.text)        # 响应内容

 2.各种http请求方法

# GET 请求
response = requests.get('https://httpbin.org/get')# POST 请求
payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://httpbin.org/post', data=payload)# PUT 请求
response = requests.put('https://httpbin.org/put', data={'key': 'value'})# DELETE 请求
response = requests.delete('https://httpbin.org/delete')# HEAD 请求
response = requests.head('https://httpbin.org/headers')# OPTIONS 请求
response = requests.options('https://httpbin.org')

其中get请求和post请求最为常见

3. 参数传递

URL 参数

以字典格式,传入params参数,

params = {'search': 'python', 'page': 2}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url)  # https://httpbin.org/get?search=python&page=2

 表单数据

以字典格式,传入data参数,为post请求

data = {'username': 'admin', 'password': 'secret'}
response = requests.post('https://httpbin.org/post', data=data)

 JSON 数据

以字典格式,传入json参数,为post请求

json_data = {'name': 'Alice', 'age': 30}
response = requests.post('https://httpbin.org/post', json=json_data)

 文件上传

某些 API 可能需要从客户端接收文件作为输入数据。

files = {'file': open('report.xls', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)

4.响应处理

响应数据,文本或者json提取数据,二进制则下载文件,响应体看作为参数传入下一个请求中(逆向),url可以判断或者拼接等等。

response = requests.get('https://api.example.com/data')# 响应内容
print(response.text)          # 文本内容
print(response.content)       # 二进制内容
print(response.json())        # JSON 响应解析为字典# 响应头
print(response.headers)
print(response.headers['Content-Type'])# 状态码
print(response.status_code)
response.raise_for_status()   # 如果状态码不是200,抛出异常# 响应URL
print(response.url)# 响应历史(重定向)
print(response.history)

 5.请求头定制

有些基本的反爬就是效验请求头,所以要更可能的模拟浏览器环境,难一点就是对请求头进行加密(逆向)

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)','Accept': 'application/json','Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
response = requests.get('https://api.example.com', headers=headers)

6. Cookie 管理

一般cookies也跟请求头一样,效验cookies,对cookies加密等,还有一个重要的事,cookies包含登录信息,比如网站要登录,一个账号有vip,那就可以采集vip信息,另一个账号没vip,就采集不了。

# 发送 Cookies
cookies = dict(key1='value1', key2='value2')
response = requests.get('https://httpbin.org/cookies', cookies=cookies)# 接收 Cookies
response = requests.get('https://example.com')
print(response.cookies)
print(response.cookies['session_id'])# 会话对象保持 Cookies
session = requests.Session()
session.get('https://example.com/login', params={'user': 'admin', 'pass': 'secret'})
response = session.get('https://example.com/dashboard')  # 保持登录状态

 7.超时设置

这个很重要的。有个网站响应半天都没有响应结果,如果你对一连串网站进行调度爬虫,有些网站根本响应不了,又报不了错,这时这个调度的位置占着茅坑不拉屎,很大程度影响了爬虫性能。所以可以用超时设置。

# 连接超时和读取超时
try:response = requests.get('https://api.example.com', timeout=(3.05, 27))
except requests.exceptions.Timeout:print("请求超时")

8. 代理设置

添加代理主要是有些网站本地ip访问不了,换代理ip就可以去请求该网站。或者说一些网站采集频繁会封ip,这时只能用多ip对该网站进行爬取。每次爬取用不同ip,基本就能完整采集数据。

proxies = {'http': 'http://10.10.1.10:3128','https': 'http://10.10.1.10:1080',
}
response = requests.get('https://api.example.com', proxies=proxies)# 需要认证的代理
proxies = {'https': 'http://user:pass@10.10.1.10:3128/'}

9. SSL 证书验证

一些网站请求会报SSL错误,添加 verify=False即可解决。如果解决不了http变成https或者https变为http。

# 禁用证书验证(不推荐用于生产环境)
response = requests.get('https://api.example.com', verify=False)# 使用自定义 CA 包
response = requests.get('https://api.example.com', verify='/path/to/cert.pem')# 客户端证书
response = requests.get('https://api.example.com', cert=('/path/client.cert', '/path/client.key'))

10.会话保持

每次请求时,都会携带上一次请求的cookies

# 复用Cookies/连接s = requests.Session()response = s.get('https://api.example.com/dashboard')  # 保持登录状态response2 = s.get('https://api.example2.com/dashboard')  # 保持登录状态

11.错误处理

try:response = requests.get(url, timeout=5)response.raise_for_status()  # 自动抛出4xx/5xx错误
except requests.exceptions.Timeout:print("请求超时")
except requests.exceptions.HTTPError as err:print(f"HTTP错误: {err}")
except requests.exceptions.RequestException as err:print(f"请求异常: {err}")

12.简单封装一下requests 的类

import requestsclass req_obj():def __init__(self):self.headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0"}self.session = requests.Session()def get_content(self, url,headers=None,method='GET',data=None,json = None,proxy=None,cookies=None):headers = headers or self.headersif method=='GET':return self.session.get(url,headers=headers,proxies=proxy,cookies =cookies).textif method=='POST':if data:return self.session.post(url,headers=headers,data=data,proxies=proxy,cookies =cookies).json()if json:return self.session.post(url,headers=headers,json=json,proxies=proxy,cookies =cookies).json()def get_cookies(self):cookies = self.session.cookies.get_dict()return cookiesdef get_headers(self):res_headers = self.session.headersreturn res_headersdef download_file(self,url,headers=None):headers = headers or self.headersreturn self.session.get(url,headers=headers).content

有get请求,post请求,获取网页html,获取json数据,获取字节流,获取响应头,获取cookies等等。

总结

requests 库提供了简洁而强大的接口,使得发送 HTTP 请求变得非常容易。以上是基本用法,更多高级特性(如文件上传、流式请求、会话保持,认证等)非常的方便。

http://www.dtcms.com/a/271062.html

相关文章:

  • 1️⃣理解大语言模型
  • 【时时三省】(C语言基础)通过指针引用数组
  • 阿里开源WebSailor:超越闭源模型的网络智能体新星
  • 疏锦行Python打卡 DAY 54 Inception网络及其思考
  • HTML + CSS + JavaScript
  • 字体 Unicode 区块字符展示 PDF 生成器
  • Ubuntu重装系统后ssh连接不上(遇到 ​​“Unit ssh.service not found“​​ 错误)
  • kubernetes存储入门
  • Spring Boot + Vue.js 全栈开发:从前后端分离到高效部署,打造你的MVP利器!
  • 【05】MFC入门到精通——MFC 为对话框中的控件添加变量 和 数据交换和检验
  • 【01】MFC入门到精通—— MFC新建基于对话框的项目 介绍(工作界面、资源视图 、类视图)
  • Flink-1.19.0源码详解6-JobGraph生成-后篇
  • AJAX总结
  • Flink1.20.1集成Paimon遇到的问题
  • Electron 应用打包全指南
  • 机器学习模型在C++平台的部署
  • 基于 Redis 实现高并发滑动窗口限流:Java实战与深度解析
  • 开始读 PostgreSQL 16 Administration Cookbook
  • 深度学习 最简单的神经网络 线性回归网络
  • ArtifactsBench: 弥合LLM 代码生成评估中的视觉交互差距
  • 论文解析篇 | YOLOv12:以注意力机制为核心的实时目标检测算法
  • 腾讯云COS,阿里云OSS对象存储服务-删除操作的响应码204
  • 汽车智能化2.0引爆「万亿蛋糕」,谁在改写游戏规则?
  • 通用游戏前端架构设计思考
  • VSCode配置Cline插件调用MCP服务实现任务自动化
  • 旅游管理实训室建设的关键要点探讨
  • 向量空间 线性代数
  • 软件测试偏技术方向学习路线是怎样的?
  • 安装nvm管理node.js,详细安装使用教程和详细命令
  • Spring Boot微服务中集成gRPC实践经验分享