为何无法用rvest提取目标表格?除RSelenium外还有替代方案吗?
不用RSelenium提取动态表格的解决方案
首先得明确问题根源:你用rvest拿不到数据,是因为这个网站的区域销售、股东表格是JavaScript动态渲染出来的——初始加载的静态HTML里根本没有这些表格内容,所以你的xpath定位再精准也抓不到空节点。
下面给你几个不用RSelenium的替代思路:
1. 直接抓后端API接口(最推荐)
现代网站大多会通过AJAX请求从后端API拉取数据,你可以通过浏览器开发者工具找到这些接口:
- 打开目标页面,按F12调出开发者工具,切换到「Network」标签
- 刷新页面,筛选「XHR/Fetch」类型的请求,找名字带
shareholders、regional-sales这类关键词的接口 - 复制接口URL、请求头(比如
User-Agent、Referer,这些是反爬常用的验证字段),用httr包发送请求拿JSON数据,再转成R数据框
示例代码:
library(httr) library(jsonlite) # 替换成你找到的实际API接口 api_url <- "https://www.marketscreener.com/api/v1/company/2955923/shareholders" request_headers <- add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Referer" = "https://www.marketscreener.com/ZURICH-INSURANCE-GROUP-2955923/company/" ) # 发送请求并解析数据 response <- GET(api_url, request_headers) raw_data <- fromJSON(content(response, "text")) shareholders_df <- as.data.frame(raw_data$data)
2. 解析页面内嵌的JavaScript变量
有些网站会把数据直接存在页面的<script>标签里(比如window.__DATA__这类全局变量),你可以用V8包解析这些JS代码提取数据:
- 先用rvest抓页面所有script标签的内容
- 找到包含目标数据的那一段script(用关键词 grep 筛选)
- 用V8引擎执行这段JS,把变量里的数据导出来转成数据框
示例代码:
library(rvest) library(V8) library(jsonlite) url <- "https://www.marketscreener.com/ZURICH-INSURANCE-GROUP-2955923/company/" page <- read_html(url) # 提取所有script标签文本 all_scripts <- page %>% html_elements("script") %>% html_text2() # 筛选包含股东/销售数据的script(替换关键词为实际内容) target_script <- grep("shareholderList", all_scripts, value = TRUE) # 初始化V8环境,执行JS代码提取数据 ctx <- v8() ctx$eval(target_script) raw_data <- ctx$get("shareholderList") shareholders_df <- as.data.frame(raw_data)
3. 用curl配合R调用复杂请求
如果API需要处理cookie、复杂参数,你可以先用curl命令行测试请求,再在R中调用curl获取数据:
library(processx) # 替换成你调试好的curl命令 curl_command <- 'curl "https://www.marketscreener.com/api/v1/company/2955923/regional-sales" -H "User-Agent: Mozilla/5.0..." -H "Referer: https://www.marketscreener.com/..."' # 执行curl命令并解析结果 curl_result <- run("bash", args = c("-c", curl_command)) raw_data <- fromJSON(curl_result$stdout) regional_sales_df <- as.data.frame(raw_data$data)
重要提示
- 先看网站的
robots.txt,确保你的爬虫行为符合规则,别触发反爬机制被封禁 - 如果API需要登录,你可以先用
rvest的html_session模拟登录,拿到session cookie后再传给API请求
内容的提问来源于stack exchange,提问作者Jane
相关产品推荐
相关产品推荐

