如何完善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
相关产品推荐
相关产品推荐

