无需Docker,R抓取动态网页表格遇阻,求简便解决方案
抓取佐治亚州众议院议员表格的最简方案
问题概述
需要抓取https://www.legis.ga.gov/members/house页面的议员表格,在以下环境尝试多种方法均失败:
- Chrome版本:109.0.5414.119
- 系统:macOS Ventura
- R版本:4.2.0
尝试1:rvest无法获取动态生成的表格
使用rvest直接请求页面,但因表格是JavaScript动态渲染,原始HTML中无表格元素,报错如下:
library(rvest) url <- 'https://www.legis.ga.gov/members/house' page = read_html(url) page %>% html_element("table") %>% html_table() # Error in View : no applicable method for 'html_table' applied to an object of class "xml_missing"
尝试2:RSelenium无法确定服务器状态
尝试用RSelenium启动Chrome驱动,但无法确认服务器状态,相关代码及警告:
library(RSelenium) rD = rsDriver(browser="chrome", port=4234L, chromever="109.0.5414.74") # Warning message: # In rsDriver(browser = "chrome", port = 4234L, chromever = "109.0.5414.74") : # Could not determine server status. library(wdman) selServ <- wdman::selenium(verbose = FALSE) selServ$log() # $stderr # [1] "" # # $stdout # [1] ""
尝试3:splashr安装失败
尝试安装splashr包时,因版本不兼容无法安装:
Warning in install.packages :
package ‘splashr’ is not available for this version of R
且不愿通过Docker部署splash,寻求无需额外软件的最简方案。
最简解决方案:直接调用数据API
该页面的议员数据实际通过后端API加载,无需处理动态渲染,直接请求API即可获取结构化数据:
实现代码
library(httr) library(jsonlite) # 请求议员数据API(sessionId需匹配当前页面使用的会话,当前为1022) api_response <- GET("https://www.legis.ga.gov/api/members/house?sessionId=1022") # 解析JSON响应为数据框 house_members <- as.data.frame(fromJSON(content(api_response, "text"))) # 查看前几行数据 head(house_members)
说明
- 该API返回完整的议员结构化数据,包含姓名、选区、党派、联系方式等所有表格内的信息
- 若后续sessionId更新,可通过浏览器开发者工具(F12 -> Network -> XHR)找到最新的API请求链接
- 此方法无需依赖Selenium、Docker或其他动态渲染工具,仅需基础的HTTP请求和JSON解析包,是最简洁高效的方式
内容的提问来源于stack exchange,提问作者user3710004
相关产品推荐
相关产品推荐

