Python实现指定水文站日最大流量数据提取需求咨询
Python提取水文站日最大流量动态数据方案
因为目标站点是动态渲染页面,普通的requests/bs4无法获取JS加载的表格数据,用Selenium模拟浏览器操作是最直接的解决方案。以下是完整的可运行代码,实现输入水文站编码即可导出自建站至今的「日最大流量」数据到CSV。
依赖安装
先安装所需库:
pip install selenium pandas webdriver-manager
完整代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager import pandas as pd def extract_daily_max_flow(station_code, output_file='daily_max_flow.csv'): # 初始化Chrome浏览器(自动匹配驱动版本) driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) try: # 构造目标URL url = f"https://hydro.eaufrance.fr/sitehydro/{station_code}/series" driver.get(url) # 等待页面加载,选择「日最大流量」数据项 wait = WebDriverWait(driver, 10) # 定位日最大流量选项(根据页面实际元素调整xpath) flow_option = wait.until(EC.element_to_be_clickable((By.XPATH, "//label[contains(text(), 'Débit maximal journalier')]"))) flow_option.click() # 选择日期范围为「自建站至今」 date_range_option = wait.until(EC.element_to_be_clickable((By.XPATH, "//select[@id='periodeSelect']/option[contains(text(), 'Depuis la création')]"))) date_range_option.click() # 点击确认按钮加载数据 confirm_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@id='validerPeriode']"))) confirm_btn.click() # 等待表格加载完成 wait.until(EC.presence_of_element_located((By.ID, "tableauDonnees"))) # 提取表格数据到DataFrame table = driver.find_element(By.ID, "tableauDonnees") df = pd.read_html(table.get_attribute('outerHTML'))[0] # 导出为CSV df.to_csv(output_file, index=False, encoding='utf-8-sig') print(f"数据已成功导出到 {output_file}") return df finally: # 确保浏览器关闭 driver.quit() # 调用示例:提取巴黎水文站数据 extract_daily_max_flow('F7000001')
关键说明
- 元素定位:代码中的XPath是基于页面当前结构编写的,如果后续站点UI更新,需要检查元素的ID或文本内容调整XPath。
- 等待机制:用
WebDriverWait替代硬等待,确保元素加载完成后再操作,避免报错。 - 驱动管理:
webdriver-manager会自动下载匹配当前Chrome版本的驱动,无需手动配置。 - 编码设置:导出CSV时用
utf-8-sig,确保特殊字符能正常显示。
注意事项
- 如果使用Firefox,只需把Chrome相关代码替换为
webdriver.Firefox和GeckoDriverManager。 - 若遇到反爬机制,可添加隐式等待、随机延迟,或配置浏览器无头模式(添加
options.add_argument('--headless=new'))。
内容的提问来源于stack exchange,提问作者Reda Faiq
相关产品推荐
相关产品推荐

