讲师中心 微信公众号
AI工具推荐 视频效率加速

Python网络爬虫教程:使用BeautifulSoup高效抓取天气数据

陌晨大大_6700

陌晨大大_6700

发布时间:2025-11-28 09:47:17

|

710人浏览过

|

来源于php中文网

原创

Python网络爬虫教程:使用BeautifulSoup高效抓取天气数据

本教程详细介绍了如何利用python的beautifulsoup库,从特定天气网站高效抓取露点、风速、温度等关键气象数据。文章从http请求获取网页内容开始,逐步深入到html结构的解析、目标数据元素的精确识别与定位,直至最终数据的提取、清洗与组织。文中提供了完整的代码示例,并探讨了在实际爬虫开发中需要注意的网站结构变化、反爬机制、请求频率以及错误处理等最佳实践,旨在帮助读者构建稳定可靠的自动化数据获取方案。

在数据驱动的时代,从网页中自动提取信息已成为一项重要的技能。对于非结构化或半结构化的网页数据,Python的requests库用于发送HTTP请求,而BeautifulSoup库则以其强大的HTML/XML解析能力,成为网页数据抓取的首选工具。本教程将以抓取天气网站上的露点、风速等气象数据为例,详细讲解如何使用这两个库实现高效、稳定的网页数据提取。

1. 理解网页结构与数据定位

在开始编写爬虫之前,理解目标网页的HTML结构至关重要。通常,我们需要通过浏览器开发者工具(F12)检查元素,找出目标数据所在的HTML标签、类名、ID或其与其他元素的相对位置。

以本教程的目标天气网站为例,我们观察到气象数据(如“Dew point:”、“Wind:”)通常由<dt>(定义术语)标签表示其名称,紧随其后的<dd>(定义描述)标签则包含对应的值。例如:

<dt>Dew point:</dt>
<dd class="mrgn-bttm-0 wxo-metric-hide">-2.3°<abbr title="Celsius">C</abbr>
</dd>
<dt>Wind:</dt>
<dd class="longContent mrgn-bttm-0 wxo-metric-hide">
<abbr title="Northeast">NE</abbr> 9 <abbr title="kilometres per hour">km/h</abbr>
</dd>

这种<dt>和<dd>成对出现的结构,为我们使用BeautifulSoup进行数据定位提供了清晰的路径。

立即学习“Python免费学习笔记(深入)”;

2. 使用BeautifulSoup进行网页解析

BeautifulSoup库能够将复杂的HTML文档转换成一个Python对象,使我们能够以简单的方式遍历、搜索和修改解析树。

2.1 基础设置与页面获取

首先,我们需要导入所需的库,并使用requests库获取目标网页的HTML内容。为了确保爬虫的健壮性,建议添加异常处理机制。

import requests
from bs4 import BeautifulSoup

# 目标网页URL
url = "https://weather.gc.ca/city/pages/ab-52_metric_e.html"

def get_html_content(target_url):
    """
    发送HTTP GET请求并获取网页内容。
    """
    try:
        # 增加超时设置,避免长时间等待无响应
        response = requests.get(target_url, timeout=10)
        # 检查HTTP请求是否成功,如果状态码不是200,将抛出HTTPError异常
        response.raise_for_status()
        return response.content
    except requests.exceptions.RequestException as e:
        print(f"请求网页失败: {e}")
        return None

html_content = get_html_content(url)

if html_content:
    # 使用BeautifulSoup解析HTML内容
    # "html.parser" 是Python内置的解析器,也可以使用lxml或html5lib
    soup = BeautifulSoup(html_content, "html.parser")
else:
    print("未能获取网页内容,程序退出。")
    exit()

2.2 定位目标数据元素

获取到BeautifulSoup对象soup后,我们可以开始定位具体的元素。由于气象指标名称都包含在<dt>标签中,我们可以首先找到所有的<dt>标签。

Java Maven Common
Java Maven Common

Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。

下载
# 查找页面中所有的<dt>标签
all_dt_elements = soup.find_all("dt")

接下来,我们需要根据<dt>标签的文本内容来判断它是否是我们感兴趣的气象指标,然后获取其对应的<dd>标签的值。这里需要注意,BeautifulSoup的next_sibling属性在遇到HTML结构中的空白字符(如换行符)时,会将其视为一个兄弟节点。因此,通常需要使用next_sibling.next_sibling来跳过这些空白节点,直接到达实际的HTML标签。

2.3 提取并整理数据

我们将定义一个包含所有目标气象指标的列表,然后遍历所有找到的<dt>标签,提取并整理数据。

# 定义需要抓取的气象指标列表
# 如果需要更多指标,可在此列表中添加
metrics_to_extract = [
    "Dew point:", "Wind:", "Pressure:", "Condition:", "Tendency:",
    "Temperature:", "Humidity:", "Visibility:"
]

# 用于存储抓取到的数据
weather_data = {}

