目录
- 准备工作:安装
requests - 核心概念:发送第一个请求
- GET 请求详解
- 传递 URL 参数
- 获取响应内容
- 处理响应头和状态码
- POST 请求详解
- 发送表单数据
- 发送 JSON 数据
- 高级用法
- 设置请求头
- 处理会话
- 上传文件
- 超时与重试
- 最佳实践与错误处理
- 使用
try...except捕获异常 - 使用
Session对象 - 查看文档
- 使用
准备工作:安装 requests
requests 是一个第三方库,不是 Python 自带的,在使用之前,你需要先安装它。

打开你的终端或命令行工具,运行以下命令:
pip install requests
核心概念:发送第一个请求
requests 的 API 非常简洁,最核心的功能就是 requests.get()、requests.post() 等方法。
让我们从一个最简单的 GET 请求开始,访问 httpbin.org,这是一个专门为测试 HTTP 请求而设计的网站。
import requests
# 1. 指定要请求的 URL
url = 'https://httpbin.org/get'
# 2. 发送 GET 请求
# requests.get() 会返回一个 Response 对象
response = requests.get(url)
# 3. 检查请求是否成功
# HTTP 状态码 200 表示成功
if response.status_code == 200:
print("请求成功!")
# 4. 打印响应内容
# response.text 是响应体的文本内容
print("响应内容:")
print(response.text)
else:
print(f"请求失败,状态码: {response.status_code}")
运行这段代码,你会看到服务器返回的 JSON 格式的数据,其中包含了关于你这次请求的详细信息(IP 地址、请求头等)。

