requests 是什么?
requests 是一个用 Python 编写的、功能强大且设计优雅的 HTTP 库,它极大地简化了 Python 发送 HTTP 请求和处理响应的过程,相比于 Python 内置的 urllib 库,requests 的 API 更加简洁、直观,被称为“人类”使用的 HTTP 库。

为什么选择 requests?
- 简单易用:API 设计非常人性化,几行代码就能完成复杂的请求。
- 功能全面:支持 GET、POST、PUT、DELETE 等所有 HTTP 方法。
- 自动处理编码:能自动识别并处理响应内容的编码(特别是中文),省去了手动解码的麻烦。
- 支持会话:可以创建一个
Session对象来保持连接,实现 cookies 持久化。 - 强大的文件上传:可以轻松地模拟表单提交,上传文件。
- JSON 支持:内置了
response.json()方法,可以方便地将 JSON 响应解析为 Python 字典。
安装 requests
在使用之前,你需要先安装它,打开你的终端或命令行工具,运行以下命令:
pip install requests
核心功能与常用方法
requests 的所有功能都围绕 requests 这个核心模块展开,最基本的工作流程是:发起请求 -> 获取响应 -> 处理响应。
1 发起请求
requests 提供了多种方法来发起不同类型的 HTTP 请求,最常用的是 get() 和 post()。
示例:发起一个 GET 请求

