2015-07-20 7 views
5

Próbuję zautomatyzować proces, który obejmuje pobieranie plików .zip z kilku stron internetowych i wyodrębnianie zawartych w nich plików .csv. Wyzwanie polega na tym, że nazwy plików .zip, a tym samym adresy linków, zmieniają się co tydzień lub co rok, w zależności od strony. Czy istnieje sposób na zeskanowanie bieżących adresów linków z tych stron, aby móc następnie przekazać te adresy do funkcji, która pobiera pliki?Użycie R do skasowania adresu linku pliku do pobrania ze strony internetowej?

Jedna z docelowych stron to this one. Plik, który chcę pobrać, to drugi punkt w nagłówku "Plik ukończenia w czasie rzeczywistym w całej Afryce 2015" - tzn. Skompresowany plik .csv. Kiedy piszę, plik ten jest oznaczony jako "plik Realtime 2015 All Africa (zaktualizowany 11 lipca 2015 r.) (Csv)" na stronie internetowej, a adres linku, który chcę, to http://www.acleddata.com/wp-content/uploads/2015/07/ACLED-All-Africa-File_20150101-to-20150711_csv.zip, ale to powinno się zmienić później, ponieważ dane są aktualizowane w każdy poniedziałek --- stąd moje wyzwanie.

Próbowałem, ale nie udało mi się zautomatyzować ekstrakcji tej nazwy pliku .zip za pomocą "rvest" i rozszerzenia selectorgadet w Chrome. Oto jak poszło:

> library(rvest) 
> realtime.page <- "http://www.acleddata.com/data/realtime-data-2015/" 
> realtime.html <- html(realtime.page) 
> realtime.link <- html_node(realtime.html, xpath = "//ul[(((count(preceding-sibling::*) + 1) = 7) and parent::*)]//li+//li//a") 
> realtime.link 
[1] NA 

XPath w tym wezwanie do html_node() pochodzi podkreślając tylko (CSV) część Realtime 2015 All Africa Plik (zaktualizowano 11 lipca 2015) (CSV) pola na zielono, a następnie kliknąć na tyle innych podświetlonych bitów strony, aby wyeliminować wszystkie żółte i pozostawić tylko czerwony i zielony.

Czy popełniłem mały błąd w tym procesie, czy też jestem na tym właśnie błędnym torze? Jak możesz zauważyć, mam zerowe doświadczenie z HTML i web-scrapingiem, więc naprawdę doceniam jakąś pomoc.

+2

Spróbuj 'realtime.html%>% html_node (XPath = "/ html/body/div/div/div/div [1]/div/article/div/ul [1]/li [2]/a")%>% html_attr ("href") '. Użyłem Firebug do wyodrębnienia xpath. – lukeA

+0

Tak, to działa, dziękuję bardzo. Teraz spróbuję dowiedzieć się, jak użyć firebug. – ulfelder

+0

@lukeA Udało mi się użyć elementu Inspect Element in Chrome w przeglądarce , aby wyświetlić kod HTML drugiej strony z wybranym zestawem danych i na podstawie debugowanego przykładu, aby dowiedzieć się, jak napisać ścieżkę xpath, która działała w tym celu. Więc: jeszcze raz dziękuję! – ulfelder

Odpowiedz

10

myślę starasz się zrobić zbyt wiele w jednym wyrażeniu XPath - bym zaatakować problem w sekwencji mniejszych kroków:

library(rvest) 
library(stringr) 
page <- html("http://www.acleddata.com/data/realtime-data-2015/") 

page %>% 
    html_nodes("a") %>%  # find all links 
    html_attr("href") %>%  # get the url 
    str_subset("\\.xlsx") %>% # find those that end in xlsx 
    .[[1]]     # look at the first one 
+0

Bardzo wydajny, dziękuję. Do mojego zadania potrzebowałem adresu URL do pierwszego pliku .zip, ale łatwo było go uzyskać, zastępując "\\. Xlsx" przez "\\. Zip". Voila. – ulfelder

Powiązane problemy