我正在使用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
由于
答案 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