Python Requests 库使用教程

Requests 是一个优雅而简单的 Python HTTP 库,专为人类使用而设计。相比 Python 内置的 urllib 模块,Requests 提供了更简洁、更人性化的 API,让 HTTP 请求变得轻而易举。

安装 Requests

Requests 可以通过 pip 轻松安装:

pip install requests

如果你使用的是 Anaconda 发行版,Requests 已经预装了。如果遇到权限问题,可以尝试:

pip install --user requests
# 或者
sudo pip install requests

基本 GET 请求

简单请求

import requests

# 发送 GET 请求
response = requests.get('https://www.example.com/')

# 查看响应状态码
print(response.status_code)  # 200 表示成功

# 查看响应内容(自动解码)
print(response.text)

带参数的 GET 请求

params = {'q': 'python', 'page': 1}
response = requests.get('https://www.example.com/search', params=params)

# 查看实际请求的 URL
print(response.url)
# 输出: https://www.example.com/search?q=python&page=1

响应处理

Requests 提供了多种方式处理响应内容:

# 获取字节内容(原始响应)
content = response.content

# 获取文本内容(自动解码)
text = response.text

# 获取 JSON 响应(自动解析)
data = response.json()

# 查看响应编码
print(response.encoding)  # 通常为 'utf-8'

# 手动设置编码
response.encoding = 'utf-8'

请求头设置

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
    'Accept': 'application/json'
}

response = requests.get('https://api.example.com/data', headers=headers)

POST 请求

表单数据

data = {'username': 'admin', 'password': 'secret'}
response = requests.post('https://example.com/login', data=data)

JSON 数据

json_data = {'key': 'value'}
response = requests.post('https://api.example.com/data', json=json_data)

文件上传

files = {'file': open('report.pdf', 'rb')}  # 注意使用二进制模式
response = requests.post('https://example.com/upload', files=files)

其他 HTTP 方法

# PUT 请求
response = requests.put('https://api.example.com/item/1', data={'name': 'new'})

# DELETE 请求
response = requests.delete('https://api.example.com/item/1')

# HEAD 请求
response = requests.head('https://www.example.com')

# OPTIONS 请求
response = requests.options('https://api.example.com')

响应头与 Cookies

# 获取响应头
print(response.headers)
print(response.headers['Content-Type'])

# 获取 Cookies
print(response.cookies)
print(response.cookies['session_id'])

# 发送 Cookies
cookies = {'session_id': '12345'}
response = requests.get('https://example.com', cookies=cookies)

超时设置

# 设置超时时间为 3 秒
try:
    response = requests.get('https://example.com', timeout=3)
except requests.exceptions.Timeout:
    print("请求超时")

会话对象

使用 Session 对象可以保持某些参数跨请求:

session = requests.Session()

# 设置会话级别的参数
session.headers.update({'User-Agent': 'MyApp/1.0'})

# 所有使用该会话的请求都会携带这些参数
response1 = session.get('https://api.example.com/endpoint1')
response2 = session.get('https://api.example.com/endpoint2')

高级功能

重定向控制

# 禁止重定向
response = requests.get('https://example.com', allow_redirects=False)

# 查看重定向历史
print(response.history)

代理设置

proxies = {
    'http': 'http://10.10.1.10:3128',
    'https': 'http://10.10.1.10:1080',
}

response = requests.get('https://example.com', proxies=proxies)

证书验证

# 禁用 SSL 验证(不推荐用于生产环境)
response = requests.get('https://example.com', verify=False)

# 指定自定义 CA 证书
response = requests.get('https://example.com', verify='/path/to/cert.pem')

错误处理

try:
    response = requests.get('https://example.com', timeout=5)
    response.raise_for_status()  # 如果状态码不是 200,会抛出 HTTPError 异常
except requests.exceptions.HTTPError as errh:
    print(f"HTTP 错误: {errh}")
except requests.exceptions.ConnectionError as errc:
    print(f"连接错误: {errc}")
except requests.exceptions.Timeout as errt:
    print(f"超时错误: {errt}")
except requests.exceptions.RequestException as err:
    print(f"请求异常: {err}")

性能优化

流式请求

对于大文件下载,可以使用流式请求:

response = requests.get('https://example.com/large-file.zip', stream=True)
with open('large-file.zip', 'wb') as fd:
    for chunk in response.iter_content(chunk_size=128):
        fd.write(chunk)

连接池

Requests 默认使用 urllib3 的连接池,可以通过 Session 对象优化:

session = requests.Session()
adapter = requests.adapters.HTTPAdapter(
    pool_connections=10,  # 连接池大小
    pool_maxsize=10,      # 最大连接数
    max_retries=3         # 重试次数
)
session.mount('https://', adapter)

总结

Requests 库极大地简化了 Python 中的 HTTP 请求操作,提供了:

  • 简洁直观的 API
  • 自动内容解码
  • 内置 JSON 支持
  • 会话保持
  • 连接池管理
  • 完善的错误处理

通过本教程,你已经掌握了 Requests 库的核心功能,可以轻松地在项目中实现各种 HTTP 交互需求。