使用R语言rvest爬取网页表格仅返回空表格问题求助
问题原因
目标页面的核心趋势表格是通过JavaScript动态渲染生成的,rvest的read_html()只能抓取页面初始加载的静态HTML,没法执行页面里的JS代码,所以拿不到真正的趋势数据。你现在输出的只是页面顶部的静态标题表格,不是要找的目标表格。
解决方案
方法1:用RSelenium模拟浏览器加载动态内容
RSelenium能模拟真实浏览器打开页面,等JS渲染完成后再抓取内容,示例代码如下:
library(RSelenium) library(rvest) library(dplyr) # 启动Chrome浏览器驱动(需提前安装对应版本的ChromeDriver) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 访问目标页面 remDr$navigate("https://archive.twitter-trending.com/united-states/16-11-2023") # 等待3秒让页面加载完成(可根据网络情况调整时长) Sys.sleep(3) # 获取渲染后的页面源码 page_source <- remDr$getPageSource()[[1]] tt <- read_html(page_source) # 提取并打印所有表格 my_tables <- html_nodes(tt, "table") for (table in my_tables) { print(table %>% html_table()) } # 用完关闭浏览器和驱动 remDr$close() driver$server$stop()
方法2:用rvest+V8直接执行页面JS
如果页面JS逻辑不复杂,可以直接提取页面里存储数据的JS变量,用V8引擎解析:
library(rvest) library(V8) library(dplyr) link <- 'https://archive.twitter-trending.com/united-states/16-11-2023' tt <- read_html(link) # 提取包含趋势数据的JS脚本(需查看页面源码确认变量名,这里是trendsData) js_script <- html_nodes(tt, "script") %>% html_text() %>% grep("trendsData", ., value = TRUE) # 初始化V8引擎并执行JS ctx <- v8() ctx$eval(js_script) # 提取并输出数据 trends_data <- ctx$get("trendsData") print(trends_data)
注意:这个方法依赖页面的JS变量名,如果网站更新代码结构,需要重新查找对应变量。
内容的提问来源于stack exchange,提问作者Alexandros
相关产品推荐
相关产品推荐

