如何提取EMMSA网站JS渲染PHP表格的日度价量数据
EMMSA日度成交量、价格数据爬取方案
问题背景
- 目标数据:站点内日度频率的成交量、成交价格数据,对应页面地址为
http://old.emmsa.com.pe/emmsa_spv/rpEstadistica/rptVolPreciosDiarios.php - 爬取难点:页面为JavaScript动态渲染,目标表格数据需要完成两步表单交互操作才能完成加载,普通静态爬取方案无法获取有效数据
- 原有代码问题:适配其他站点爬取场景编写的Rcrawler脚本和当前站点结构完全不匹配,仅能抓取到站点首页的无效文件,没有触发页面的动态交互逻辑,也没有定位到渲染完成的结果表格
- 页面交互及展示参考:


可用爬取脚本(R语言实现)
方案采用浏览器自动化工具模拟真实用户的点击、选择操作,完整触发两步数据加载流程后,直接提取渲染完成的表格数据,无需逆向分析站点接口。
# 首次运行请先安装依赖包 if (!require("RSelenium")) install.packages("RSelenium") if (!require("rvest")) install.packages("rvest") if (!require("dplyr")) install.packages("dplyr") library(RSelenium) library(rvest) library(dplyr) # 启动Chrome浏览器驱动 rD <- rsDriver(browser = "chrome", port = 4567L, chromever = "latest", verbose = FALSE) remDr <- rD$client # 跳转至目标数据页面 remDr$navigate("http://old.emmsa.com.pe/emmsa_spv/rpEstadistica/rptVolPreciosDiarios.php") Sys.sleep(3) # 等待初始页面资源加载完成 # ---------- 第一步交互:选择查询日期,触发第二层选项加载 ---------- # 定位日期输入框并点击唤起日历 date_input <- remDr$findElement(using = "name", value = "txtfecha") date_input$clickElement() Sys.sleep(1) # 选中日历中最新的可选日期,若需指定日期可直接给输入框传值:date_input$sendKeysToElement(list("2024-05-20")) latest_available_date <- remDr$findElement(using = "css", value = ".calendar-day:not(.disabled):last-child") latest_available_date$clickElement() Sys.sleep(1) # 点击首次查询按钮 first_confirm_btn <- remDr$findElement(using = "css", value = "input[type='submit'][value='Consultar']") first_confirm_btn$clickElement() Sys.sleep(3) # 等待第二层筛选模块加载完成 # ---------- 第二步交互:触发结果表格加载 ---------- report_btn <- remDr$findElement(using = "css", value = "input[type='button'][value='Ver Reporte']") report_btn$clickElement() Sys.sleep(6) # 等待全量表格数据渲染完成,数据量较大时可适当调长等待时间 # ---------- 提取并保存数据 ---------- page_raw <- remDr$getPageSource()[[1]] result_data <- read_html(page_raw) %>% html_element(css = "#divResultado table") %>% html_table(fill = TRUE) # 预览数据前6行 head(result_data) # 将数据保存为本地CSV文件 write.csv(result_data, "emmsa_daily_price_volume.csv", row.names = FALSE, fileEncoding = "UTF-8") # 爬取完成后关闭浏览器和驱动进程 remDr$close() rD$server$stop()
使用说明
- 若运行时提示找不到对应元素,可手动打开目标页面按F12调出开发者工具,核对表单按钮、结果表格的CSS选择器后微调代码即可
- 若需要批量爬取历史日期数据,可加循环逻辑修改日期输入框的传值,每次请求后增加3-5秒的随机等待时间,避免请求频率过高被站点限制访问
- 若遇到Chrome驱动和本地浏览器版本不匹配的报错,将代码中
chromever = "latest"修改为本地安装的Chrome对应版本号即可 - 爬取的数据请仅用于合法研究用途,遵守站点相关访问规则,控制请求频率避免给站点服务器造成额外压力
内容的提问来源于stack exchange,提问作者Carlos Garibotto
相关产品推荐
相关产品推荐

