You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用R语言抓取网页嵌入推文ID失败,求解决方法?

解决rvest抓取动态加载嵌入推文ID的问题

嘿,我来帮你搞定这个问题!你碰到的情况很典型——rvestread_html()只能获取页面的初始静态HTML,而这个嵌入的推文是通过JavaScript动态加载的。初始页面里的#twitter-widget-0其实只是个占位符,真正的推文数据(包括ID)都是JS运行后才填充进去的,所以直接抓自然拿不到内容。

下面给你两种可行的解决方案:

方法1:从初始页面的静态脚本中提取推文ID(推荐,更高效)

很多网站会把动态内容的数据源(比如推文ID)提前放在页面的<script>标签里,不需要模拟浏览器就能拿到。我们可以先找出包含推文信息的脚本,再用正则提取ID:

library(rvest)

page <- "https://deutsch.rt.com/amerika/86714-rund-woche-nach-russland-auch-china-schickt-militaer-nach-venezuela/"
html <- read_html(page)

# 提取页面所有<script>标签的内容
all_scripts <- html %>% html_nodes("script") %>% html_text()

# 筛选包含推特推文相关关键词的脚本(比如tweetId、twitter-widget)
target_script <- grep("tweetId|twitter-widget", all_scripts, value = TRUE)

# 用正则匹配10位以上的数字(推特ID通常是10+位数字)
tweet_id <- regmatches(target_script, regexpr("\\d{10,}", target_script))

# 输出结果
print(tweet_id)

方法2:用浏览器模拟工具执行JavaScript(适合完全动态加载的场景)

如果初始页面里找不到预加载的ID数据,那我们需要用能模拟浏览器运行JS的工具,比如RSelenium或者chromote。这里以RSelenium为例(需要提前安装ChromeDriver或其他浏览器驱动):

library(RSelenium)
library(rvest)

# 启动Chrome浏览器驱动(端口可以自定义,避免冲突)
driver <- rsDriver(browser = "chrome", port = 4567L)
remDr <- driver[["client"]]

# 访问目标页面
remDr$navigate(page)

# 等待几秒,让页面和JS完全加载完成
Sys.sleep(3)

# 获取加载后的完整页面源码
loaded_page_source <- remDr$getPageSource()[[1]]
loaded_html <- read_html(loaded_page_source)

# 现在可以抓取#twitter-widget-0的属性,比如data-tweet-id
tweet_element <- loaded_html %>% html_nodes('#twitter-widget-0')
tweet_id <- html_attr(tweet_element, "data-tweet-id")

# 输出结果
print(tweet_id)

# 记得关闭浏览器和驱动
remDr$close()
driver$server$stop()

补充说明

  • 方法1优先尝试,因为不需要额外配置浏览器驱动,速度更快;
  • 如果用RSelenium,要确保你的Chrome版本和ChromeDriver版本匹配,不然会启动失败;
  • 有些网站的推文ID可能藏在data-tweet-id属性里,也可能在元素的innerHTML中,你可以根据实际情况调整html_attrhtml_text的使用。

内容的提问来源于stack exchange,提问作者mundos

火山引擎 最新活动