GET 请求详解
GET 请求通常用于从服务器获取数据。
传递 URL 参数
当需要向 URL 添加查询参数时(https://example.com/search?q=python&page=1),直接拼接字符串很容易出错。requests 提供了更安全、方便的方式。
import requests
# 目标 URL
base_url = 'https://httpbin.org/get'
# 参数字典
params = {
'q': 'python requests',
'page': 1,
'sort': 'desc'
}
# 发送带参数的 GET 请求
# requests.get 会自动将 params 字典编码成 URL 查询字符串
response = requests.get(base_url, params=params)
# 检查响应
if response.status_code == 200:
print("带参数的请求成功!")
# 你可以看到最终的 URL 已经包含了查询参数
print(f"请求的 URL: {response.url}")
print("响应内容中的 args 字段:")
# .json() 方法会将响应内容解析为 Python 字典
print(response.json()['args'])
Response 对象提供了多种方式来获取响应体:
response.text: 以字符串形式返回响应内容。requests会根据HTTP头部Content-Type自动解码。response.content: 以字节形式返回响应内容,适合处理非文本数据,如图片、音频等。response.json(): 如果响应内容是 JSON 格式,这个方法会将其解析为 Python 的字典或列表,如果解析失败会抛出JSONDecodeError。
import requests
url = 'https://httpbin.org/json'
response = requests.get(url)
if response.status_code == 200:
# 使用 .json() 直接获取 Python 字典
data = response.json()
print(f"解析后的 JSON 数据: {data}")
print(f"作者: {data['slideshow']['author']}")
处理响应头和状态码
import requests
url = 'https://httpbin.org/get'
response = requests.get(url)
# 获取状态码
print(f"状态码: {response.status_code}")
# 获取响应头
print("\n响应头:")
print(response.headers)
# 获取特定的响应头
# 注意:响应头不区分大小写,'Content-Type' 和 'content-type' 都可以
content_type = response.headers.get('Content-Type')
print(f"\nContent-Type: {content_type}")
POST 请求详解
POST 请求通常用于向服务器提交数据,比如提交表单、上传数据等。

发送表单数据
当提交 HTML 表单时,数据格式是 application/x-www-form-urlencoded。requests 会帮你自动编码。
import requests
url = 'https://httpbin.org/post'
# 表单数据,一个字典
payload = {
'username': 'testuser',
'password': '123456'
}
# 发送 POST 请求,data 参数用于表单数据
response = requests.post(url, data=payload)
if response.status_code == 200:
print("表单数据 POST 成功!")
# 在返回的 JSON 中,form 字段包含了我们提交的数据
print("服务器收到的表单数据:")
print(response.json()['form'])
发送 JSON 数据
在与现代 Web API 交互时,通常需要发送 JSON 格式的数据。
import requests
import json # 虽然requests会处理,但显式导入json是好的习惯
url = 'https://httpbin.org/post'
# JSON 数据,一个字典
json_payload = {
'name': 'John Doe',
'age': 30,
'is_student': False
}
# 发送 POST 请求,json 参数会自动将字典序列化为 JSON 字符串,
# 并设置正确的 Content-Type 头为 'application/json'
response = requests.post(url, json=json_payload)
if response.status_code == 200:
print("JSON 数据 POST 成功!")
# 在返回的 JSON 中,json 字段包含了我们提交的数据
print("服务器收到的 JSON 数据:")
print(response.json()['json'])
高级用法
设置请求头
有些网站需要特定的请求头才能正常访问,User-Agent。
import requests
url = 'https://httpbin.org/get'
# 自定义请求头
headers = {
'User-Agent': 'MyCoolApp/1.0',
'Accept-Language': 'en-US,en;q=0.9'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
print("带自定义请求头的请求成功!")
# 查看请求头
print("服务器收到的请求头:")
print(response.json()['headers'])
处理会话
Session 对象可以让你在多个请求之间保持某些参数,cookies,它会自动处理 cookies,就像浏览器一样。
import requests
# 1. 创建一个 Session 对象
session = requests.Session()
# 2. 为这个 Session 设置通用参数(比如请求头)
session.headers.update({'User-Agent': 'MyApp/Session'})
# 3. 第一次请求,可能服务器会设置一个 cookie
login_url = 'https://httpbin.org/cookies/set' # 这个 URL 会设置一个 cookie
response = session.get(login_url + '/session/cookie?freeform=yes')
print("第一次请求后,Session 的 cookies:")
print(session.cookies.get_dict())
# 4. 第二次请求,Session 会自动带上之前设置的 cookie
profile_url = 'https://httpbin.org/cookies'
response = session.get(profile_url)
print("\n第二次请求的响应(可以看到 cookie 仍然有效):")
print(response.json())
上传文件
使用 files 参数可以轻松上传文件。
import requests
url = 'https://httpbin.org/post'
# 准备要上传的文件
# 'file' 是表单中文件输入框的 name
# 'rb' 表示以二进制模式读取文件
files = {
'file': ('report.txt', open('report.txt', 'rb'), 'text/plain')
}
# 发送 POST 请求
response = requests.post(url, files=files)
if response.status_code == 200:
print("文件上传成功!")
print("文件信息:")
print(response.json()['files'])
(请确保你的目录下有一个名为 report.txt 的文件)
超时与重试
为了避免程序因为网络问题而无限等待,应该设置超时时间。
import requests
try:
# timeout 参数可以是单个数字(连接+读取超时),也可以是元组(连接超时, 读取超时)
# 这里设置 3 秒内连接,5 秒内读取完成
response = requests.get('https://httpbin.org/get', timeout=(3.05, 5))
response.raise_for_status() # 如果状态码不是 2xx,则抛出 HTTPError
print("请求成功!")
except requests.exceptions.Timeout:
print("请求超时!")
except requests.exceptions.RequestException as e:
# 捕获所有 requests 相关的异常
print(f"发生请求错误: {e}")
最佳实践与错误处理
使用 try...except 捕获异常
网络请求是不可靠的,可能会因为各种原因失败(DNS 解析失败、连接超时、服务器错误等),使用 try...except 块是必不可少的。
import requests
from requests.exceptions import RequestException, HTTPError, Timeout
url = 'https://httpbin.org/status/404' # 这个 URL 会返回 404 Not Found
try:
response = requests.get(url, timeout=5)
# 如果状态码表示错误 (4xx or 5xx),则 raise_for_status() 会抛出 HTTPError
response.raise_for_status()
print("请求成功,状态码:", response.status_code)
except HTTPError as http_err:
print(f"HTTP 错误发生: {http_err}")
# 可以在这里处理特定的 HTTP 错误,比如重定向或认证问题
except Timeout as timeout_err:
print(f"请求超时: {timeout_err}")
except RequestException as req_err:
# 这是一个通用的异常类,可以捕获所有 requests 相关的错误
print(f"请求发生错误: {req_err}")
使用 Session 对象
如前所述,对于需要保持 cookies 或 headers 的场景,或者需要向同一主机发送多个请求时,使用 Session 对象是更高效、更方便的选择。
查看文档
requests 的文档非常出色,当你遇到问题时,最好的参考就是官方文档。
官方文档: https://requests.readthedocs.io/
希望这份详细的指南能帮助你掌握 Python requests 库!
