requests 是 Python 中最流行、最优雅的 HTTP 库,它极大地简化了发送 HTTP 请求和处理响应的过程。

第一步:安装 requests 库
在使用之前,您需要先安装它,打开您的终端或命令行工具,运行以下命令:
pip install requests
第二步:基础实例(GET 请求)
GET 请求用于从服务器获取数据,这是最常见的请求类型。
示例 1:简单的 GET 请求
我们将向 httpbin.org 这个测试网站发送一个 GET 请求,它会返回我们请求的详细信息。
import requests
# 目标 URL
url = "https://httpbin.org/get"
try:
# 发送 GET 请求
response = requests.get(url)
# 检查请求是否成功 (状态码 200 表示成功)
response.raise_for_status() # 如果请求失败 (状态码不是 2xx),会抛出异常
# 打印响应内容
# response.text 是响应的文本内容
print("状态码:", response.status_code)
print("响应头:", response.headers)
print("响应内容 (JSON格式):")
# response.json() 会自动将 JSON 响应解析为 Python 字典
print(response.json())
except requests.exceptions.RequestException as e:
# 捕获所有与 requests 相关的异常
print(f"请求发生错误: {e}")
输出解释:
你会看到返回的 JSON 数据,其中包含了你的请求信息,args (查询参数), headers (请求头), origin (你的 IP 地址) 等。

第三步:带参数的 GET 请求
当您需要向 URL 添加查询参数时(?key1=value1&key2=value2),有几种方法。
示例 2:使用 params 字典(推荐)
这是最清晰、最不容易出错的方法。
import requests
# 目标 URL
url = "https://httpbin.org/get"
# 定义查询参数
params = {
'name': 'John Doe',
'age': 30,
'is_student': False
}
try:
# 发送 GET 请求,params 参数会自动处理 URL 编码
response = requests.get(url, params=params)
response.raise_for_status()
print("带参数的请求 URL:")
# response.url 会显示 requests 库实际请求的完整 URL
print(response.url)
print("\n响应内容中的 args 部分:")
# 我们可以看到参数被正确地添加到了请求中
print(response.json()['args'])
except requests.exceptions.RequestException as e:
print(f"请求发生错误: {e}")
第四步:POST 请求
POST 请求通常用于向服务器提交数据,例如提交表单、上传文件等。
示例 3:发送 JSON 数据
import requests
import json # 虽然requests会自动处理,但了解json模块是好的
# 目标 URL
url = "https://httpbin.org/post"
# 要发送的 JSON 数据 (Python 字典)
payload = {
'username': 'test_user',
'password': '123456',
'email': 'test@example.com'
}
try:
# 发送 POST 请求
# json=payload 会自动将字典序列化为 JSON 字符串,
# 并设置正确的请求头 'Content-Type: application/json'
response = requests.post(url, json=payload)
response.raise_for_status()
print("状态码:", response.status_code)
print("响应内容中的 form/data 部分:")
# httpbin.org 会将接收到的数据放在 'json' 或 'form' 或 'data' 字段中
# 因为我们发送的是 JSON,所以它在 'json' 字段里
print(response.json()['json'])
except requests.exceptions.RequestException as e:
print(f"请求发生错误: {e}")
示例 4:发送表单数据 (x-www-form-urlencoded)
import requests
# 目标 URL
url = "https://httpbin.org/post"
# 要发送的表单数据 (Python 字典)
form_data = {
'search_query': 'python tutorial',
'page': 1
}
try:
# 发送 POST 请求
# data=payload 会自动将数据编码为表单格式,
# 并设置正确的请求头 'Content-Type: application/x-www-form-urlencoded'
response = requests.post(url, data=form_data)
response.raise_for_status()
print("状态码:", response.status_code)
print("响应内容中的 form 部分:")
# 对于表单数据,httpbin.org 会将其放在 'form' 字段中
print(response.json()['form'])
except requests.exceptions.RequestException as e:
print(f"请求发生错误: {e}")
第五步:添加请求头
有时您需要自定义请求头,例如模拟浏览器访问、设置 User-Agent 或添加认证信息。