for elem_dt in all_dt_elements:
    # 检查<dt>标签的文本内容是否在我们关注的指标列表中
    if elem_dt.text in metrics_to_extract:
        # 获取<dt>标签的下一个兄弟节点,通常是换行符或空格
        # 再获取下一个兄弟节点,才是实际包含值的<dd>标签
        value_elem_dd = elem_dt.next_sibling.next_sibling

        # 提取文本并去除首尾空白符(包括换行符)
        # 如果<dd>标签不存在,则设为"No Data"
        extracted_value = value_elem_dd.text.strip() if value_elem_dd else "No Data"

        # 将数据存储到字典中,键为指标名称,值为提取到的数据
        # 这里假设每个指标只有一个值,如果网站结构可能导致多值,可使用列表存储
        weather_data[elem_dt.text.replace(':', '')] = extracted_value

3. 完整代码示例

将上述步骤整合,形成一个完整的、可运行的Python脚本,用于抓取天气数据:

import requests
from bs4 import BeautifulSoup

def get_weather_data(url):
    """
    从指定URL抓取天气数据。
    """
    try:
        # 发送HTTP GET请求,设置超时时间为10秒
        resp = requests.get(url, timeout=10)
        # 检查HTTP请求是否成功,如果状态码不是200,将抛出HTTPError异常
        resp.raise_for_status()
    except requests.exceptions.RequestException as e:
        print(f"请求网页失败: {e}")
        return None

    # 使用BeautifulSoup解析HTML内容
    soup = BeautifulSoup(resp.content, "html.parser")

    # 定义需要抓取的气象指标列表
    # 如果需要更多指标,可在此列表中添加
    metrics = ["Dew point:", "Wind:", "Pressure:", "Condition:", "Tendency:",
               "Temperature:", "Humidity:", "Visibility:"]

    data = {}

    # 查找页面中所有的<dt>标签
    all_dt = soup.find_all("dt")

    for elem in all_dt:
        # 检查<dt>标签的文本内容是否在我们关注的指标列表中
        if elem.text in metrics:
            # <dd>标签通常是<dt>标签的下一个兄弟节点,但有时会有换行符或空格作为兄弟节点
            # 因此使用 .next_sibling.next_sibling 来获取实际的<dd>标签
            value_elem = elem.next_sibling.next_sibling
            # 提取文本并去除首尾空白符(包括换行符)
            extracted_value = value_elem.text.strip() if value_elem else "No Data"
            # 将冒号从键中移除,使数据更清晰
            data[elem.text.replace(':', '')] = extracted_value
    return data

if __name__ == "__main__":
    target_url = "https://weather.gc.ca/city/pages/ab-52_metric_e.html"
    weather_info = get_weather_data(target_url)

    if weather_info:
        print("抓取到的天气数据:")
        for key, value in weather_info.items():
            print(f"{key}: {value}")
    else:
        print("未能成功获取天气数据。")

运行上述代码,你将看到类似以下的输出:

抓取到的天气数据:
Temperature: 13.2°C
Dew point: -2.3°C
Humidity: 34%
Wind: NE 9 km/h
Visibility: 48 km

(实际输出可能因网站数据实时更新而有所不同)

4. 注意事项与最佳实践

在进行网页数据抓取时,除了掌握技术方法,还需要注意以下几点:

  • 网站结构变化: 网页的HTML结构并非一成不变,网站改版可能导致爬虫代码失效。因此,定期检查并更新爬虫代码是必要的维护工作。
  • 反爬机制: 许多网站会部署反爬虫机制,如检测User-Agent、IP访问频率限制、验证码、JavaScript动态加载内容等。针对这些情况,可能需要模拟浏览器行为(设置请求头)、使用代理IP池、降低请求频率或使用Selenium等工具。
  • robots.txt文件: 在爬取任何网站之前,应查看该网站根目录下的robots.txt文件(例如:https://weather.gc.ca/robots.txt),了解网站对爬虫的限制和允许爬取的范围,遵守网站的爬取规则。
  • 请求频率与礼貌: 避免在短时间内发送大量请求,这可能给网站服务器造成负担,甚至导致你的IP被封禁。建议在请求之间设置合理的延时(例如使用time.sleep())。
  • 错误处理: 编写健壮的爬虫代码,必须包含充分的错误处理逻辑,例如处理网络连接失败、页面元素缺失、数据解析错误等情况。
  • 数据清洗与存储: 抓取到的原始数据可能包含多余的字符或格式不统一。需要进一步的数据清洗和格式化,然后存储到数据库、CSV文件或JSON文件中,以便后续分析。
  • 官方API优先: 在考虑爬虫之前,应首先检查目标网站是否提供官方的API接口。使用API通常更稳定、合法,且数据格式规范,是获取数据的首选方式。

总结

本教程详细演示了如何使用Python的requests和BeautifulSoup库从天气网站抓取特定的气象数据。通过理解HTML结构、精确选择元素以及适当的错误处理,我们可以构建出高效且相对稳定的网页爬虫。然而,网页爬虫是一个动态变化的领域,持续学习和适应网站变化是成功的关键。遵循最佳实践,确保爬虫的礼貌性和合法性,将有助于你在数据获取的道路上走得更远。

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2155

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3322

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1116

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3799

2025.09.10

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

673

2023.11.13

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4604

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

5977

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2482

2024.11.28

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn