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

如何从含隐藏XHTML区块的动态网页批量爬取下载CSV文件

问题原因

你使用requests仅能获取到部分内容的核心原因是该站点采用frameset框架嵌套结构+前端JS动态渲染逻辑:

  • 你代码返回的<noframes>标签内的内容是站点为不支持框架的浏览器提供的降级展示内容,并非实际渲染的页面主体
  • requests只发送静态HTTP请求,不会自动加载嵌套frame的内容,也不会执行页面内的JS代码生成动态元素,因此拿不到你在浏览器检查工具里看到的<a>标签等动态内容。
解决方案

你原本规划的使用Selenium实现自动化下载的策略是可行的,无需额外先抓取静态HTML找规律,直接通过Selenium模拟浏览器行为即可拿到完整渲染后的DOM,参考实现逻辑如下:

  1. 环境准备:安装selenium以及对应浏览器的驱动(推荐使用ChromeDriver或GeckoDriver)
  2. 参考代码示例:
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 time

# 配置Chrome浏览器自动下载CSV的参数
options = webdriver.ChromeOptions()
prefs = {
    "download.default_directory": "你本地的下载目录路径",
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "safebrowsing.enabled": True
}
options.add_experimental_option("prefs", prefs)

driver = webdriver.Chrome(options=options)
driver.get("http://data.cnmc.es/datagraph/jsp/inf_trim.jsp")

# 等待页面所有frame和动态元素加载完成,最多等待10秒
wait = WebDriverWait(driver, 10)
# 如果页面内容在指定frame中,需要先切换到对应frame,可根据实际frame的id/name调整
# driver.switch_to.frame("frame的id或name")

# 此时获取的page_source就是你在浏览器检查工具中看到的完整HTML
full_html = driver.page_source

# 接下来定位所有CSV对应的单选按钮或下载链接,循环点击下载即可
# 示例:定位所有符合条件的单选按钮
radio_buttons = driver.find_elements(By.CSS_SELECTOR, "你要定位的单选按钮的CSS选择器")
for btn in radio_buttons:
    btn.click()
    # 等待下载触发,可根据实际情况调整等待时间,或监听下载目录确认文件下载完成
    time.sleep(2)

driver.quit()
策略优化建议
  • 若页面加载完成后元素定位失败,优先检查是否需要切换到嵌套的iframe中再执行元素定位
  • 若点击单选按钮后需要二次点击下载按钮,可在点击单选按钮后新增等待逻辑,等下载按钮出现后再触发点击
  • 批量下载时建议增加重试逻辑,避免因网络波动导致漏下文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:15:02