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

如何提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:57:23