杰瑞科技汇

requests Python中文怎么用?

requests 是什么?

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

requests Python中文怎么用?-图1
(图片来源网络,侵删)

为什么选择 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 请求

requests Python中文怎么用?-图2
(图片来源网络,侵删)
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 如何自动处理编码?

  1. 检查 HTTP 响应头requests 首先会查看响应头中的 Content-Type 字段。 Content-Type: text/html; charset=utf-8 如果找到了 charset=utf-8requests 就会使用 UTF-8 编码来解码响应内容。

  2. 内容嗅探:如果响应头中没有 charset 信息,requests 会尝试从内容本身嗅探编码,它会分析一小段文本,猜测最可能的编码(通过寻找特定的字符模式)。

  3. 使用备选编码:如果以上方法都失败了,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/postparams/data/json 参数、Response 对象的属性以及异常处理,你就能应对绝大多数的网络编程任务,对于中文处理,相信 requests 的自动编码机制会让你省心不少。

分享:
扫描分享到社交APP
上一篇
下一篇