每天早上醒来,你是不是总会习惯性地打开天气 APP,看看今天要不要带伞、会不会冷?但你有没有想过,其实可以自己写一段代码,几行指令就能获取未来 7 天的天气情况?

哇哇 将带你详细了解如何使用Python的requestsBeautifulSoup库,爬取公开网页上的天气信息。无论你是编程新手,还是想亲自动手实践数据采集的小伙伴,相信这篇文章都会让你有所收获。

🔥🔥🔥🔥哇哇 提醒:文章结尾附项目完整代码,安装好对应需求库,复制代码即可运行🔥🔥🔥🔥


一、先看看这个工具能做什么?

简单来说,这段代码就像一个 “迷你天气预报机器人”:你输入一个城市名(比如 “北京”“上海”),它就能立刻返回这个城市未来 7 天的天气情况,包括每天的最高温度、最低温度和天气状况(比如 “晴”“小雨”)。

举个例子,当你输入 “成都”,它会这样告诉你:

成都未来7天天气情况:
今天 最高温度:28℃ 最低温度:22℃ 天气:多云
明天 最高温度:30℃ 最低温度:23℃ 天气:晴
后天 最高温度:31℃ 最低温度:24℃ 天气:多云转晴
...

是不是很实用?接下来我们就一点点拆解开,看看这个 “机器人” 是怎么工作的。


二、准备工作:你需要这两个 “工具包”

在开始写代码前,我们得先准备两个 Python 库,它们就像我们的 “工具箱”,能帮我们轻松完成核心工作:

  1. requests 库:相当于一个 “网络跑腿员”,帮我们从天气网站上把网页内容 “下载” 到电脑里。
  2. BeautifulSoup 库:相当于一个 “内容整理员”,能从下载的网页内容中,精准挑出我们需要的天气信息(比如温度、日期)。

如果你的电脑里还没有这两个库,只需打开命令提示符(Windows)或终端(Mac),输入下面两行指令安装:

pip install requests -i https://mirrors.aliyun.com/pypi/simple/
pip install beautifulsoup4 -i https://mirrors.aliyun.com/pypi/simple/

!!!!滴滴:不知道怎么安装第三方库或者想换用国内镜像源加速下载,可以点击链接跳转推荐学习文章↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

Python国内镜像源全攻略:加速你的第三方库下载

极速配置!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打造专属天气管家

掌握了基础版后,不妨尝试这些酷炫升级:

  1. ​GUI界面​​:用Tkinter或PyQt打造桌面应用

  2. ​定时提醒​​:结合APScheduler实现每日推送

  3. ​多城监控​​:支持同时查询多个城市天气

  4. ​数据可视化​​:用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}")

从模仿到原创,再到潜能激发

每一个优秀的开发者都是从复制粘贴开始的

勤加练习,终有一天你也能写出改变世界的代码

天气预报如此,人生亦如是

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