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

时间:2015-11-30 14:57:00

标签: r rvest

我正在使用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 

由于

1 个答案:

答案 0 :(得分:3)

确实,你的两个电话是相同的。正如您所见,html_nodes使用网址作为第一个参数只是在html_nodes上调用read_html(url)。您的第一个电话使用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