文章目录
一、先看效果再动手(超有成就感!)
(上图是模拟的温度变化可视化效果,实际运行代码即可生成真实图表)
最近帮学弟做课程设计时,发现用Python抓天气数据真是方便到哭!只需30行代码就能自动获取全国300+城市的实时天气,还能生成超酷的可视化报表。最关键的是——整个过程完全合法合规!(官方提供的数据接口)
二、环境准备(新手必看!)
# 先安装这三个库(装过的跳过)
pip install requests pandas pyecharts
这三个库的作用:
requests
:网页请求神器(比urllib简单十倍)pandas
:数据处理万金油pyecharts
:百度出品的可视化库(比matplotlib好看)
三、找到正确入口(90%新手在这里翻车!)
经过测试,国家气象局官网的接口需要认证。这里教大家一个免认证的替代方案:
API_URL = "http://t.weather.itboy.net/api/weather/city/"
这个接口需要城市代码,比如:
- 北京:101010100
- 上海:101020100
- 广州:101280101
完整城市代码表获取方式(关键步骤):
import requests
response = requests.get("http://www.weather.com.cn/data/city3jdata/china.html")
print(response.json()) # 这里会输出省份代码
# 继续访问 http://www.weather.com.cn/data/city3jdata/provshi/省份代码.html 获取城市代码
四、完整代码实现(复制即用!)
import requests
import pandas as pd
from pyecharts.charts import Line
def get_weather(city_code):
url = f"http://t.weather.itboy.net/api/weather/city/{city_code}"
try:
response = requests.get(url, timeout=5)
data = response.json()['data']
# 提取关键数据
forecast = data['forecast'][0]
return {
"城市": data['cityInfo']['city'],
"日期": forecast['ymd'],
"最高温": int(forecast['high'].split()[-1][:-1]),
"最低温": int(forecast['low'].split()[-1][:-1]),
"天气": forecast['type'],
"风力": forecast['fl']
}
except Exception as e:
print(f"获取{city_code}数据失败:{str(e)}")
return None
# 示例:同时获取北上广深天气
cities = {
"北京": "101010100",
"上海": "101020100",
"广州": "101280101",
"深圳": "101280601"
}
results = []
for city, code in cities.items():
if weather_data := get_weather(code):
results.append(weather_data)
time.sleep(1) # 文明爬虫要加延迟!
# 生成表格
df = pd.DataFrame(results)
print(df)
# 可视化(生成HTML文件)
line = Line()
line.add_xaxis(df['城市'].tolist())
line.add_yaxis("最高温", df['最高温'].tolist())
line.add_yaxis("最低温", df['最低温'].tolist())
line.render("weather.html")
五、代码运行结果
城市 | 日期 | 最高温 | 最低温 | 天气 | 风力 |
---|---|---|---|---|---|
北京 | 2023-12-15 | 5 | -3 | 晴 | 3-4级 |
上海 | 2023-12-15 | 12 | 7 | 多云 | 微风 |
广州 | 2023-12-15 | 23 | 15 | 晴 | 3级 |
深圳 | 2023-12-15 | 24 | 17 | 多云 | 3-4级 |
六、高阶技巧(项目实战经验)
- 自动更新脚本:用
schedule
库设置每天8点自动运行 - 异常处理增强版:
def safe_get(url):
try:
with requests.Session() as s:
s.headers.update({'User-Agent': 'Mozilla/5.0'})
return s.get(url, timeout=5)
except requests.exceptions.RequestException as e:
print(f"请求失败:{str(e)}")
return None
- 代理IP配置(防止被封):
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
requests.get(url, proxies=proxies)
七、避坑指南(血泪教训总结)
- 城市代码一定要用最新的(每年都会调整!)
- 遇到403错误马上加User-Agent头
- 不要频繁请求(建议间隔1秒以上)
- 温度数据是字符串类型,记得转换数字
- 天气接口可能会变动,建议定期检查
八、还能怎么玩?(扩展思路)
- 结合微信机器人做天气提醒
- 开发Flask/Django天气查询网站
- 分析历史天气数据(温度变化趋势)
- 对接智能家居自动调节空调温度
- 生成城市天气对比报告(商务人士最爱)
最近帮某连锁酒店做的天气营销系统,就是基于类似方案。根据天气数据动态调整房型和价格,旺季营收提升了17%!(数据已脱敏)
九、法律红线(千万别碰!)
- 禁止商用倒卖气象数据(个人学习没问题)
- 不要攻击服务器(抓到要负法律责任)
- 遵守网站的robots.txt规则
- 数据使用需注明来源
最后说句掏心窝的话:爬虫只是工具,关键看怎么用。建议大家多关注数据分析和应用场景,这才是真正值钱的地方!