2012-04-09 19 views
6

Próbuję zeskrobać wszystkie rachunki z dwóch stron na stronie internetowej niższej francuskiej izby parlamentu. Strony pokrywają 2002-2012 i reprezentują mniej niż 1000 rachunków każdy.Jak zoptymalizować skrobanie za pomocą getURL() w R

Do tego ja zeskrobać z getURL pośrednictwem tej pętli:

b <- "http://www.assemblee-nationale.fr" # base 
l <- c("12","13") # legislature id 

lapply(l, FUN = function(x) { 
    print(data <- paste(b, x, "documents/index-dossier.asp", sep = "/")) 

    # scrape 
    data <- getURL(data); data <- readLines(tc <- textConnection(data)); close(tc) 
    data <- unlist(str_extract_all(data, "dossiers/[[:alnum:]_-]+.asp")) 
    data <- paste(b, x, data, sep = "/") 
    data <- getURL(data) 
    write.table(data,file=n <- paste("raw_an",x,".txt",sep="")); str(n) 
}) 

Czy istnieje jakiś sposób, aby zoptymalizować funkcję getURL() tutaj? I nie wydaje się używać jednoczesnego pobierania przekazując opcję async=TRUE, co daje mi ten sam błąd za każdym razem:

Error in function (type, msg, asError = TRUE) : 
Failed to connect to 0.0.0.12: No route to host 

pomysłów? Dzięki!

+1

'asynchroniczny = TRUE jest już domyślnym jeśli podać kilka adresów - ale otwarcie ponad 500 jednoczesnych połączeń do tej samej witryny nie może być dobrym pomysłem ... –

+0

porządku. Cóż, nie mogę się zbytnio zmienić w działaniu 'getURL()' do tej pory. –

Odpowiedz

1

Spróbuj mclapply wielordzeniowych {} zamiast lapply.

„mclapply jest parallelized wersja lapply, zwraca listę tej samej długości co X, każdy element, który jest wynikiem zastosowania FUN odpowiedniego elementu X.” (http://www.rforge.net/doc/packages/multicore/mclapply.html)

Jeśli to nie zadziała, można uzyskać lepszą wydajność przy użyciu pakietu XML. Funkcje takie jak xmlTreeParse korzystają z wywołań asynchronicznych.

„Zauważ, że xmlTreeParse zezwala styl hybrydowy przetwarzania że pozwala nam stosować ładowarki do węzłów w drzewie są one będąc przekształcony R obiektów. To jest styl zdarzeniami lub asynchroniczne powołanie." (http://www.inside-r.org/packages/cran/XML/docs/xmlEventParse)

+0

Nice! Nie znałem "mclapply", ale to fajna propozycja. Odkąd zadałem to pytanie, odkryłem twoją drugą opcję (używając 'XML' zamiast' getURL'), i to działa bardzo dobrze. Czy twoim zdaniem, byłoby przesadą, aby zrównoleglić pętlę, w której parsuję HTML z 'htmlParse'? –

+0

Prawdopodobnie spowoduje to szybsze skasowanie danych, ale wpisanie kodu może być stratą czasu, jeśli przyrosty prędkości nie są zbyt duże. To zależy od wielkości twojego zestawu danych. – rsoren

+0

Nie jest to wystarczająco duże, aby to uzasadnić. Dzięki :) –

-4

Dlaczego warto korzystać z R? W przypadku dużych zadań skrobania lepiej jest użyć czegoś już opracowanego do tego zadania. Miałem dobre wyniki z Down Them All, dodatek do przeglądarki. Wystarczy powiedzieć, od czego zacząć, jak głęboko iść, jakie wzory do naśladowania i gdzie zrzucić HTML.

Następnie użyj R, aby odczytać dane z plików HTML.

Zalety są ogromne - te dodatki zostały opracowane specjalnie do tego zadania, aby możliwe było ich wielokrotne pobieranie (które można kontrolować), będą wysyłać odpowiednie nagłówki, aby następne pytanie nie brzmiało "w jaki sposób ustawić ciąg agenta użytkownika z RCurl? 'i mogą poradzić sobie z ponowną próbą, gdy niektóre z plików do pobrania zawiodą, co nieuchronnie nastąpi.

Oczywiście wadą jest to, że nie można łatwo uruchomić tego procesu automatycznie, w takim przypadku może lepiej byłoby, gdyby "curl" był w wierszu poleceń, lub w innym narzędziu dublowania wiersza polecenia.

Szczerze mówiąc, masz lepsze rzeczy do zrobienia ze swoim czasem niż kodzie strony zapisu w R ...

+3

Używam R do analizy, która następuje po ekstrakcji danych! Operacja jest całkowicie powtarzalna, więc trzecia aplikacja nie będzie działać. Na przykład jestem otwarty na sugestie w Pythonie. –

+0

Dlaczego Python jest w porządku, ale używając "curl" w wierszu poleceń (być może nazywane formularzem R przez system), nie? Po prostu spróbujesz powielić funkcjonalność zwijania się wiersza poleceń za pomocą Pythona lub R, co jest dużym, bezsensownym wysiłkiem. Nadal możesz używać R, po prostu robisz to na pobranych i zapisanych plikach. Powodzenia w replikacji pracy opartej na skrobaniu ze strony internetowej ... – Spacedman

+4

Oh, 'curl' zrobiłby. Jest tutaj fajny skrobanie kodu dla Ruby i Pythona, i oczywiście dla basha. Teraz R jest praktycznym sposobem udostępniania skriningu kodu wzdłuż kodu statystyk, szczególnie dla użytkowników, którzy nie używają kodu regularnie. Jeśli chodzi o możliwość powielania, jest to strona parlamentarna, a ich archiwa mają tendencję do trwać. –