Python requests 库实现网络请求、响应解析与异常处理

小岛来信
小岛来信
发布时间:2026-10-12 | 1人浏览过
原创

本文详解如何使用 Python requests 库发起 GET 与 POST 请求,正确解析响应头与 JSON 数据,安全下载远程文件,并结合 try-except 结构、超时设置与上下文管理器实现健壮的错误处理与资源清理。掌握这些核心步骤可大幅提升接口调用与数据抓取的稳定性。

Python requests 库进行网络请求与数据处理的核心流程

准备环境与基础协议认知

Web 通信基于 HTTP 协议,客户端通过请求行(方法、URL、版本)与请求头向服务器传递指令,服务器则返回状态码、响应头及响应体。常用方法包括 GET(获取资源)、POST(提交数据)、PUT(更新)与 DELETE(删除)。在使用 Python 发起请求前,需确保系统已安装 pip 包管理器,并在终端执行以下命令完成环境配置:

pip install requests

第1步:发送 GET 请求并提取关键信息

GET 请求适用于读取公开数据或查询列表。通过 requests.get() 传入目标 URL,可使用 params 字典自动拼接查询参数。返回的 Response 对象包含 status_code(状态码)、headers(响应头)与 text(文本内容)等属性,便于快速核对服务状态。

import requests

url = "https://httpbin.org/get"
params = {"search": "python", "page": 1}
response = requests.get(url, params=params)

print(f"状态码: {response.status_code}")
print(f"内容类型: {response.headers.get('Content-Type')}")
print(f"响应长度: {len(response.text)} 字符")

第2步:构造 POST 请求并解析 JSON 响应

当需要向服务器提交表单或上传数据时,使用 requests.post()。将字典赋值给 data 参数会自动转换为 application/x-www-form-urlencoded 格式。若服务器返回 JSON 数据,可直接调用 .json() 将其转为 Python 字典或列表,避免手动字符串切割。

import requests

url = "https://httpbin.org/post"
payload = {"username": "testuser", "action": "submit"}
response = requests.post(url, data=payload)

if response.status_code == 200:
    data = response.json()
    print("服务端确认:", data.get("form"))

第3步:安全下载文件至本地磁盘

获取二进制资源(如图片、压缩包)时,务必使用 response.content 配合文件的二进制写入模式('wb')。直接保存 response.text 会导致乱码或文件损坏。写入前建议先校验状态码,确保资源可访问后再执行落盘操作。

import requests

download_url = "https://www.example.com/resource.zip"
resp = requests.get(download_url)

if resp.status_code == 200:
    with open("local_file.zip", "wb") as f:
        f.write(resp.content)
    print("文件已成功保存至本地路径")
else:
    print(f"下载失败,错误码: {resp.status_code}")

第4步:建立异常拦截与自动化资源清理机制

网络请求极易受超时、DNS 解析失败或服务器宕机影响。为防程序崩溃,必须引入 try-except 结构。推荐使用 timeout 限制等待时间,配合 raise_for_status() 主动抛出非 2xx 状态的异常。对于文件句柄或连接池,强烈依赖 with 上下文管理器自动关闭资源,杜绝内存泄漏。

import requests
from requests.exceptions import Timeout, RequestException

try:
    # 设置 5 秒超时上限
    resp = requests.get("https://api.example.com/data", timeout=5)
    # 触发 4xx/5xx 时主动抛出 HTTPError
    resp.raise_for_status()
    
    print("请求成功,正在处理数据...")
except Timeout:
    print("网络请求超时,请检查延迟或重试")
except requests.HTTPError as http_err:
    print(f"服务端报错: {http_err}")
except RequestException as req_err:
    print(f"其他网络异常: {req_err}")
finally:
    print("本次请求流程已执行完毕")

常见错误排查建议

若频繁遇到 ConnectionError,需检查代理设置或防火墙是否阻断请求;遇到 Timeout 可适当调整 timeout=(connect_timeout, read_timeout) 元组;若解析 .json() 报 JSONDecodeError,说明返回的并非标准 JSON 格式(可能是 HTML 警告页),应先打印 response.text 定位根因。始终使用条件判断(如 os.path.exists())替代盲目覆盖写入,可有效降低误删风险。

以上就是 Python 实现 Web 请求与响应处理的详细内容,更多关于 Python 网络编程与 API 调用的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表