如何在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
相关产品推荐
相关产品推荐

