R: очистка динамических ссылок с rvest - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь почистить ссылки на RSS-каналы из интернет-архива, которые находятся под «динамическим» календарем, используя rvest, см. эту ссылку в качестве примера.

<div>
<div class="captures">
<div class="position" style="width: 20px; height: 20px;">
<div class="measure ">
</div>
</div>
<a href="/web/20100112114601/http://www.dailyecho.co.uk/news/district/winchester/rss/">12</a>
</div>
<!-- react-empty: 2310 --></div>

Например,

url %>% 
  read_html() %>%
  html_nodes("a") %>% 
  html_attr("href")

не возвращает ссылки, которые мне интересны, xpath или html_nodes('.captures') возвращает пустые результаты. Любые советы будут очень полезны, спасибо!

1 Ответ

0 голосов
/ 17 сентября 2018

Одной из возможностей является использование пакета wayback ( GL ) ( GH ) , который поддерживает запросы к Интернет-архиву и чтение в HTMLсохраненных страниц ("сувениры").Вы можете исследовать немного больше терминологии abt web-архивирования (это немного загадочное IMO) через http://www.mementoweb.org/guide/quick-intro/ & https://mementoweb.org/guide/rfc/ в качестве начального ресурса.

library(wayback) # devtools::install_git(one of the superscript'ed links above)
library(rvest) # for reading the resulting HTML contents
library(tibble) # mostly for prettier printing of data frames

Существует несколько подходовможно взять.Это то, что я склонен делать во время криминалистического анализа онлайн-контента.YMMV.

Во-первых, мы получаем записанные сувениры (в основном, краткий список релевантного контента):

(rss <- get_mementos("http://www.dailyecho.co.uk/news/district/winchester/rss/"))
## # A tibble: 7 x 3
##   link                                                             rel       ts                 
##   <chr>                                                            <chr>     <dttm>             
## 1 http://www.dailyecho.co.uk/news/district/winchester/rss/         original  NA                 
## 2 http://web.archive.org/web/timemap/link/http://www.dailyecho.co… timemap   NA                 
## 3 http://web.archive.org/web/http://www.dailyecho.co.uk/news/dist… timegate  NA                 
## 4 http://web.archive.org/web/20090517035444/http://www.dailyecho.… first me… 2009-05-17 03:54:44
## 5 http://web.archive.org/web/20180712045741/http://www.dailyecho.… prev mem… 2018-07-12 04:57:41
## 6 http://web.archive.org/web/20180812213013/http://www.dailyecho.… memento   2018-08-12 21:30:13
## 7 http://web.archive.org/web/20180812213013/http://www.dailyecho.… last mem… 2018-08-12 21:30:13

Средство просмотра меню календаря в IA - это действительно «временная карта».Мне нравится работать с этим, так как это список на момент времени всех обходов.Это вторая ссылка выше, поэтому мы прочитаем ее:

(tm <- get_timemap(rss$link[2]))
## # A tibble: 45 x 5
##    rel           link                                  type        from          datetime       
##    <chr>         <chr>                                 <chr>       <chr>         <chr>          
##  1 original      http://www.dailyecho.co.uk:80/news/d… NA          NA            NA             
##  2 self          http://web.archive.org/web/timemap/l… applicatio… Sun, 17 May … NA             
##  3 timegate      http://web.archive.org                NA          NA            NA             
##  4 first memento http://web.archive.org/web/200905170… NA          NA            Sun, 17 May 20…
##  5 memento       http://web.archive.org/web/200908130… NA          NA            Thu, 13 Aug 20…
##  6 memento       http://web.archive.org/web/200911121… NA          NA            Thu, 12 Nov 20…
##  7 memento       http://web.archive.org/web/201001121… NA          NA            Tue, 12 Jan 20…
##  8 memento       http://web.archive.org/web/201007121… NA          NA            Mon, 12 Jul 20…
##  9 memento       http://web.archive.org/web/201011271… NA          NA            Sat, 27 Nov 20…
## 10 memento       http://web.archive.org/web/201106290… NA          NA            Wed, 29 Jun 20…
## # ... with 35 more rows

Содержимое находится в сувенирах, и там должно быть столько сувениров, сколько вы видите в представлении календаря.В первом из них мы прочтем:

mem <- read_memento(tm$link)
# Ideally use writeLines(), now, to save this to disk with a good
# filename. Alternatively, stick it in a data frame with metadata 
# and saveRDS() it. But, that's not a format others (outside R) can 
# use so perhaps do the data frame thing and stream it out as ndjson
# with jsonlite::stream_out() and compress it during save or afterwards.

Затем преобразуем его в то, что мы можем использовать программно с xml2::read_xml() или xml2::read_html() (иногда RSS лучше анализировать как XML):

read_html(mem)
## {xml_document}
## <html>
## [1] <body><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Daily Ec ...

read_memento() имеет параметр as для автоматического разбора результата, но мне нравится хранить сувениры локально (как отмечено в комментариях), чтобы не злоупотреблять серверами IA (т.е. если мне когда-либо понадобится получитьопять данные, мне не нужно бить по их инфраструктуре).

Большое предостережение в том, что если вы попытаетесь получить слишком много ресурсов от ИА за короткий промежуток времени, вы будете временно забанены, так как они имеютмасштабируется, но это бесплатный сервис, и они (по праву) пытаются предотвратить злоупотребления.

Определенно сообщите о проблемах с пакетом (выберите ваше любимое сообщество по размещению исходного кода, чтобы сделать это, так как я буду работать с любым из них, но предпочитаю GitLab послеMicrosoft поглощение GitHub), если что-то неясно или вы чувствуете, может быть сделано лучшеЭто не популярный пакет, и у меня есть лишь время от времени необходимость в судебной экспертизе, поэтому он «работает для меня», но я с радостью постараюсь сделать его более удобным для пользователя (мне просто нужно знать болевые точки).

...