如何从含隐藏XHTML区块的动态网页批量爬取下载CSV文件
问题原因
你使用requests仅能获取到部分内容的核心原因是该站点采用frameset框架嵌套结构+前端JS动态渲染逻辑:
- 你代码返回的
<noframes>标签内的内容是站点为不支持框架的浏览器提供的降级展示内容,并非实际渲染的页面主体 - requests只发送静态HTTP请求,不会自动加载嵌套frame的内容,也不会执行页面内的JS代码生成动态元素,因此拿不到你在浏览器检查工具里看到的
<a>标签等动态内容。
解决方案
你原本规划的使用Selenium实现自动化下载的策略是可行的,无需额外先抓取静态HTML找规律,直接通过Selenium模拟浏览器行为即可拿到完整渲染后的DOM,参考实现逻辑如下:
- 环境准备:安装selenium以及对应浏览器的驱动(推荐使用ChromeDriver或GeckoDriver)
- 参考代码示例:
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
相关产品推荐
相关产品推荐

