【问题标题】:What is the difference between rvest::html_text and RSelenium::getPageSource?rvest::html_text 和 RSelenium::getPageSource 有什么区别?
【发布时间】:2019-12-13 16:09:52
【问题描述】:

我正在抓取一些网页,其中我注意到 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  

【问题讨论】:

  • 请经常检查,网页的所有者是否允许抓取网页。 robotstxt::paths_allowed(test_url) 产生 FALSE,因此您不应将其用作示例。
  • 感谢您的提醒!这是一个有用的包,我一定会使用。我已经相应地更改了示例。

标签: r web-scraping webdriver rvest rselenium


【解决方案1】:

RSeleniumrvest的区别是:

  • RSelenium 运行一个真正的网络浏览器,因此它会加载网页中包含的任何 javascript(javascript 通常用于在加载初始 html 之后加载额外的 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) 

【讨论】:

  • 你能澄清一下如何做一个无头选项吗?我正在为报纸文章和论文抓取页面,最终代码没有加载实际页面是有道理的。谢谢
  • @AndersJørgensen 当然,我现在就添加它
  • @AndersJørgensen 如果你有具体的网址,请告诉我,我会以它为例
  • 我是报纸的主页是:berlingske.dk.
  • 啊,我没有看到您的编辑。还是谢谢你
猜你喜欢
  • 2010-10-02
  • 2011-12-12
  • 2010-09-16
  • 2012-03-14
  • 2012-02-06
  • 2011-02-25
  • 2011-11-22
  • 2015-03-26
  • 2013-08-19
相关资源
最近更新 更多