我正在抓取一些网页,我注意到 rvest(read_html,然后 html_text)提供的结果与 RSelenium(getPageSource())提供的结果不同。
更具体地说,当涉及下拉菜单时,使用 html_text 只会提供选项的名称,而使用 RSelenium 则可以获得选择后将定向到的页面的 url。
我的问题是:(1)为什么会出现这种差异,差异的本质到底是什么? (2) 有没有一种方法可以获得与 RSelenium 相同的源文本提取,但使用更快的方法,例如 rvest 包?
我尝试过使用 webdriver,一个 PhantomJS 实现,根据建议rvest 与 RSelenium 文本提取结果 https://stackoverflow.com/questions/56857535/rvest-vs-rselenium-results-for-text-extracting,并且它们的 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
and rvest
is:
-
RSelenium
运行真正的网络浏览器,因此它将加载网页中包含的任何 javascript(javascript 通常用于加载其他 html 元素或数据after初始 html 已加载)。
-
rvest
不运行 javascript,因此可以更快地检索页面 html,但会错过在初始页面加载后使用 javascript 加载的任何元素。
一些有用的提示:
- 当抓取不加载 JavaScript 的页面时,请使用 rvest。
- 当您必须使用 RSelenium 时,请尝试使用无头选项来提高速度(它将像平常一样在浏览器中加载页面,但不会显示任何图形元素,因此速度会更快)。
使用 RSelenium 无头的示例
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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)