安装必要的库
在开始之前,你需要确保你的 Python 环境中安装了以下两个库:

requests: 用于向网站发送网络请求,获取网页的 HTML 内容。BeautifulSoup4: 用于解析 HTML 内容,方便地提取我们想要的天气数据。
你可以使用 pip 来安装它们:
pip install requests pip install beautifulsoup4
抓取天气.com (适合初学者)
这个网站结构相对简单,适合新手理解爬虫的基本流程。
第 1 步:分析目标网页
- 打开浏览器,访问
https://www.weather.com.cn/weather/101010100.shtml(北京天气)。 - 在天气信息区域("7天预报")点击鼠标右键,选择“检查”或“检查元素”。
- 你会看到网页的源代码,我们需要找到包含天气数据的 HTML 标签。
通过分析,你会发现每天的天气信息都在一个 <li> 标签里,并且这个 <li> 标签有一个特定的 class,"day7" 或其他,我们可以通过这个 class 来精确定位。
第 2 步:编写 Python 代码
下面是完整的代码,包含了详细的注释。

import requests
from bs4 import BeautifulSoup
def get_weather_from_weather_com():
"""
从 weather.com.cn 抓取北京未来几天的天气信息
"""
# 1. 定义目标 URL
url = 'https://www.weather.com.cn/weather/101010100.shtml'
# 2. 设置请求头,模拟浏览器访问
# 有些网站会检查 User-Agent,如果没有可能会拒绝访问
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
try:
# 3. 发送 GET 请求,获取网页内容
# timeout 设置超时时间,避免程序长时间等待
response = requests.get(url, headers=headers, timeout=10)
# 确保请求成功 (状态码 200)
response.raise_for_status()
# 4. 使用 BeautifulSoup 解析 HTML
# 'html.parser' 是 Python 内置的解析器
soup = BeautifulSoup(response.text, 'html.parser')
# 5. 定位到包含天气信息的容器
# 通过开发者工具,我们找到 class 为 "t clearfix" 的 div,它下面包含所有的天气 li
weather_list = soup.find('div', class_='t clearfix').find_all('li')
print(f"--- {len(weather_list)} 天北京天气预报 ---")
# 6. 遍历列表,提取并打印每一天的天气信息
for item in weather_list:
# 提取日期
date = item.find('h1').text.strip()
# 提取天气状况 (白天和夜晚)
weather = item.find('p', class_='wea').text.strip()
# 提取气温
temp = item.find('p', class_='tem').text.strip()
# 打印信息
print(f"{date}: {weather}, 气温: {temp}")
except requests.exceptions.RequestException as e:
print(f"网络请求失败: {e}")
except AttributeError as e:
print(f"解析页面时出错,可能页面结构已变更: {e}")
except Exception as e:
print(f"发生未知错误: {e}")
# 运行函数
if __name__ == '__main__':
get_weather_from_weather_com()
代码解释
requests.get(url, ...): 向指定的 URL 发送一个 HTTP GET 请求,获取服务器返回的响应。headers: 模拟浏览器访问,防止被网站识别为爬虫而拦截。response.raise_for_status(): 如果请求失败(404 Not Found, 500 Server Error),这行代码会抛出异常。BeautifulSoup(response.text, 'html.parser'): 将服务器返回的 HTML 文本内容,用 Python 自带的解析器转换成一个 BeautifulSoup 对象,方便后续操作。soup.find('div', class_='t clearfix'): 在整个 HTML 中查找第一个class为t clearfix的<div>.find_all('li'): 在刚刚找到的<div>标签内部,查找所有的<li>标签,返回一个列表。item.find('h1').text.strip(): 在每个<li>标签中,查找<h1>标签,获取其内部的文本内容,并用.strip()去除首尾多余的空格和换行符。
抓取心知天气 API (更专业、更稳定)
对于需要频繁、稳定获取天气数据的应用(比如个人项目、自动化脚本),直接解析网页 HTML 是不够健壮的,因为网站随时可能改版,导致你的爬虫失效。
最佳实践是使用 天气 API (Application Programming Interface),心知天气提供了免费的开发者服务,非常适合学习和使用。
第 1 步:获取 API 密钥
- 访问 心知天气 官网。
- 注册并登录账号。
- 进入“控制台” -> “我的密钥”,获取你的 API Key(一串长字符)。
第 2 步:编写 Python 代码
心知天气返回的是 JSON 格式的数据,Python 的 requests 库可以非常方便地处理它。
import requests
import json
def get_weather_from_seniverse(api_key, location='北京'):
"""
使用心知天气 API 获取天气信息
:param api_key: 你的心知天气 API Key
:param location: 城市名称,默认为 '北京'
"""
# 1. 定义 API URL
# 这里我们获取实时天气
url = f'https://api.seniverse.com/v3/weather/now.json?key={api_key}&location={location}&language=zh-Hans&unit=c'
# 2. 设置请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
try:
# 3. 发送 GET 请求
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
# 4. 解析 JSON 数据
# response.json() 会自动将 JSON 字符串解析为 Python 字典
weather_data = response.json()
# 5. 提取并打印信息
# 检查 API 是否返回了有效结果
if 'results' in weather_data and len(weather_data['results']) > 0:
result = weather_data['results'][0]
location_name = result['location']['name']
now = result['now']
print(f"--- {location_name} 实时天气 ---")
print(f"天气状况: {now['text']}")
print(f"当前温度: {now['temperature']} °C")
print(f"体感温度: {now['feels_like']} °C")
print(f"风力信息: {now['wind_direction']} {now['wind_speed']} 级")
print(f"空气质量: {now['aqi']}")
else:
print("API 未返回有效数据,请检查 API Key 或城市名称是否正确。")
except requests.exceptions.RequestException as e:
print(f"网络请求失败: {e}")
except json.JSONDecodeError:
print("解析 JSON 数据失败,服务器返回可能不是有效的 JSON 格式。")
except KeyError as e:
print(f"数据结构不匹配,缺少关键字段: {e}")
except Exception as e:
print(f"发生未知错误: {e}")
# --- 使用示例 ---
# 请将 'YOUR_API_KEY' 替换成你自己的心知天气 API Key
SENIVERSE_API_KEY = 'YOUR_API_KEY'
if SENIVERSE_API_KEY != 'YOUR_API_KEY':
get_weather_from_seniverse(SENIVERSE_API_KEY, location='上海')
else:
print("请先替换代码中的 'YOUR_API_KEY' 为你的真实 API Key。")
API 方法的优势
- 稳定性高: API 是为程序调用设计的,接口稳定,不会因为网站改版而失效。
- 数据结构化: 返回的 JSON 数据结构清晰,比解析杂乱的 HTML 更简单、更可靠。
- 功能强大: 心知天气 API 提供了实时天气、预报、生活指数、空气质量等多种数据,只需修改 URL 即可。
- 合规性: 使用官方 API 是合法合规的,避免了爬虫带来的法律风险。
总结与建议
| 特性 | 方法一 (HTML 爬虫) | 方法二 (API 调用) |
|---|---|---|
| 学习目的 | 非常适合入门,能直观了解网页结构。 | 更专业,适合实际项目开发。 |
| 稳定性 | 差,网站改版即失效,需要维护代码。 | 高,接口稳定,数据有保障。 |
| 数据获取 | 解析 HTML,相对复杂。 | 解析 JSON,非常简单。 |
| 功能 | 依赖网站提供的数据。 | 提供丰富多样的官方数据接口。 |
| 合规性 | 存在一定风险。 | 完全合规。 |
给你的建议:

- 如果你是 Python 初学者,想学习爬虫的基本原理,请从 方法一 开始,亲手实践,你会对
requests和BeautifulSoup有更深刻的理解。 - 如果你要做一个自己的项目(比如桌面小工具、自动化脚本),请直接使用 方法二,这是更专业、更可靠、更长远的选择,花几分钟注册 API,能为你省去未来无数的维护麻烦。
