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

如何在R语言中抓取指定JSP页面的特定数据?

解决R语言抓取动态加载的墨西哥制裁名单页面问题

嘿,我碰到过类似的动态页面抓取问题!这个页面的"INHABILITADOS Y MULTADOS"板块内容是通过JavaScript动态加载的,直接用rvest的read_html()抓不到点击后才出现的数据——得用模拟浏览器行为的工具来搞定。下面给你两个靠谱的方案,一步步来:

方案一:用RSelenium(经典模拟浏览器工具)

RSelenium能模拟真实浏览器的点击、加载等操作,适合这类动态页面:

步骤1:安装并加载依赖包

install.packages(c("RSelenium", "rvest", "dplyr"))
library(RSelenium)
library(rvest)
library(dplyr)

步骤2:启动浏览器驱动并导航到目标页面

注意Chrome驱动要和你的浏览器版本匹配,如果不确定可以用chromever = "latest"自动匹配:

# 启动Chrome驱动
driver <- rsDriver(browser = "chrome", chromever = "latest")
remDr <- driver[["client"]]

# 导航到目标页面
remDr$navigate("http://directoriosancionados.funcionpublica.gob.mx/SanFicTec/jsp/Ficha_Tecnica/SancionadosN.htm")

步骤3:模拟点击"INHABILITADOS Y MULTADOS"选项

用XPath定位目标元素(如果页面结构变了,你可以按F12打开开发者工具,右键元素复制XPath):

# 定位并点击选项
inhabilitados_btn <- remDr$findElement(using = "xpath", value = "//*[contains(text(), 'INHABILITADOS Y MULTADOS')]")
inhabilitados_btn$clickElement()

步骤4:等待页面加载并抓取表格

动态加载需要一点时间,这里用Sys.sleep()等待,也可以用更智能的等待方法:

# 等待5秒确保表格加载完成
Sys.sleep(5)

# 获取加载后的页面源码
page_source <- remDr$getPageSource()[[1]]
page_html <- read_html(page_source)

# 抓取目标表格(注意:可能需要调整索引,比如[[2]],根据实际页面的表格顺序来)
sancionados_table <- page_html %>% html_table(fill = TRUE) %>% .[[2]]

# 清理数据:去掉空行,列名转小写
sancionados_df <- sancionados_table %>% 
  filter(rowSums(is.na(.)) != ncol(.)) %>% 
  rename_all(tolower)

步骤5:关闭驱动

remDr$close()
driver$server$stop()

方案二:用Playwright(更现代的无头浏览器工具)

Playwright是微软推出的工具,自动管理浏览器驱动,配置更简单:

步骤1:安装并初始化Playwright

install.packages("playwright")
library(playwright)
library(rvest)
library(dplyr)

# 初始化Playwright(第一次运行会自动下载浏览器驱动)
pw <- playwright$launch()
browser <- pw$chromium$launch(headless = FALSE) # headless=FALSE可以看到浏览器操作,方便调试
page <- browser$newPage()

步骤2:导航并点击目标选项

page$navigate("http://directoriosancionados.funcionpublica.gob.mx/SanFicTec/jsp/Ficha_Tecnica/SancionadosN.htm")

# 直接用文本定位点击,比XPath更简单
page$click("text=INHABILITADOS Y MULTADOS")

步骤3:等待表格加载并抓取数据

# 等待表格元素出现(智能等待,比固定睡眠更可靠)
page$waitForSelector("table")

# 获取页面源码并解析表格
page_source <- page$content()
page_html <- read_html(page_source)

sancionados_table <- page_html %>% html_table(fill = TRUE) %>% .[[2]]
sancionados_df <- sancionados_table %>% 
  filter(rowSums(is.na(.)) != ncol(.)) %>% 
  rename_all(tolower)

步骤4:关闭资源

page$close()
browser$close()
pw$stop()

关键注意事项

  • 元素定位调整:如果页面结构更新,XPath或文本选择器可能失效,一定要用浏览器开发者工具重新定位元素。
  • 分页处理:如果服务商列表是分页的,你需要循环模拟点击"下一页"按钮,把所有页的数据合并到data frame里。
  • 合规抓取:不要频繁请求政府网站,遵守网站的robots.txt和使用条款,避免触发反爬机制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:08:33