找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3461

积分

0

好友

475

主题
发表于 19 小时前 | 查看: 1| 回复: 0

掌握如何使用requests库进行网络请求,是迈向Python自动化、数据采集和系统集成的关键一步。今天,我们就来系统学习requests库的核心用法,并通过一个调用免费天气API的实战项目,让你彻底上手。

我们将使用Python生态中最为流行的HTTP库——requests。它设计优雅,接口简洁,极大简化了网络交互的复杂度。

学习目标

通过本文,你将能够:

  • 掌握发送GET与POST请求的基本方法。
  • 学会获取并解析JSON格式的响应数据。
  • 理解如何处理HTTP响应状态码、头部和内容。
  • 完成一个实战项目:获取并展示实时天气信息。

在开始之前,请确保已安装requests库。如果未安装,可以通过以下命令安装:

pip install requests

一、安装与导入

安装完成后,在Python脚本中导入它:

import requests

二、发起GET请求:获取数据

GET请求通常用于从服务器获取信息。

基本语法

response = requests.get(url, params=query_params, headers=headers)

示例1:获取网页内容

# 1. 一个最简单的GET请求
res = requests.get("https://httpbin.org/get")
print(res.status_code)  # 200 → 请求成功!
print(res.text)         # 打印响应的文本内容

示例2:发送带查询参数的GET请求
查询参数会自动拼接到URL之后。

# 此请求将访问:https://httpbin.org/get?name=Alice&age=25
params = {"name": "Alice", "age": 25}
res = requests.get("https://httpbin.org/get", params=params)
print(res.url)  # 查看实际请求的完整URL

三、发起POST请求:提交数据

POST请求用于向服务器提交数据,例如登录、上传文件等。

基本语法

response = requests.post(url, data=form_data, json=json_data, headers=headers)

示例:提交表单数据或JSON数据
data参数和json参数是两种常用的提交方式,它们的主要区别在于请求头的Content-Type和数据的编码方式。

# 1. 提交表单数据 (application/x-www-form-urlencoded)
form_data = {"username": "alice", "password": "123456"}
res = requests.post("https://httpbin.org/post", data=form_data)

# 2. 提交 JSON 数据 (application/json)
# 使用json参数,requests会自动设置请求头并序列化字典
json_data = {"user": "alice", "action": "login"}
res = requests.post("https://httpbin.org/post", json=json_data)
print(res.json())  # 直接解析返回的JSON数据为Python对象

四、解析响应内容

发送请求后,我们会得到一个Response对象,它包含了服务器返回的所有信息。

属性/方法 说明
.status_code HTTP 状态码(200=成功,404=未找到,500=服务器内部错误等)
.headers 响应头信息,以字典形式提供
.text 响应的文本内容(requests会自动进行编码推断和解码)
.content 响应的原始字节内容(常用于下载图片、文件等二进制数据)
.json() 将JSON格式的响应体解析为Python字典或列表

在解析JSON时,强烈建议添加异常处理,因为服务器可能返回非JSON格式的内容。

try:
    data = res.json()  # 尝试解析JSON
except requests.exceptions.JSONDecodeError:
    print("❌ 响应不是有效的JSON格式!")
    print("原始内容:", res.text)

五、实战项目:获取实时天气(使用免费API)

理论学习之后,我们通过一个实用的例子来巩固。我们将使用 Open-Meteo 提供的免费天气API,它无需注册或API密钥。

实现步骤

  1. 构造请求URL及查询参数(需要目标城市的经纬度)。
  2. 发送GET请求。
  3. 解析返回的JSON数据,提取温度、风速等信息。
  4. 将信息友好地输出到控制台。

代码实现
下面的代码定义了一个get_weather函数,可以获取指定城市的当前天气。

import requests

