rvest::html_text 和 RSelenium::getPageSource 有什么区别?
What is the difference between rvest::html_text and RSelenium::getPageSource?
我正在抓取一些网页,我注意到 rvest(read_html,然后 html_text)提供的结果与 RSelenium(getPageSource())提供的结果不同。
更具体地说,当涉及下拉菜单时,使用 html_text 只会为您提供选项的名称,而使用 RSelenium 则可以获得您将被定向到的页面的 url一旦你选择了一个。
我的问题是:(1) 为什么会有差异,差异的性质究竟是什么?和 (2) 有没有办法获得与 RSelenium 相同的源文本提取,但使用更快的方法,如 rvest 包?
根据 rvest vs RSelenium results for text extracting 的建议,我尝试使用 PhantomJS 实现 webdriver,它们的 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是不一样的。更具体地说,我的重点是从单词 "Tools" 开始,这是用于选择本网站提供的有关 "Tools" 的不同选项卡的下拉菜单的部分。
只显示一小块,在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 的示例
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)
我正在抓取一些网页,我注意到 rvest(read_html,然后 html_text)提供的结果与 RSelenium(getPageSource())提供的结果不同。
更具体地说,当涉及下拉菜单时,使用 html_text 只会为您提供选项的名称,而使用 RSelenium 则可以获得您将被定向到的页面的 url一旦你选择了一个。
我的问题是:(1) 为什么会有差异,差异的性质究竟是什么?和 (2) 有没有办法获得与 RSelenium 相同的源文本提取,但使用更快的方法,如 rvest 包?
根据 rvest vs RSelenium results for text extracting 的建议,我尝试使用 PhantomJS 实现 webdriver,它们的 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是不一样的。更具体地说,我的重点是从单词 "Tools" 开始,这是用于选择本网站提供的有关 "Tools" 的不同选项卡的下拉菜单的部分。
只显示一小块,在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 的示例
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)