我正在抓取许多网页,在那里我注意到 rvest(read_html,然后是 html_text)提供的结果和 RSelenium(getPageSource())提供的结果不同。
更具体地说,当涉及下拉菜单时,使用 html_text 只会为您提供选项的名称,而使用 RSelenium 时,您可以获取选择一个后将被定向到的页面的 url。
我的问题是:(1)为什么会有差异,差异的本质是什么?和 (2) 有没有办法获得与 RSelenium 相同的源文本提取,但使用更快的方法,例如 rvest 包?
根据 rvest vs RSelenium results for text extracting 的建议,我尝试使用 webdriver,一个 PhantomJS 实现,并且它们的 getSource 函数确实提供了与 RSelenium 相同的结果。然而,虽然这比 RSelenium 快,但它仍然比 rvest 慢得多。
library(rvest)
library(RSelenium)
library(webdriver)
library(tictoc)
library(robotstxt)
test_url <- "https://www.bea.gov"
robotstxt::paths_allowed(test_url)
# rvest
tictoc::tic()
resultA <- html_text(read_html(test_url))
tictoc::toc()
# RSelenium
tictoc::tic()
remDr <- remoteDriver(port = 4445L, browserName = "firefox")
remDr$open()
remDr$navigate(test_url)
resultB <- remDr$getPageSource(test_url)
tictoc::toc()
# webdriver
tictoc::tic()
pjs <- run_phantomjs()
ses <- Session$new(port = pjs$port)
ses$go(test_url)
resultC <- ses$getSource()
tictoc::toc()
您可以看到 resultA 与 resultB 和 resultC 不同。更具体地说,我的重点是从“工具”这个词开始,这是用于选择有关本网站提供的“工具”的不同选项卡的下拉菜单的部分。
只显示一小块,在 rvest 中选择“BEARFACTS”是:
BEARFACTS\n \n \n
而在 RSelenium 中,它类似于以下内容:
<li class=\"expanded dropdown\">\n <a href=\"https://apps.bea.gov/regional/bearfacts/\">BEARFACTS</a>\n
最佳答案
RSelenium
和 rvest
的区别在于:
RSelenium
运行真正的网络浏览器,因此它将加载网页中包含的任何 javascript(javascript 通常用于在初始 html 加载后加载其他 html 元素或数据)。 rvest
不运行 javascript,因此可以更快地检索页面 html,但在初始页面加载后会错过任何使用 javascript 加载的元素。 一些有用的提示:
使用 RSelenium headless 的示例
eCaps <- list(chromeOptions = list(
args = c('--headless', '--disable-gpu', '--window-size=1280,800')
))
rD <- rsDriver(browser=c("chrome"), verbose = TRUE, chromever="78.0.3904.105", port=4447L, extraCapabilities = eCaps)
关于r - rvest::html_text 和 RSelenium::getPageSource 有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57370389/