You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何完善Python Selenium代码抓取Windguru需登录存档的风向角度数据

问题描述

我尝试从Windguru抓取2020-2023年的气象数据,目标页面是https://www.windguru.cz/archive.php?id_spot=4910&id_model=3&date_from=2020-08-01&date_to=2023-08-01,重点关注风向数据——页面中以箭头展示,需要提取箭头对应的底层角度值。该网站需邮箱登录才能查看数据,我用Python的Selenium写了基础代码,但不知道如何继续提取角度,希望完善代码或提供替代方案。

原代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options

options = webdriver.ChromeOptions()
options.add_argument("--headless")
driver = webdriver.Chrome(options = options)
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")
driver = webdriver.Chrome()
driver.get('https://www.windguru.cz/archive.php?id_spot=4910&id_model=3&date_from=2020-08-01&date_to=2023-08-01')
WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#forecasts-page")))
解决方案

完善后的Selenium实现

1. 修复原代码的参数问题

原代码重复初始化driver,导致之前设置的--headless等参数失效,先修正这部分逻辑。

2. 模拟登录流程

网站需要登录验证,需添加邮箱、密码输入及表单提交步骤。若存在验证码,需手动切换非无头模式输入,或接入第三方打码服务。

3. 提取风向角度

Windguru的风向箭头通过CSS的transform: rotate(XXdeg)属性控制角度,只需定位箭头元素,提取该属性并解析数值即可。

完整代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re

# 配置Chrome浏览器选项
options = webdriver.ChromeOptions()
options.add_argument("--headless=new")  # 新版无头模式兼容性更好
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")
options.add_argument("--start-maximized")  # 避免窗口尺寸导致元素定位失败

# 初始化浏览器实例
driver = webdriver.Chrome(options=options)

try:
    # 打开目标存档页面
    driver.get('https://www.windguru.cz/archive.php?id_spot=4910&id_model=3&date_from=2020-08-01&date_to=2023-08-01')

    # 等待登录表单加载,输入账号密码
    email_input = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.ID, "login-email"))
    )
    email_input.send_keys("你的邮箱地址")

    password_input = driver.find_element(By.ID, "login-password")
    password_input.send_keys("你的登录密码")

    # 提交登录表单
    login_btn = driver.find_element(By.CSS_SELECTOR, "button[type='submit']")
    login_btn.click()

    # 等待存档数据页面完全加载
    WebDriverWait(driver, 15).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, "#forecasts-page"))
    )

    # 定位所有风向箭头元素(需根据实际页面调整选择器,示例为.wind-dir)
    wind_arrows = driver.find_elements(By.CSS_SELECTOR, ".wind-dir")

    # 解析并收集角度值
    wind_angles = []
    for arrow in wind_arrows:
        style_attr = arrow.get_attribute("style")
        # 用正则匹配rotate后的角度数值
        angle_match = re.search(r'rotate\((\d+)deg\)', style_attr)
        if angle_match:
            angle = int(angle_match.group(1))
            wind_angles.append(angle)
            print(f"风向角度: {angle}°")

    # 将结果保存到本地文件
    with open("wind_angles.txt", "w", encoding="utf-8") as f:
        for angle in wind_angles:
            f.write(f"{angle}\n")
    print(f"共提取{len(wind_angles)}个风向角度,已保存至wind_angles.txt")

finally:
    # 确保浏览器关闭
    driver.quit()

注意事项

  • 元素选择器调整:用浏览器开发者工具(F12)查看实际风向箭头的CSS类名或ID,替换代码中的.wind-dir。
  • 分页处理:若数据分页展示,需添加循环点击分页按钮的逻辑,逐页提取角度。
  • 验证码处理:若登录时出现验证码,需注释掉--headless参数,手动输入验证码后再继续执行。

更高效的替代方案:API请求

直接通过API获取数据比模拟浏览器更高效。打开浏览器开发者工具的「网络」标签,查看页面加载时的请求,找到返回气象数据的接口(通常是JSON格式),携带日期范围、站点ID等参数,用requests库直接请求:

import requests

# 示例API请求(需根据实际接口调整)
headers = {
    "Cookie": "你的登录Cookie",  # 登录后从浏览器复制
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
params = {
    "id_spot": 4910,
    "id_model": 3,
    "date_from": "2020-08-01",
    "date_to": "2023-08-01"
}

response = requests.get("https://www.windguru.cz/api/archive", headers=headers, params=params)
data = response.json()

# 从返回的JSON中提取风向角度(需根据实际数据结构调整)
wind_angles = [item["wind_dir_angle"] for item in data["archive"]]
print(wind_angles)

说明

  • Cookie获取:登录网站后,从浏览器开发者工具的「应用」标签复制Cookie值,用于请求验证。
  • 接口结构:实际接口地址和返回数据结构需自行抓包分析,上述仅为示例。

内容的提问来源于stack exchange,提问作者Will

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:24:51