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  

最佳答案

RSeleniumrvest之间的区别是:


RSelenium运行一个真正的Web浏览器,因此它将加载网页中包含的所有javascript(在初始html加载后,javascript通常用于加载其他html元素或数据)。
rvest无法运行javascript,因此检索页面html的速度更快,但是在初始页面加载后会丢失所有使用javascript加载的元素。


一些有用的提示:


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

相关文章:

r - R中多个二项式随机数的仿真

r - 如何在R中建模多项式回归?

python - 正确的div类组合汤.select()

javascript - 使用Python-BeautifulSoup和urllib在网页上抓取奇怪的html设置

java - 带有Selenium的Chrome驱动程序:“找不到合适的RemoteWebDriver构造函数”

r - 没有安装apt-get的R Cairo安装

r - R使用ifelse()条件对多列进行突变

python - 使用选择器无法获取不同的“ h”标签的内容

java - 在Flipkart搜索结果页面中找不到元素

javascript - 页面对象模型或JavaScript测试替代品?