def get_weather(lat=39.9042, lon=116.4074, city="北京"):
    """
    获取指定城市的当前天气
    默认:北京 (纬度 39.9042, 经度 116.4074)
    """
    url = "https://api.open-meteo.com/v1/forecast"
    params = {
        "latitude": lat,
        "longitude": lon,
        "current_weather": "true",
        "timezone": "Asia/Shanghai"
    }
    try:
        response = requests.get(url, params=params, timeout=10)
        response.raise_for_status()  # 如果状态码不是 2xx,抛出异常

        data = response.json()
        current = data["current_weather"]

        print(f"🌤️  {city} 当前天气:")
        print(f"   温度: {current['temperature']}°C")
        print(f"   风速: {current['windspeed']} km/h")
        print(f"   天气代码: {current['weathercode']} (参考: https://open-meteo.com/en/docs)")
    except requests.exceptions.RequestException as e:
        print(f"❌ 网络请求失败: {e}")
    except KeyError as e:
        print(f"❌ 响应数据格式异常: 缺少字段 {e}")

# 使用示例
if __name__ == "__main__":
    get_weather()  # 查询北京天气
    get_weather(31.2304, 121.4737, "上海") # 查询上海天气
    get_weather(23.1291, 113.2644, "广州") # 查询广州天气

运行上述代码,你将在终端看到类似下面的输出。这表示你已成功通过Python程序从互联网API获取了实时数据!
终端运行Python脚本成功获取北京、上海、广州三地天气信息的截图

六、其他实用技巧

除了核心的请求方法,requests库还提供了一些高级功能,可以应对更复杂的网络场景。

1. 设置请求头(模拟浏览器访问)
某些网站会检查User-Agent等请求头,未设置可能被拒绝访问。

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
res = requests.get("https://example.com", headers=headers)

2. 下载文件
利用.content属性可以轻松下载图片、文档等二进制文件。

res = requests.get("https://example.com/image.jpg")
with open("image.jpg", "wb") as f:
    f.write(res.content)  # .content 是字节数据

3. 使用会话(Session)保持状态
Session对象可以跨请求自动保持Cookie,常用于模拟登录后的操作。

session = requests.Session()
session.get("https://example.com/login")  # 首次请求,服务器可能设置Cookie
session.post("https://example.com/data")  # 后续请求会自动携带上一步的Cookie

七、巩固练习

为了加深理解,请尝试完成以下两个小任务。它们会帮助你熟悉标准的HTTP交互流程。

任务1:发送一个GET请求到 https://httpbin.org/json,解析返回的JSON数据,并打印出其中"slideshow"对象的"title"字段值。
任务2:发送一个POST请求到 https://httpbin.org/post,请求体为JSON数据 {"task": "learn Python"},然后打印服务器响应中"json"字段的内容。

参考答案如下:

import requests

# === 任务1:GET ===
print("【任务1】")
res1 = requests.get("https://httpbin.org/json")
print("标题:", res1.json()["slideshow"]["title"])

# === 任务2:POST ===
print("\n【任务2】")
payload = {"task": "learn Python"}
res2 = requests.post("https://httpbin.org/post", json=payload)
print("服务器收到:", res2.json()["json"])

八、核心要点总结

下表总结了requests库在不同场景下的核心用法模板:

场景 代码模板
GET 带参数 requests.get(url, params={...})
POST 表单 requests.post(url, data={...})
POST JSON requests.post(url, json={...})
解析 JSON response.json()
错误处理 try-except + response.raise_for_status()

在实战中,请务必牢记以下最佳实践:

  • 始终检查响应状态:使用response.status_coderesponse.raise_for_status()来确保请求成功,而不是假设一切正常。
  • 设置超时:为请求添加timeout参数(如timeout=5),防止因网络问题导致程序长时间无响应。
  • 保护敏感信息:切勿将API密钥、密码等硬编码在代码中。应使用环境变量或配置文件来管理。

恭喜你!现在你已经掌握了使用Python的requests库与Web服务进行交互的核心技能。无论是调用公开的REST API,还是构建自己的网络自动化脚本,这些知识都是坚实的基础。想要探索更多关于Python的实践技巧和深度教程,可以持续关注我们云栈社区的技术文档板块,那里汇聚了许多开发者的实战经验和学习资源。继续探索,你的代码将拥有连接整个互联网的能力!




上一篇:梯度对比解析大模型SFT、蒸馏与强化学习的本质联系
下一篇:2025年AI泡沫之争:54位科技与金融领袖观点综述
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-23 22:25 , Processed in 0.521089 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表