import requests # 目标 URL url = 'https://www.httpbin.org/get' # 发送 GET 请求 response = requests.get(url) # 检查请求是否成功 (状态码为 200) response.raise_for_status() # 如果请求失败 (状态码不是 2xx),会抛出异常
2 处理响应
当请求发送后,你会得到一个 Response 对象,这个对象包含了服务器返回的所有信息。
Response 对象的重要属性:
response.status_code:HTTP 状态码,200 (成功), 404 (未找到), 500 (服务器错误)。response.text的字符串形式。requests会尝试根据 HTTP 头部自动解码。response.content的二进制形式。response.json():如果响应内容是 JSON 格式,这个方法会将其解析为 Python 字典。这是处理 JSON 数据的首选方法。response.headers:一个类字典对象,包含了响应的 HTTP 头部信息。response.url:最终请求的 URL(可能会因为重定向而改变)。response.cookies:一个RequestsCookieJar对象,包含了响应中的 cookies。
示例:获取并打印响应信息
import requests
url = 'https://www.httpbin.org/get'
response = requests.get(url)
# 1. 打印状态码
print(f"状态码: {response.status_code}")
# 2. 打印响应头
print("\n响应头:")
print(response.headers)
# 3. 打印 URL
print(f"\n请求的 URL: {response.url}")
# 4. 打印响应文本 (对于 httpbin.org/get,返回的是 JSON)
# requests 会自动处理编码,response.text 是正确的字符串
print("\n响应文本 (部分):")
print(response.text[:200] + "...") # 只打印前200个字符,避免输出过长
# 5. 如果响应是 JSON,使用 .json() 方法解析
try:
data = response.json()
print("\n解析后的 JSON 数据 (args 部分):")
print(data.get('args'))
except ValueError:
print("\n响应不是有效的 JSON 格式")
高级用法
1 传递 URL 参数
当你需要向 URL 添加查询参数时,可以直接将一个字典传递给 params 参数,requests 会帮你自动拼接。
import requests
# 目标基础 URL
url = 'https://www.httpbin.org/get'
# 定义要传递的参数
params = {
'key1': 'value1',
'name': '张三',
'city': '北京'
}
# 发送 GET 请求,并传入参数
response = requests.get(url, params=params)
# 查看最终的 URL
print(response.url)
# 输出: https://www.httpbin.org/get?city=%E5%8C%97%E4%BA%AC&key1=value1&name=%E5%BC%A0%E4%B8%89
# (中文被自动 URL 编码了)
2 在请求体中发送数据 (POST 请求)
POST 请求通常用于向服务器提交数据,你可以使用 data 参数来发送表单数据。
import requests
url = 'https://www.httpbin.org/post'
# 定义要提交的表单数据
payload = {
'username': 'user123',
'password': 'password456',
'comment': '你好,世界!' # 中文数据
}
# 发送 POST 请求
response = requests.post(url, data=payload)
# 打印服务器返回的 JSON 数据,确认数据是否被正确接收
print(response.json().get('form'))
# 输出: {'username': 'user123', 'password': 'password456', 'comment': '你好,世界!'}
3 发送 JSON 数据
如果你需要发送 JSON 格式的数据(现代 Web API 的标准),应该使用 json 参数。
import requests
import json # 虽然不需要手动导入,但为了清晰可以写上
url = 'https://www.httpbin.org/post'
# 定义一个 Python 字典
data_to_send = {
'name': '李四',
'age': 30,
'skills': ['Python', 'requests']
}
# 使用 json 参数,requests 会自动将字典序列化为 JSON 字符串,
# 并设置正确的 Content-Type 头部为 application/json
response = requests.post(url, json=data_to_send)
# 打印服务器返回的 JSON 数据
print(response.json().get('json'))
# 输出: {'age': 30, 'name': '李四', 'skills': ['Python', 'requests']}
4 自定义请求头
有些网站需要特定的请求头才能正常访问,User-Agent。
import requests
url = 'https://www.httpbin.org/get'
# 自定义请求头
headers = {
'User-Agent': 'My Cool App 1.0',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8' # 告诉服务器我接受中文
}
response = requests.get(url, headers=headers)
print(response.json().get('headers'))
# 你会看到 User-Agent 和 Accept-Language 都被包含在返回的头部信息中
5 处理文件上传
使用 files 参数可以轻松地模拟表单文件上传。
import requests
url = 'https://www.httpbin.org/post'
# 假设你有一个名为 'my_file.txt' 的文件在当前目录
# 'file' 是表单中 input 标签的 name 属性
# 'my_file.txt' 是文件名
# open('my_file.txt', 'rb') 以二进制模式打开文件
files = {'file': open('my_file.txt', 'rb')}
response = requests.post(url, files=files)
print(response.json().get('files'))
# 输出文件内容
中文编码处理 (重点)
requests 在处理中文编码方面做得非常出色,大部分情况下你无需担心。
requests 如何自动处理编码?
-
检查 HTTP 响应头:
requests首先会查看响应头中的Content-Type字段。Content-Type: text/html; charset=utf-8如果找到了charset=utf-8,requests就会使用UTF-8编码来解码响应内容。 -
内容嗅探:如果响应头中没有
charset信息,requests会尝试从内容本身嗅探编码,它会分析一小段文本,猜测最可能的编码(通过寻找特定的字符模式)。 -
使用备选编码:如果以上方法都失败了,
requests会使用requests.utils.get_encoding_from_headers()方法,或者最终回退到ISO-8859-1(一种几乎不会解码失败的编码)。
你什么时候需要注意编码?
在极少数情况下,如果服务器返回的 Content-Type 头部没有指定 charset,并且内容嗅探也失败了,你可能会遇到乱码,这时,你可以手动指定编码。
示例:手动指定编码
import requests
# 假设一个网站响应头没有 charset,且内容是 GBK 编码的中文
url = 'http://example.com/some-gbk-encoded-page' # 这是一个假设的 URL
try:
response = requests.get(url)
# 如果出现乱码,可以手动设置 encoding
response.encoding = 'gbk' # 强制使用 GBK 编码解码
# 现在再访问 response.text,中文就会正常显示
print(response.text)
except requests.exceptions.RequestException as e:
print(f"请求出错: {e}")
最佳实践:
- 优先使用
response.text:在 99% 的情况下,它都能正确工作。 - 遇到乱码再处理:如果发现
response.text输出的是乱码(像 ),再检查response.headers,并手动设置response.encoding。 - 处理二进制数据时用
response.content:如果你需要下载图片、视频等文件,应该使用response.content,并用wb(write binary) 模式写入文件。
# 下载图片示例
img_url = 'https://www.python.org/static/community_logos/python-logo-master-v3-TM.png'
response = requests.get(img_url)
# 确保请求成功
response.raise_for_status()
# 将二进制内容写入文件
with open('python_logo.png', 'wb') as f:
f.write(response.content)
异常处理
网络请求是不可靠的,可能会因为各种原因失败(如网络连接超时、域名不存在、服务器错误等),使用 try...except 块来捕获异常是一个好习惯。
requests 定义了许多异常类,都位于 requests.exceptions 模块中。
requests.exceptions.RequestException: 所有异常的基类。requests.exceptions.ConnectionError: 网络连接错误(如 DNS 查询失败)。requests.exceptions.HTTPError: HTTP 错误(响应状态码不是 2xx),通常与response.raise_for_status()配合使用。requests.exceptions.Timeout: 请求超时。requests.exceptions.TooManyRedirects: 重定向过多。
示例:健壮的请求代码
import requests
from requests.exceptions import RequestException
url = 'https://www.httpbin.org/get'
try:
# 设置一个超时时间(秒),防止程序无限等待
response = requests.get(url, timeout=5)
# 如果状态码不是 2xx,则抛出 HTTPError
response.raise_for_status()
# 正常处理响应
print("请求成功!")
print(response.json())
except RequestException as e:
# 捕获所有 requests 相关的异常
print(f"请求发生错误: {e}")
requests 是 Python 开发者进行网络请求的必备工具,它的简洁和强大使得与 Web 服务交互变得轻而易举,掌握其核心用法,特别是 get/post、params/data/json 参数、Response 对象的属性以及异常处理,你就能应对绝大多数的网络编程任务,对于中文处理,相信 requests 的自动编码机制会让你省心不少。
