杰瑞科技汇

Python如何抓取天气数据?

安装必要的库

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

Python如何抓取天气数据?-图1
(图片来源网络,侵删)
  1. requests: 用于向网站发送网络请求,获取网页的 HTML 内容。
  2. BeautifulSoup4: 用于解析 HTML 内容,方便地提取我们想要的天气数据。

你可以使用 pip 来安装它们:

pip install requests
pip install beautifulsoup4

抓取天气.com (适合初学者)

这个网站结构相对简单,适合新手理解爬虫的基本流程。

第 1 步:分析目标网页

  1. 打开浏览器,访问 https://www.weather.com.cn/weather/101010100.shtml (北京天气)。
  2. 在天气信息区域("7天预报")点击鼠标右键,选择“检查”或“检查元素”。
  3. 你会看到网页的源代码,我们需要找到包含天气数据的 HTML 标签。

通过分析,你会发现每天的天气信息都在一个 <li> 标签里,并且这个 <li> 标签有一个特定的 class"day7" 或其他,我们可以通过这个 class 来精确定位。

第 2 步:编写 Python 代码

下面是完整的代码,包含了详细的注释。

Python如何抓取天气数据?-图2
(图片来源网络,侵删)
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()

代码解释

  1. requests.get(url, ...): 向指定的 URL 发送一个 HTTP GET 请求,获取服务器返回的响应。
  2. headers: 模拟浏览器访问,防止被网站识别为爬虫而拦截。
  3. response.raise_for_status(): 如果请求失败(404 Not Found, 500 Server Error),这行代码会抛出异常。
  4. BeautifulSoup(response.text, 'html.parser'): 将服务器返回的 HTML 文本内容,用 Python 自带的解析器转换成一个 BeautifulSoup 对象,方便后续操作。
  5. soup.find('div', class_='t clearfix'): 在整个 HTML 中查找第一个 classt clearfix<div>
  6. .find_all('li'): 在刚刚找到的 <div> 标签内部,查找所有的 <li> 标签,返回一个列表。
  7. item.find('h1').text.strip(): 在每个 <li> 标签中,查找 <h1> 标签,获取其内部的文本内容,并用 .strip() 去除首尾多余的空格和换行符。

抓取心知天气 API (更专业、更稳定)

对于需要频繁、稳定获取天气数据的应用(比如个人项目、自动化脚本),直接解析网页 HTML 是不够健壮的,因为网站随时可能改版,导致你的爬虫失效。

最佳实践是使用 天气 API (Application Programming Interface),心知天气提供了免费的开发者服务,非常适合学习和使用。

第 1 步:获取 API 密钥

  1. 访问 心知天气 官网。
  2. 注册并登录账号。
  3. 进入“控制台” -> “我的密钥”,获取你的 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如何抓取天气数据?-图3
(图片来源网络,侵删)
  • 如果你是 Python 初学者,想学习爬虫的基本原理,请从 方法一 开始,亲手实践,你会对 requestsBeautifulSoup 有更深刻的理解。
  • 如果你要做一个自己的项目(比如桌面小工具、自动化脚本),请直接使用 方法二,这是更专业、更可靠、更长远的选择,花几分钟注册 API,能为你省去未来无数的维护麻烦。
分享:
扫描分享到社交APP
上一篇
下一篇