使用R语言抓取网页嵌入推文ID失败,求解决方法?
解决rvest抓取动态加载嵌入推文ID的问题
嘿,我来帮你搞定这个问题!你碰到的情况很典型——rvest的read_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_attr或html_text的使用。
内容的提问来源于stack exchange,提问作者mundos




