如何用Selenium爬取逐小时辐照值并填充未来14天的DataFrame
解决tutiempo.net逐小时辐照值爬取并填充DataFrame的问题
一、简化目标DataFrame的创建方式
你原来的代码可以用pandas内置方法简化,避免手动循环:
from datetime import date, timedelta import pandas as pd # 生成未来14天的日期(从次日开始计算) dates = pd.date_range(start=date.today() + timedelta(days=1), periods=14) # 生成小时索引(包含24:00以匹配网站数据格式) hours = [f"{h:02d}:00" for h in range(24)] + ["24:00"] # 直接创建全0初始化的DataFrame irradiation = pd.DataFrame(0, index=hours, columns=dates)
二、完整爬取并填充DataFrame的Selenium代码
以下是实现全流程自动化的代码,包含Cookie弹窗处理、数据解析和DataFrame填充:
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 datetime import date, timedelta import pandas as pd # 初始化浏览器与目标DataFrame driver = webdriver.Chrome() driver.get("https://www.tutiempo.net/radiacion-solar/madrid.html") dates = pd.date_range(start=date.today() + timedelta(days=1), periods=14) hours = [f"{h:02d}:00" for h in range(24)] + ["24:00"] irradiation = pd.DataFrame(0, index=hours, columns=dates) # 处理Cookie弹窗(显式等待比固定sleep更可靠) try: cookie_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "cookie_action_close_header")) ) cookie_btn.click() except: # 若弹窗未出现则跳过 pass # 遍历14天的数据块 for day_idx in range(1, 15): hour_block = driver.find_element(By.ID, f"HorasDia{day_idx}") # 拆分文本为行,过滤空行 rows = [row.strip() for row in hour_block.text.split("\n") if row.strip()] # 匹配当前遍历的日期 target_date = dates[day_idx - 1] # 解析每行的小时与辐照值 for row in rows: parts = row.split() if len(parts) != 2: continue hour_str, irradiance_val = parts # 确保小时格式匹配DataFrame索引 if hour_str not in irradiation.index: continue # 填充数据到对应位置 irradiation.loc[hour_str, target_date] = float(irradiance_val) # 关闭浏览器并输出结果 driver.quit() print(irradiation) # 可选:保存为CSV文件 # irradiation.to_csv("irradiation_data.csv")
三、关键步骤说明
- 显式等待替代固定sleep:用
WebDriverWait等待Cookie按钮可点击,避免等待时间过长或不足的问题。 - 文本解析逻辑:拆分获取到的文本块,过滤无效空行后,将每行拆分为小时字符串和辐照值,确保格式合规才进行填充。
- 日期与索引匹配:
day_idx从1到14,对应dates列表的第0到13个元素,通过dates[day_idx-1]精准匹配目标列。 - 异常容错:添加Cookie弹窗的异常捕获,同时跳过格式异常的行,避免解析失败导致代码中断。
内容的提问来源于stack exchange,提问作者srgam
相关产品推荐
相关产品推荐

