Python Requests 库使用教程

1. 简介

Requests 是一个优雅而简单的 Python HTTP 库,比 Python 内置的 urllib 库更易用。它支持 HTTP 连接保持和连接池、Cookie 持久化、自动内容解码、文件分块上传、连接超时等特性。

2. 安装

使用 pip 安装:

pip install requests

3. 基本用法

发送 GET 请求

import requests

response = requests.get('https://httpbin.org/get')
print(response.text)

发送 POST 请求

data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())

其他 HTTP 方法

requests.put('https://httpbin.org/put', data={'key': 'value'})
requests.delete('https://httpbin.org/delete')
requests.head('https://httpbin.org/get')
requests.options('https://httpbin.org/get')

4. 请求参数

传递 URL 参数

payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=payload)
print(response.url)  # https://httpbin.org/get?key1=value1&key2=value2

自定义请求头

headers = {'user-agent': 'my-app/0.0.1'}
response = requests.get('https://httpbin.org/get', headers=headers)

发送 JSON 数据

import json

url = 'https://httpbin.org/post'
data = {'key': 'value'}
response = requests.post(url, json=data)

5. 响应处理

响应内容

response = requests.get('https://httpbin.org/get')

# 文本响应内容
print(response.text)

# 二进制响应内容
print(response.content)

# JSON 响应内容
print(response.json())

响应状态码

response = requests.get('https://httpbin.org/get')
print(response.status_code)  # 200

# 状态码判断
if response.status_code == requests.codes.ok:
    print('请求成功')

响应头

response = requests.get('https://httpbin.org/get')
print(response.headers)

6. 高级功能

会话对象

s = requests.Session()

# 设置会话级别的参数
s.headers.update({'x-test': 'true'})

# 会话中所有请求都会携带 x-test 头
response = s.get('https://httpbin.org/headers')
print(response.json())

SSL 验证

# 禁用 SSL 验证
requests.get('https://httpbin.org/get', verify=False)

# 指定 CA 证书
requests.get('https://httpbin.org/get', verify='/path/to/cert.pem')

超时设置

# 连接和读取超时
requests.get('https://httpbin.org/get', timeout=(3.05, 27))

# 总超时
requests.get('https://httpbin.org/get', timeout=5)

代理设置

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

requests.get('https://httpbin.org/get', proxies=proxies)

认证

# 基本认证
requests.get('https://httpbin.org/basic-auth/user/pass', auth=('user', 'pass'))

# OAuth1 认证
from requests_oauthlib import OAuth1

url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
auth = OAuth1('YOUR_APP_KEY', 'YOUR_APP_SECRET',
              'USER_OAUTH_TOKEN', 'USER_OAUTH_TOKEN_SECRET')
requests.get(url, auth=auth)

文件上传

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

流式请求

response = requests.get('https://httpbin.org/stream/20', stream=True)

for line in response.iter_lines():
    if line:
        print(line.decode('utf-8'))

7. 错误处理

from requests.exceptions import RequestException

try:
    response = requests.get('https://httpbin.org/status/404')
    response.raise_for_status()  # 如果状态码不是 200,抛出异常
except RequestException as e:
    print(f'请求出错: {e}')

8. 性能优化

连接池

Requests 会自动保持连接池,使用 Session 对象可以复用 TCP 连接:

s = requests.Session()

for _ in range(10):
    s.get('https://httpbin.org/get')

流式下载大文件

url = 'https://example.com/large-file.zip'
response = requests.get(url, stream=True)

with open('large-file.zip', 'wb') as f:
    for chunk in response.iter_content(chunk_size=8192):
        f.write(chunk)

9. 最佳实践

  1. 总是检查响应状态码
  2. 使用 Session 对象处理多个请求
  3. 设置合理的超时时间
  4. 处理可能发生的异常
  5. 使用流式处理大文件
  6. 考虑使用连接池提高性能
  7. 遵循目标网站的 robots.txt 规则

10. 总结

Requests 库简化了 Python 中的 HTTP 请求处理,提供了直观的 API 和强大的功能。无论是简单的 GET 请求还是复杂的认证、会话管理,Requests 都能优雅地处理。