Python requests 模块(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在数字化时代,网络请求是开发者与外部服务交互的核心能力。无论是爬取网页数据、调用 API 接口,还是构建自动化工具,掌握网络请求的实现方式至关重要。Python requests 模块作为 Python 生态中最流行且友好的 HTTP 客户端库,凭借其简洁的 API 设计和丰富的功能,成为开发者首选的工具。

本文将从基础到进阶,结合实际案例,系统讲解 Python requests 模块的核心功能与最佳实践。无论你是编程新手还是有一定经验的开发者,都能通过本文快速掌握网络请求的实战技巧。


什么是 Python requests 模块?

Python requests 模块是一个基于 Python 的第三方库,用于发送 HTTP 请求并处理响应。它简化了底层协议的复杂性,让开发者能像操作本地文件一样轻松与网络服务交互。

想象一下,requests 模块就像一位专业的快递员

  • 当你需要向服务器发送请求(如“取件”)时,它负责将请求包装成标准格式(如 GET/POST 方法)。
  • 接收服务器返回的响应(如“包裹”)后,它会帮你解析内容(如 JSON、文本等),并提供清晰的状态码(如“包裹是否完好”)。

通过 requests,开发者无需手动处理 TCP 连接、请求头解析或 SSL 加密等底层细节,只需关注业务逻辑即可。


基础用法:GET 请求与响应处理

发送 GET 请求

GET 请求是最常见的网络操作,用于从服务器获取数据。例如,访问 GitHub 的公共 API:

import requests  

response = requests.get("https://api.github.com")  
print(f"响应状态码:{response.status_code}")  # 输出 200 表示成功  
print(f"响应内容:{response.text[:100]}")     # 输出前 100 字符  

响应对象详解

requests.get() 返回一个 Response 对象,包含以下关键属性和方法:

属性/方法描述
response.status_code响应状态码(如 200 表示成功)
response.text响应内容的字符串形式
response.json()将响应内容解析为 JSON 对象

比喻Response 对象就像一个快递包裹,status_code 是包裹上的“收货状态”,text 是包裹内的“原始内容”,而 json() 则是帮你拆开包裹并整理成可读的格式。


参数传递与数据解析

传递查询参数

通过 params 参数向 URL 添加查询参数,例如搜索 GitHub 上的仓库:

params = {"q": "python"}  
response = requests.get("https://api.github.com/search/repositories", params=params)  

data = response.json()  
print(f"找到 {data['total_count']} 个仓库")  

处理 JSON 响应

当服务器返回 JSON 数据时,直接调用 .json() 方法即可将其转换为 Python 字典:

data = response.json()  
print(f"库名称:{data['name']},版本:{data['version']}")  

发送 POST 请求与表单数据

POST 请求用于向服务器提交数据,例如模拟登录或创建资源。表单数据可通过 data 参数传递:

login_data = {  
    "username": "example_user",  
    "password": "secure_password"  
}  
response = requests.post("https://api.example.com/login", data=login_data)  

if response.status_code == 200:  
    print("登录成功!")  
else:  
    print("登录失败,请检查凭证")  

高级功能:认证、会话与超时

会话保持(Session 对象)

在多次请求同一服务器时,使用 Session 对象可复用 TCP 连接并管理 cookie:

from requests import Session  

with Session() as session:  
    # 第一次请求登录获取 cookie  
    session.post("https://api.example.com/login", data=login_data)  

    # 第二次请求自动携带 cookie  
    response = session.get("https://api.example.com/user/profile")  
    print(response.text)  

基本认证(HTTP Auth)

对需要密码保护的资源,可通过 auth 参数添加认证信息:

response = requests.get(  
    "https://api.example.com/protected",  
    auth=("username", "password")  # 用户名和密码  
)  

设置超时时间

避免因网络延迟导致程序卡死,可设置超时时间(单位:秒):

try:  
    response = requests.get("https://slow-api.example.com", timeout=5)  
except requests.exceptions.Timeout:  
    print("请求超时,请重试")  

错误处理与异常管理

捕获常见异常

使用 try-except 块捕获请求过程中可能出现的错误:

import requests  
from requests.exceptions import HTTPError, ConnectionError  

try:  
    response = requests.get("https://api.example.com/non-existent-endpoint")  
    response.raise_for_status()  # 检查状态码是否为 4xx/5xx  
except HTTPError as e:  
    print(f"HTTP 错误:{e}")  
except ConnectionError:  
    print("无法连接到服务器,请检查网络")  
except Exception as e:  
    print(f"未知错误:{e}")  

自定义重试策略

对于不稳定的服务,可结合第三方库 tenacity 实现自动重试:

from tenacity import retry, stop_after_attempt  
import requests  

@retry(stop=stop_after_attempt(3))  
def fetch_data():  
    return requests.get("https://unstable-api.example.com")  

try:  
    response = fetch_data()  
except Exception as e:  
    print("所有重试均失败")  

实战案例:构建天气查询工具

目标:通过 OpenWeatherMap API 获取天气数据

步骤 1:注册 API 密钥

访问 OpenWeatherMap 获取免费 API 密钥。

步骤 2:编写代码

import requests  

API_KEY = "YOUR_API_KEY"  
CITY = "Beijing"  
URL = f"http://api.openweathermap.org/data/2.5/weather?q={CITY}&appid={API_KEY}"  

try:  
    response = requests.get(URL)  
    response.raise_for_status()  
    data = response.json()  

    # 解析关键信息  
    temperature = data["main"]["temp"] - 273.15  # 转换为摄氏度  
    description = data["weather"][0]["description"]  

    print(f"当前 {CITY} 天气:{description}")  
    print(f"温度:{temperature:.1f}°C")  

except requests.exceptions.RequestException as e:  
    print(f"请求失败:{e}")  

输出示例

当前 Beijing 天气:few clouds  
温度:22.5°C  

总结与展望

Python requests 模块凭借其简洁的 API 设计和强大的功能,成为网络请求领域的“瑞士军刀”。从基础的 GET/POST 请求到进阶的会话管理、错误处理,它都能提供高效且直观的支持。

对于开发者而言,掌握 requests 模块不仅能提升工作效率,还能为构建复杂的网络应用(如爬虫、自动化脚本)打下坚实基础。随着网络服务的日益复杂,结合 requests 的灵活性与其他工具(如异步框架、数据解析库),你将能应对更多挑战。

实践建议

  1. 通过官方文档探索更多功能(如文件上传、SSL 验证)。
  2. 在真实项目中应用 requests,例如搭建一个简易的股票价格监控工具。
  3. 结合日志记录(如 logging 模块)增强请求的可调试性。

通过不断实践与探索,requests 模块将成为你开发旅程中不可或缺的得力助手!

最新发布