使用 requests 库进行 HTTP 请求

class requests

使用 requests 库进行 HTTP 请求的全面指南

Python 的 requests 库是一个功能强大且易于使用的 HTTP 库,它简化了与 web 服务的交互,广泛应用于 web 爬虫、API 调用、数据获取等方面。本文将详细介绍 requests 库的应用,并配以多个代码示例,帮助你掌握这个重要的工具。

1. 安装 requests

在开始使用 requests 库之前,首先需要安装它。如果你还没有安装,可以通过以下命令进行安装:

pip install requests

2. 发送 GET 请求

GET 请求是最常见的 HTTP 请求,用于从服务器获取数据。下面是一个简单的示例:

import requests

response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.status_code)  # 查看响应状态码
print(response.json())  # 获取响应内容(JSON 格式)

在这个示例中,requests.get() 用于向指定的 URL 发送 GET 请求,并返回一个 Response 对象。通过 response.status_code 可以查看请求是否成功,使用 response.json() 可以将响应内容解析为 Python 字典。

3. 发送 POST 请求

POST 请求通常用于向服务器发送数据,比如提交表单或上传文件。以下示例展示了如何使用 requests 发送 POST 请求:

import requests

url = 'https://jsonplaceholder.typicode.com/posts'
data = {
    'title': 'foo',
    'body': 'bar',
    'userId': 1
}

response = requests.post(url, json=data)
print(response.status_code)
print(response.json())

在这个示例中,requests.post() 用于发送 POST 请求。我们通过 json 参数发送 JSON 数据,requests 库会自动将其转换为 JSON 格式并设置合适的 Content-Type 头。

4. 添加请求头

有时需要在请求中包含特定的 HTTP 头信息,比如 User-Agent 或 Authorization 头。你可以通过 headers 参数添加请求头:

import requests

url = 'https://httpbin.org/get'
headers = {
    'User-Agent': 'my-app/0.0.1',
    'Authorization': 'Bearer my_token'
}

response = requests.get(url, headers=headers)
print(response.status_code)
print(response.json())

5. 发送带有查询参数的请求

查询参数用于在 URL 中传递数据。例如,发送带有查询参数的 GET 请求:

import requests

url = 'https://jsonplaceholder.typicode.com/posts'
params = {'userId': 1}

response = requests.get(url, params=params)
print(response.status_code)
print(response.json())

在这个例子中,params 参数用于传递查询参数,requests 库会将它们自动编码为 URL 的一部分。

6. 处理响应内容

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

  • 纯文本response.text 返回字符串形式的响应内容。
  • JSONresponse.json() 将响应内容解析为 JSON 格式(如果响应内容是有效的 JSON)。
  • 二进制数据response.content 返回二进制形式的响应内容。
import requests

response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.text)  # 返回纯文本
print(response.json())  # 返回 JSON 数据

7. 文件上传

requests 还支持文件上传。可以使用 files 参数上传文件:

import requests

url = 'https://httpbin.org/post'
files = {'file': open('test.txt', 'rb')}

response = requests.post(url, files=files)
print(response.status_code)
print(response.json())

8. 会话管理

使用 requests.Session() 可以维持会话,保持一些参数在多次请求之间的一致性(如 cookies 和 headers):

import requests

session = requests.Session()
session.headers.update({'Authorization': 'Bearer my_token'})

# 第一次请求
response = session.get('https://httpbin.org/get')
print(response.json())

# 第二次请求,仍然使用同样的会话和 headers
response = session.get('https://httpbin.org/headers')
print(response.json())

9. 超时与重试

请求可能因为网络问题或服务器响应缓慢而超时。你可以使用 timeout 参数设置超时时间,使用 requests.adapters 处理重试逻辑:

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

# 设置重试策略
retry_strategy = Retry(
    total=3,
    backoff_factor=1,
    status_forcelist=[429, 500, 502, 503, 504],
    method_whitelist=["HEAD", "GET", "OPTIONS"]
)

adapter = HTTPAdapter(max_retries=retry_strategy)
session = requests.Session()
session.mount("https://", adapter)

try:
    response = session.get('https://httpbin.org/delay/5', timeout=3)
    print(response.status_code)
except requests.exceptions.Timeout:
    print('请求超时')

10. 处理错误与异常

在处理 HTTP 请求时,你可能会遇到各种错误。requests 提供了一些异常来帮助你处理这些错误:

import requests

try:
    response = requests.get('https://httpbin.org/status/404')
    response.raise_for_status()  # 如果响应状态码不是 200,抛出 HTTPError 异常
except requests.exceptions.HTTPError as err:
    print(f'HTTP 错误: {err}')
except requests.exceptions.ConnectionError as err:
    print(f'连接错误: {err}')
except requests.exceptions.Timeout as err:
    print(f'请求超时: {err}')
except requests.exceptions.RequestException as err:
    print(f'请求错误: {err}')

11. 持久化 Cookies

requests 可以自动处理 Cookies,并在后续请求中发送它们:

import requests

session = requests.Session()

# 第一次请求,获取并存储 Cookies
response = session.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
print(response.text)

# 第二次请求,自动发送之前存储的 Cookies
response = session.get('https://httpbin.org/cookies')
print(response.text)

12. 代理支持

有时你需要通过代理服务器发送请求,可以使用 proxies 参数设置代理:

import requests

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

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

结论

requests 是一个功能强大的 HTTP 库,适用于各种网络请求场景。无论是发送简单的 GET 请求,还是处理复杂的文件上传、会话管理、重试策略,requests 都提供了丰富的功能来满足你的需求。通过本文的介绍,相信你已经掌握了使用 requests 库进行 HTTP 请求的各个方面,并可以在实际项目中应用这些知识。

评论区
评论列表
menu