Python requests 模块详解
requests 是 Python 中用于发送 HTTP 请求的强大库,常用于 爬取网页、访问 API、提交数据 等任务。它比 urllib 更加简单易用,并支持 自动处理 Cookies、Session、超时、SSL 证书验证等 功能。
在本指南中,我们将详细解析 requests 模块的 安装、基本用法、进阶功能、异常处理,并结合实际案例帮助你更好地掌握它。
1. 安装 requests
在使用 requests 之前,需要先安装它:
pip install requests
或者使用国内镜像:
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
安装成功后,可以在 Python 中导入:
import requests
2. 发送 HTTP 请求
requests 模块支持 GET、POST、PUT、DELETE 等 HTTP 方法。
2.1 发送 GET 请求
GET 方法用于从服务器获取数据:
import requests
url = "https://jsonplaceholder.typicode.com/posts/1"
response = requests.get(url)
print(response.status_code) # 输出 HTTP 状态码
print(response.text) # 输出响应内容
GET 请求的参数:
params = {"userId": 1}
response = requests.get("https://jsonplaceholder.typicode.com/posts", params=params)
print(response.url) # 输出最终 URL
请求 URL:
https://jsonplaceholder.typicode.com/posts?userId=1
2.2 发送 POST 请求
POST 方法用于提交数据,例如 表单提交、API 交互:
data = {"title": "foo", "body": "bar", "userId": 1}
response = requests.post("https://jsonplaceholder.typicode.com/posts", json=data)
print(response.status_code) # 201 表示成功创建
print(response.json()) # 解析 JSON 响应
提交表单数据:
data = {"username": "admin", "password": "123456"}
response = requests.post("https://httpbin.org/post", data=data)
print(response.json()) # 服务器返回的 JSON 数据
2.3 发送 PUT 请求
更新服务器上的资源:
update_data = {"title": "updated title"}
response = requests.put("https://jsonplaceholder.typicode.com/posts/1", json=update_data)
print(response.json())
2.4 发送 DELETE 请求
删除服务器上的资源:
response = requests.delete("https://jsonplaceholder.typicode.com/posts/1")
print(response.status_code) # 200 或 204 表示删除成功
3. 处理 HTTP 响应
3.1 获取 HTTP 响应信息
response = requests.get("https://jsonplaceholder.typicode.com/posts/1")
print(response.status_code) # HTTP 状态码
print(response.headers) # 服务器响应头信息
print(response.text) # 原始 HTML/JSON 响应
print(response.json()) # 解析 JSON 数据
3.2 常见 HTTP 状态码
| 状态码 | 含义 |
|---|---|
| 200 | 请求成功 |
| 201 | 资源创建成功(POST 请求) |
| 301 | 永久重定向 |
| 302 | 临时重定向 |
| 400 | 客户端请求错误 |
| 401 | 未授权访问 |
| 403 | 禁止访问 |
| 404 | 资源未找到 |
| 500 | 服务器内部错误 |
检查请求是否成功:
if response.status_code == 200:
print("请求成功")
elif response.status_code == 404:
print("资源不存在")
4. 处理 Cookies
4.1 获取 Cookies
response = requests.get("https://httpbin.org/cookies")
print(response.cookies) # 输出服务器返回的 Cookies
4.2 发送带 Cookies 的请求
cookies = {"session_id": "123456"}
response = requests.get("https://httpbin.org/cookies", cookies=cookies)
print(response.text)
5. 自定义请求头(Headers)
许多网站会检测 User-Agent,防止爬虫:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}
response = requests.get("https://www.example.com", headers=headers)
print(response.text)
6. 处理重定向
默认情况下,requests 会自动跟随 301/302 重定向:
response = requests.get("http://github.com", allow_redirects=True)
print(response.url) # 显示最终跳转后的 URL
禁止重定向:
response = requests.get("http://github.com", allow_redirects=False)
print(response.status_code) # 301 或 302
print(response.headers["Location"]) # 获取重定向目标地址
7. 代理(防止 IP 封禁)
使用代理可以绕过网站封禁:
proxies = {
"http": "http://your-proxy.com:8080",
"https": "https://your-proxy.com:8080",
}
response = requests.get("https://www.example.com", proxies=proxies)
print(response.text)
获取免费代理:免费代理 IP
8. 超时与异常处理
避免请求长时间挂起:
try:
response = requests.get("https://www.example.com", timeout=5)
print(response.status_code)
except requests.Timeout:
print("请求超时")
except requests.ConnectionError:
print("连接失败")
except requests.RequestException as e:
print(f"请求异常: {e}")
9. Session(模拟登录)
使用 requests.Session() 维持会话:
session = requests.Session()
# 先登录
login_data = {"username": "admin", "password": "123456"}
session.post("https://www.example.com/login", data=login_data)
# 访问需要登录的页面
response = session.get("https://www.example.com/dashboard")
print(response.text)
10. requests 在爬虫中的应用
10.1 获取网页 HTML
response = requests.get("https://www.example.com")
html = response.text
10.2 爬取 robots.txt
检查网站的爬取规则:
response = requests.get("https://www.example.com/robots.txt")
print(response.text)
10.3 避免被封
- 使用
User-Agent伪装浏览器 - 使用
Session维持会话 - 使用
proxies代理 IP - 限制请求频率(
time.sleep())
总结
| 功能 | 代码示例 |
|---|---|
发送 GET 请求 | requests.get(url) |
发送 POST 请求 | requests.post(url, data={}) |
| 自定义 Headers | requests.get(url, headers={}) |
| 处理 Cookies | requests.get(url, cookies={}) |
| 代理 | requests.get(url, proxies={}) |
| 超时 | requests.get(url, timeout=5) |
requests 是 Python 网络编程中最常用的库,适用于爬虫、API 调用、数据抓取等场景!