示例 5:自定义请求头
import requests
url = "https://httpbin.org/get"
# 自定义请求头
headers = {
'User-Agent': 'MyCoolApp/1.0 (by MyEmail@example.com)',
'Accept-Language': 'en-US,en;q=0.9',
'X-Custom-Header': 'This is a custom value'
}
try:
# 发送 GET 请求,并传入 headers
response = requests.get(url, headers=headers)
response.raise_for_status()
print("响应头中的 User-Agent:")
# httpbin.org 会将接收到的请求头返回给我们
print(response.json()['headers']['User-Agent'])
print("\n响应头中的 X-Custom-Header:")
print(response.json()['headers']['X-Custom-Header'])
except requests.exceptions.RequestException as e:
print(f"请求发生错误: {e}")
第六步:处理响应
requests 的响应对象 Response 提供了多种方式来访问内容:
response.status_code: HTTP 状态码 (如 200, 404, 500)。response.headers: 响应头,是一个类字典对象。response.text: 响应体的文本内容。response.content: 响应体的字节内容 (适合处理图片、文件等)。response.json(): 将响应体解析为 JSON 对象 (如果响应是有效的 JSON)。response.raise_for_status(): 如果状态码表示错误 (4xx or 5xx),则抛出HTTPError异常。
第七步:高级实例
示例 6:处理超时和重试
网络请求可能会失败,设置超时可以防止程序无限等待。
import requests
url = "https://httpbin.org/delay/5" # 这个 URL 会延迟 5 秒才响应
try:
# 设置超时时间为 3 秒
# 如果服务器在 3 秒内没有响应,会抛出 requests.exceptions.Timeout 异常
print("发送请求,超时设置为 3 秒...")
response = requests.get(url, timeout=3)
print("请求成功!")
except requests.exceptions.Timeout:
print("请求超时!")
except requests.exceptions.RequestException as e:
print(f"请求发生其他错误: {e}")
示例 7:处理会话 和 Cookies
Session 对象可以跨请求保持某些参数,Cookies,这对于需要登录的网站非常有用。
import requests
# 创建一个 Session 对象
session = requests.Session()
# 第一次请求:访问需要登录的页面 (这里用 httpbin.org/get 作为示例)
# 假设服务器在响应中设置了一个 Cookie
print("1. 发送初始请求...")
response1 = session.get("https://httpbin.org/get")
# 检查响应头中是否有 'set-cookie'
print("服务器是否设置了 Cookie?", 'set-cookie' in response1.headers)
# 第二次请求:使用同一个 Session 对象发送请求
# 这个请求会自动带上第一次请求时获取的 Cookie
print("\n2. 使用同一个 Session 发送第二次请求...")
response2 = session.get("https://httpbin.org/get")
# 检查第二次请求的请求头,可以看到 Cookie 已经被自动发送
print("第二次请求的 Cookie:", response2.request.headers.get('Cookie'))
# 关闭 Session
session.close()
示例 8:下载文件
下载文件时,使用 response.content 并以二进制模式写入文件是最高效的方式。
import requests
url = "https://httpbin.org/image/jpeg" # httpbin 提供的示例图片
file_path = "downloaded_image.jpg"
try:
print(f"开始下载文件: {url}")
response = requests.get(url, stream=True) # stream=True 启用流式下载
response.raise_for_status()
# 以二进制写入模式打开文件
with open(file_path, 'wb') as f:
# iter_content(chunk_size=8192) 可以分块写入,节省内存
for chunk in response.iter_content(chunk_size=8192):
if chunk: # 过滤掉保持连接的新块
f.write(chunk)
print(f"文件已成功保存到: {file_path}")
except requests.exceptions.RequestException as e:
print(f"下载文件时发生错误: {e}")
第八步:最佳实践和异常处理
一个健壮的网络请求程序应该能够处理各种异常。
import requests
from requests.exceptions import RequestException, HTTPError, ConnectionError, Timeout
def robust_request(url, method='GET', **kwargs):
"""
一个更健壮的请求函数,包含全面的异常处理。
"""
try:
print(f"正在发送 {method} 请求到 {url}...")
response = requests.request(method, url, **kwargs)
# 如果状态码表示错误,则抛出 HTTPError
response.raise_for_status()
print("请求成功!")
return response
except HTTPError as http_err:
print(f"HTTP 错误发生: {http_err}")
# 可以根据状态码进行不同处理
if response.status_code == 404:
print("资源未找到!")
elif response.status_code == 401:
print("未授权,请登录!")
except ConnectionError as conn_err:
print(f"连接错误发生: {conn_err}")
print("请检查您的网络连接或 URL 是否正确。")
except Timeout as timeout_err:
print(f"请求超时: {timeout_err}")
except RequestException as req_err:
# 捕获所有 requests 库可能抛出的其他异常
print(f"请求发生未知错误: {req_err}")
return None
# 使用示例
response = robust_request(
"https://httpbin.org/get",
params={'key': 'value'},
timeout=5
)
if response:
print("响应内容:", response.json())
| 功能 | 方法/代码示例 |
|---|---|
| 安装 | pip install requests |
| GET 请求 | requests.get(url) |
| 带参数 GET | requests.get(url, params={'key': 'value'}) |
| POST JSON | requests.post(url, json={'key': 'value'}) |
| POST 表单 | requests.post(url, data={'key': 'value'}) |
| 自定义请求头 | requests.get(url, headers={'User-Agent': '...'}) |
| 处理超时 | requests.get(url, timeout=10) |
| 保持会话/Cookie | s = requests.Session(); s.get(...); s.get(...) |
| 下载文件 | requests.get(url, stream=True); for chunk in response.iter_content(...) |
| 检查状态码 | response.status_code 或 response.raise_for_status() |
| 解析 JSON | response.json() |
希望这份详细的实例能帮助您完全掌握 Python requests 库的使用!
