2015-11-30 4 views
2

Я использую rvest для очистки веб-страниц. Раньше я открывал сеанс с URL-адресом и вызывал сразу такие функции, как html_node().Нужно ли использовать read_html в rvest перед очисткой страницы html?

Я заметил, что большинство примеров, которые я вижу, продолжают читать страницу, прежде чем анализировать ее содержимое. Я проверил оба варианта и измерил прошедшее время системы и не увидел существенной разницы. Может ли кто-нибудь посоветовать, действительно ли нужно заранее прочитать всю страницу с 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 

Благодаря

ответ

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, что у меня часто есть несколько операции для выполнения на странице (читать некоторые узлы, затем некоторые другие узлы и собрать все Infos). Использование 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 
+0

Благодарим за ясное объяснение. Я сомневался, что это изменит ситуацию, если вы сделаете много вызовов на странице, но мой вопрос объясняется тем, что структура данных сеанса для меня не очень понятна, и я подозревал, что она может уже содержать всю информацию на странице. – OAA

Смежные вопросы