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

为何无法用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:49:02