2012-04-09 12 views
6

Sto cercando di grattare tutti i conti da due pagine sul sito web della camera bassa del parlamento francese. Le pagine coprono il periodo 2002-2012 e rappresentano meno di 1.000 banconote ciascuna.Come ottimizzare lo scraping con getURL() in R

Per questo, io raschiare con getURL attraverso questo ciclo:

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) 
}) 

C'è un modo per ottimizzare la funzione getURL() qui? Io non riesco a utilizzare il download simultaneo passando l'opzione async=TRUE, che mi dà lo stesso errore ogni volta:

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

Tutte le idee? Grazie!

+1

'asincrona = TRUE è già il default se si dà diversi URL - ma di apertura più di 500 connessioni simultanee al sito stesso non può essere una buona idea ... –

+0

Va bene. Bene, non riesco a cambiare molto a come 'getURL()' funziona finora. –

risposta

1

Prova mclapply {} multicore invece di lapply.

"mclapply è una versione parallelizzato di lapply, restituisce una lista di stessa lunghezza X, ciascun elemento del quale è il risultato dell'applicazione FUN al corrispondente elemento di X." (http://www.rforge.net/doc/packages/multicore/mclapply.html)

Se questo non funziona, si può ottenere una migliore performance utilizzando il pacchetto XML. Funzioni come xmlTreeParse usano chiamate asincrone.

"Si noti che xmlTreeParse fa permettere uno stile ibrido di elaborazione che ci permette di applicare gestori a nodi dell'albero come stanno essendo convertiti in oggetti R. Questo è uno stile di event-driven o asincrono chiamando." (http://www.inside-r.org/packages/cran/XML/docs/xmlEventParse)

+0

Bello! Non sapevo "mclapply", ma è un bel suggerimento. Da quando ho posto la domanda, ho scoperto la tua seconda opzione (usando 'XML' invece di' getURL'), e questo funziona molto bene. Secondo te, sarebbe eccessivo organizzare parallelamente un ciclo in cui analizzo HTML con 'htmlParse'? –

+0

Probabilmente raccoglierebbe i dati più velocemente, ma scrivere il codice potrebbe essere una perdita netta di tempo se i guadagni di velocità non sono molto significativi. Dipende dalle dimensioni del tuo set di dati. – rsoren

+0

Non è abbastanza grande da giustificarlo. Grazie :) –

-4

Perché utilizzare R? Per i grandi lavori di scraping è meglio usare qualcosa già sviluppato per l'attività. Ho avuto buoni risultati con Down Them All, un browser aggiuntivo. Basta dire da dove iniziare, quanto è profondo andare, quali modelli seguire e dove scaricare l'HTML.

Quindi utilizzare R per leggere i dati dai file HTML.

I vantaggi sono enormi: questi componenti aggiuntivi sono sviluppati appositamente per l'attività in modo che eseguano più download (controllabili dall'utente), invieranno le intestazioni corrette in modo che la prossima domanda non sia "come faccio a impostare il stringa di user-agent con RCurl? ", e possono farcela a riprovare quando alcuni download falliscono, cosa che inevitabilmente fanno.

Ovviamente lo svantaggio è che non è possibile avviare facilmente questo processo automaticamente, nel qual caso forse starai meglio con "curl" sulla riga di comando o con qualche altra utilità di mirroring della riga di comando.

Onestamente, hai di meglio da fare con il vostro tempo di codice del sito web di scrittura in R ...

+3

Io uso R per l'analisi che segue l'estrazione dei dati! Sto rendendo l'operazione interamente replicabile, quindi una terza app non funzionerà. Ad esempio, sono aperto a suggerimenti con Python. –

+0

Perché Python è ok ma usando 'curl' sulla riga di comando (possibilmente chiamato modulo R tramite sistema) no? Stai solo cercando di duplicare la funzionalità di curl da riga di comando tramite python o R e questo è un grosso sforzo inutile. Puoi ancora usare R, basta farlo sui file scaricati e salvati. Buona fortuna con il lavoro replicabile basato sullo scraping da un sito web ... – Spacedman

+4

Oh, "arricciare" farebbe. C'è un bel codice di scrittura qui per Ruby e Python e, naturalmente, per bash. Ora, R è un modo pratico per condividere il codice di scraping lungo il codice delle statistiche, specialmente per gli utenti che non usano il codice su base regolare. Per quanto riguarda la replicabilità, è un sito web parlamentare, i loro archivi tendono a durare. –