从零开始学爬虫:用 Python 轻松打造你的专属天气预报工具(附完整项目代码)
每天早上醒来,你是不是总会习惯性地打开天气 APP,看看今天要不要带伞、会不会冷?但你有没有想过,其实可以自己写一段代码,几行指令就能获取未来 7 天的天气情况?
哇哇 将带你详细了解如何使用Python的requests和BeautifulSoup库,爬取公开网页上的天气信息。无论你是编程新手,还是想亲自动手实践数据采集的小伙伴,相信这篇文章都会让你有所收获。
🔥🔥🔥🔥哇哇 提醒:文章结尾附项目完整代码,安装好对应需求库,复制代码即可运行🔥🔥🔥🔥
一、先看看这个工具能做什么?
简单来说,这段代码就像一个 “迷你天气预报机器人”:你输入一个城市名(比如 “北京”“上海”),它就能立刻返回这个城市未来 7 天的天气情况,包括每天的最高温度、最低温度和天气状况(比如 “晴”“小雨”)。
举个例子,当你输入 “成都”,它会这样告诉你:
成都未来7天天气情况:
今天 最高温度:28℃ 最低温度:22℃ 天气:多云
明天 最高温度:30℃ 最低温度:23℃ 天气:晴
后天 最高温度:31℃ 最低温度:24℃ 天气:多云转晴
...
是不是很实用?接下来我们就一点点拆解开,看看这个 “机器人” 是怎么工作的。
二、准备工作:你需要这两个 “工具包”
在开始写代码前,我们得先准备两个 Python 库,它们就像我们的 “工具箱”,能帮我们轻松完成核心工作:
- requests 库:相当于一个 “网络跑腿员”,帮我们从天气网站上把网页内容 “下载” 到电脑里。
- BeautifulSoup 库:相当于一个 “内容整理员”,能从下载的网页内容中,精准挑出我们需要的天气信息(比如温度、日期)。
如果你的电脑里还没有这两个库,只需打开命令提示符(Windows)或终端(Mac),输入下面两行指令安装:
pip install requests -i https://mirrors.aliyun.com/pypi/simple/
pip install beautifulsoup4 -i https://mirrors.aliyun.com/pypi/simple/
!!!!滴滴:不知道怎么安装第三方库或者想换用国内镜像源加速下载,可以点击链接跳转推荐学习文章↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
极速配置!Anaconda换用国内pip镜像源,一劳永逸解决下载龟速!
安装完成后,就可以开始写代码啦!
1. 第一步:告诉 Python “我们要用哪些工具”
代码开头的两行是这样的:
import requests
from bs4 import BeautifulSoup
这两行的意思是 “把 requests 和 BeautifulSoup 这两个工具包拿过来,我们接下来要用”。就像做饭前先把锅碗瓢盆摆出来一样,这是编程的基本操作。
2. 第二步:给每个城市编个 “身份证号”
接下来你会看到一个大字典city,里面存了很多城市和对应的数字,比如:
city_code_map = {
'北京': '101010100',
'上海': '101020100',
'广州': '101280101',
...
}
这其实是给每个城市编了个 “身份证号”。为什么要这么做呢?因为我们查询天气的网站(中国天气网)有个规律:每个城市的天气页面 URL 都是 “http://www.weather.com.cn/weather/城市代码.shtml”。比如北京的天气页面就是 “http://www.weather.com.cn/weather/101010100.shtml”,这里的 “101010100” 就是北京的专属代码。
这个字典的作用,就是让我们输入城市名(比如 “北京”)时,能快速找到对应的代码,从而拼出正确的网页地址。
3. 第三步:让用户告诉我们 “查哪个城市”
代码里有一行:
cityname = input('输入查询城市:')
citycode = city_code_map[cityname]
input()函数的作用是 “让程序停下来,等用户输入内容”。比如你运行代码后,屏幕会显示 “输入查询城市:”,这时你输入 “杭州”,cityname就会变成 “杭州”;然后通过city[cityname],就能从字典里找到杭州的代码 “101210101”。
4. 第四步:让 “跑腿员” 去网站拿数据
接下来是获取网页内容的核心代码:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...'}
url = 'http://www.weather.com.cn/weather/' + citycode + '.shtml'
res = requests.get(url, headers=headers, timeout=20)
res.encoding = 'utf-8'
这里有几个关键点需要理解:
- headers 的作用:你可以把它理解成 “给网站看的身份证”。有些网站会拒绝 “机器人” 访问,而
headers里的内容模拟了浏览器的信息(比如 Chrome 浏览器),告诉网站 “我是一个正常用户”,这样就能顺利拿到数据了。 - 拼接 URL:用城市代码拼出完整的天气页面地址,比如杭州的 URL 就是 “http://www.weather.com.cn/weather/101210101.shtml”。
- requests.get():这行代码就是让 “跑腿员”(requests)去访问这个 URL,把网页内容拿回来,存在
res里。timeout=20表示如果 20 秒内没拿到数据,就停止等待,避免程序一直卡着。 - res.encoding = 'utf-8':这是为了让网页里的中文正常显示。如果不设置,可能会出现乱码(比如 “é³å・”),就像你看一本没翻译的外文书一样。
5. 第五步:让 “整理员” 挑出有用的信息
拿到网页内容后,我们需要从中提取天气信息。这时候就轮到 BeautifulSoup 出场了:
soup = BeautifulSoup(res.text, 'html.parser')
tem_list = soup.find_all('p', class_='tem') # 存温度
day = soup.find('ul', class_='t clearfix') # 存日期
day_list = day.find_all('h1')
wealist = soup.find_all('p', class_='wea') # 存天气
这里的BeautifulSoup(res.text, 'html.parser')就像把一堆杂乱的网页代码(res.text)整理成一个 “带目录的说明书”(soup),让我们能按 “目录” 快速找到需要的内容。
soup.find_all('p', class_='tem'):意思是 “在整理好的说明书里,找出所有标签是<p>、类名是tem的内容”。在网页里,这些内容正好是温度信息,所以我们把它们存在tem_list里。- 同理,
day_list存的是日期(比如 “今天”“明天”),wealist存的是天气状况(比如 “晴”“小雨”)。
你可以简单理解为:网页里的每个信息都有 “标签” 和 “类名”,就像图书馆里的书有 “分类号” 和 “书架号”,我们通过这些标识就能精准找到需要的内容。
6. 第六步:处理数据,解决 “小意外”
接下来是一段循环代码,用来处理 7 天的天气数据:
for i in range(7):
try:
temHigh = tem_list[i].span.string # 尝试获取最高温度
except AttributeError as e:
temHigh = tem_list[i+1].span.string # 如果没获取到,用第二天的代替
temLow = tem_list[i].i.string
wea = wealist[i].string
day_pre[day_list[i].string] = '最高温度:'+temHigh +' 最低温度:' + temLow + ' 天气:' + wea
这里有个 “小意外” 需要处理:有时候网页里某一天的最高温度可能没有显示(比如当天只显示最低温度),这时候tem_list[i].span.string会报错(AttributeError)。
为了解决这个问题,代码用了try...except语句:先尝试获取当天的最高温度,如果失败,就用第二天的最高温度代替。这就像你买奶茶时想要冰的,店员说没有,那就换常温的,保证程序能继续运行。
然后我们把每天的日期、最高温、最低温、天气状况存到day_pre这个字典里,方便后续展示。
7. 第七步:把结果展示给用户
最后,代码会打印出整理好的天气信息:
print(f"\n{city_name}未来7天天气情况:")
for date, details in weather_forecast.items():
print(f"{date}:{details}")
这样用户就能清晰地看到未来 7 天的天气了,整个流程就完成啦!
进阶篇:利用PyQt5打造专属天气管家
掌握了基础版后,不妨尝试这些酷炫升级:
-
GUI界面:用Tkinter或PyQt打造桌面应用
-
定时提醒:结合APScheduler实现每日推送
-
多城监控:支持同时查询多个城市天气
-
数据可视化:用Matplotlib绘制温度变化曲线
🔥🔥🔥🔥进阶版Weather App指路:
从零打造桌面天气预报工具:PyQt5 实战开发全解析(附完整项目代码)
完整项目代码:
已调试好,安装好依赖库后可以直接运行
当前版本仅支持全国所有省份省会城市以及特定城市的天气查询,若要增添城市,可在
city_code_map 定义的字典里按模板添加城市与其对应的代码
# 导入网络请求库requests,用于获取网页内容
import requests
# 从bs4库导入BeautifulSoup,用于解析HTML内容
from bs4 import BeautifulSoup
# 定义城市与对应代码的字典(中国天气网城市标识)
city_code_map = {
# 直辖市
'北京': '101010100',
'上海': '101020100',
'天津': '101030100',
'重庆': '101040100',
# 省会
'石家庄': '101090101',
'太原': '101100101',
'沈阳': '101070101',
'长春': '101060101',
'哈尔滨': '101050101',
'南京': '101190101',
'杭州': '101210101',
'合肥': '101220101',
'福州': '101230101',
'南昌': '101240101',
'济南': '101120101',
'郑州': '101180101',
'武汉': '101200101',
'长沙': '101250101',
'广州': '101280101',
'海口': '101310101',
'成都': '101270101',
'贵阳': '101260101',
'昆明': '101290101',
'西安': '101110101',
'兰州': '101160101',
'西宁': '101150101',
'台北': '101340101',
# 自治区首府
'呼和浩特': '101080101',
'南宁': '101300101',
'拉萨': '101140101',
'银川': '101170101',
'乌鲁木齐': '101130101',
# 特别行政区
'香港': '101320101',
'澳门': '101330101',
# 其他重要城市
'桂林': '101300501',
'柳州': '101300301',
}
# 获取用户输入的城市名
city_name = input('请输入要查询的城市:')
# 尝试从字典中获取城市对应的代码(处理用户输入不存在的城市)
try:
city_code = city_code_map[city_name]
except KeyError:
print(f"抱歉,暂不支持查询{city_name}的天气,请检查城市名是否正确。")
# 若城市不存在,退出程序
exit()
# 定义请求头,模拟浏览器访问(避免被网站识别为爬虫)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
# 拼接目标城市的天气页面URL
weather_url = f'http://www.weather.com.cn/weather/{city_code}.shtml'
# 发送网络请求获取网页内容(设置超时时间20秒,避免无限等待)
try:
response = requests.get(weather_url, headers=headers, timeout=20)
# 设置编码为utf-8,确保中文正常显示
response.encoding = 'utf-8'
except requests.exceptions.RequestException as e:
print(f"网络请求失败:{e}")
exit()
# 使用BeautifulSoup解析网页内容(html.parser为内置解析器)
soup = BeautifulSoup(response.text, 'html.parser')
# 提取温度相关标签(网页中温度信息在class为"tem"的p标签内)
temperature_tags = soup.find_all('p', class_='tem')
# 提取日期相关标签(先找到日期所在的ul标签,再提取其中的h1标签)
date_list_container = soup.find('ul', class_='t clearfix')
date_tags = date_list_container.find_all('h1')
# 提取天气状况标签(网页中天气信息在class为"wea"的p标签内)
weather_condition_tags = soup.find_all('p', class_='wea')
# 创建字典存储未来7天的天气信息(键为日期,值为天气详情)
weather_forecast = {}
# 循环提取7天的天气数据
for i in range(7):
# 提取最高温度(处理部分日期无最高温度的情况)
try:
# 尝试获取当天最高温度(span标签内的文本)
max_temperature = temperature_tags[i].span.string
except AttributeError:
# 若当天无最高温度,且不是最后一天,则使用第二天的最高温度
if i < 6:
max_temperature = temperature_tags[i+1].span.string
else:
# 若为最后一天且无最高温度,用"暂无"代替
max_temperature = "暂无"
# 提取最低温度(i标签内的文本,格式如"22℃")
min_temperature = temperature_tags[i].i.string
# 提取天气状况(p标签内的文本,如"晴"、"多云")
weather_condition = weather_condition_tags[i].string
# 提取日期(h1标签内的文本,如"今天"、"明天")
date = date_tags[i].string
# 将数据存入字典
weather_forecast[date] = (
f"最高温度:{max_temperature} "
f"最低温度:{min_temperature} "
f"天气:{weather_condition}"
)
# 打印查询结果
print(f"\n{city_name}未来7天天气情况:")
for date, details in weather_forecast.items():
print(f"{date}:{details}")
从模仿到原创,再到潜能激发
每一个优秀的开发者都是从复制粘贴开始的
勤加练习,终有一天你也能写出改变世界的代码
天气预报如此,人生亦如是
更多推荐
所有评论(0)