r - rvest::html_text 和 RSelenium::getPageSource 有什么区别?

标签 r web-scraping webdriver rvest rselenium

我正在抓取一些网页,我注意到 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 加载的任何元素。

一些有用的提示:

  • 抓取不加载 JavaScript 的页面时,请使用 rvest。
  • 当您必须使用 RSelenium 时,请尝试使用 headless 选项来提高速度(它将像平常一样在浏览器中加载页面,但不会显示任何图形元素,因此速度会更快)。

使用 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/

相关文章:

r - 当有行名时,write.table 将不需要的前导空列写入标题

r - 计算给定条件的百分比

python - 抓取网站的所有列表,超出页面限制

python - 使用 python/selenium 保存完整的网页(包括 css,图像)

python - 如何抓取具有特定选项值的选项

java - 如何从 selenium webdriver 的子菜单中选择下拉菜单

python Selenium : Having trouble fixing NoSuchElementException for a specific button

C# 裁剪图像返回错误坐标

R - 逗号分隔的列表之间是否至少有一个匹配项?

r - 编译 R 3.3.1