在抓取 html 页面之前,是否需要在 rvest 中使用 read_html?

Is there a need to use read_html in rvest before scraping an html page?

我正在使用 rvest 抓取网页。 我曾经用 url 打开一个会话并直接调用函数,例如 html_node().

我注意到我看到的大多数示例在分析页面内容之前先阅读页面。 我测试了这两个选项并测量了系统运行时间,没有发现明显差异。 谁能告诉我是否真的需要用 read_html() 提前阅读整个页面?

这是一个示例测试

library(rvest)
url="https://cran.r-project.org/doc/manuals/r-release/R-lang.html"
sess=html_session(url )
system.time(html_nodes(sess,"div"))
#   user  system elapsed 
#   0.02    0.00    0.02 
> system.time(html_nodes(read_html(sess),"div"))
#   user  system elapsed 
#   0.02    0.00    0.02 

谢谢

确实,你的两个调用是等价的。 html_nodes 以 url 作为第一个参数只是在 read_html(url) 上调用 html_nodes,如您所见。您的第一次调用使用 html_nodes.default,第二次调用 html_nodes.session.

> getFromNamespace("html_nodes.session","rvest")

function (x, css, xpath) 
{
    html_nodes(xml2::read_html(x), css, xpath)
}
<environment: namespace:rvest>

我仍然更喜欢 read_html 的主要原因是我经常在一个页面上执行多个操作(读取一些节点,然后读取其他一些节点并编译所有信息)。使用 read_html 一次以执行多个 html_nodes 将在长 运行.

中更快
library(rvest)

url="https://cran.r-project.org/doc/manuals/r-release/R-lang.html"
sess=html_session(url )

no_read <- function(sess){
  html_nodes(sess,"div")
  html_nodes(sess,"p")
}

do_read <- function(sess) {
  p <- read_html(sess)
  html_nodes(p,"div")
  html_nodes(p,"p")
}

library(microbenchmark)
microbenchmark(no_read(sess),do_read(sess))
Unit: milliseconds
          expr      min       lq     mean   median       uq      max neval
 no_read(sess) 41.42506 44.06154 55.05718 46.62327 66.03544 190.4596   100
 do_read(sess) 28.71807 31.33751 42.38105 33.21593 47.32962 240.6938   100