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 请求变得非常容易。以上是基本用法,更多高级特性(如文件上传、流式请求、会话保持,认证等)非常的方便。