掌握如何使用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密钥。
实现步骤
- 构造请求URL及查询参数(需要目标城市的经纬度)。
- 发送GET请求。
- 解析返回的JSON数据,提取温度、风速等信息。
- 将信息友好地输出到控制台。
代码实现
下面的代码定义了一个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获取了实时数据!

六、其他实用技巧
除了核心的请求方法,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_code或response.raise_for_status()来确保请求成功,而不是假设一切正常。
- 设置超时:为请求添加
timeout参数(如timeout=5),防止因网络问题导致程序长时间无响应。
- 保护敏感信息:切勿将API密钥、密码等硬编码在代码中。应使用环境变量或配置文件来管理。
恭喜你!现在你已经掌握了使用Python的requests库与Web服务进行交互的核心技能。无论是调用公开的REST API,还是构建自己的网络自动化脚本,这些知识都是坚实的基础。想要探索更多关于Python的实践技巧和深度教程,可以持续关注我们云栈社区的技术文档板块,那里汇聚了许多开发者的实战经验和学习资源。继续探索,你的代码将拥有连接整个互联网的能力!