2012-04-09 15 views
6

Estoy tratando de raspar todas las facturas de dos páginas en el sitio web de la cámara baja del parlamento francés. Las páginas cubren 2002-2012 y representan menos de 1,000 facturas cada una.Cómo optimizar raspado con getURL() en R

Para ello, raspo con getURL través de este bucle:

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

¿Hay alguna manera de optimizar la función getURL() aquí? Me parece que no puede utilizar la descarga simultánea pasando la opción async=TRUE, que me da el mismo error cada vez:

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

¿Alguna idea? ¡Gracias!

+1

'asíncrono = TRUE ya es el valor predeterminado si se le da varias direcciones URL - pero la apertura de más de 500 conexiones simultáneas a la misma página web puede no ser una buena idea ... –

+0

bien. Bueno, no puedo cambiar mucho a cómo 'getURL()' funciona hasta ahora. –

Respuesta

1

Trate mclapply {} en lugar de múltiples núcleos lapply.

"mclapply es una versión paralelizada de lapply, devuelve una lista de la misma longitud que X, cada elemento de los cuales es el resultado de aplicar FUN al elemento correspondiente de X." (http://www.rforge.net/doc/packages/multicore/mclapply.html)

Si eso no funciona, es posible obtener un mejor rendimiento utilizando el paquete XML. Funciones como xmlTreeParse usan llamadas asincrónicas.

"Tenga en cuenta que xmlTreeParse sí permite un estilo híbrido de procesamiento que nos permite aplicar los controladores a los nodos en el árbol a medida que se convierten en objetos R. Se trata de un estilo de evento impulsado o asíncrono vocación." (http://www.inside-r.org/packages/cran/XML/docs/xmlEventParse)

+0

¡Agradable! No sabía 'mclapply', pero es una sugerencia genial. Desde que hice la pregunta, descubrí su segunda opción (usando 'XML' en lugar de' getURL'), y eso funciona muy bien. En su opinión, ¿sería excesivo para paralelizar un bucle donde analizo HTML con 'htmlParse'? –

+0

Eso probablemente rastrearía los datos más rápido, pero escribir el código podría ser una pérdida de tiempo si las ganancias de velocidad no son muy significativas. Depende del tamaño de su conjunto de datos. – rsoren

+0

No es lo suficientemente grande como para justificar eso. Gracias :) –

-4

¿Por qué usar R? Para grandes trabajos de raspado, es mejor usar algo ya desarrollado para la tarea. He tenido buenos resultados con Down Them All, un complemento de navegador. Solo dígale por dónde empezar, qué tan profundo debe ir, qué patrones seguir y dónde descargar el HTML.

A continuación, utilice R para leer los datos de los archivos HTML.

Las ventajas son enormes: estos complementos están desarrollados especialmente para la tarea, por lo que realizarán múltiples descargas (controlables por usted), enviarán los encabezados correctos para que su siguiente pregunta no sea '¿cómo configuro el cadena de agente de usuario con RCurl? ', y pueden hacer frente a reintentar cuando algunas de las descargas fallan, lo que inevitablemente hacen.

Por supuesto, la desventaja es que no puede iniciar este proceso fácilmente de forma automática, en cuyo caso tal vez sería mejor con 'curl' en la línea de comando o alguna otra herramienta de duplicación de línea de comandos.

Honestamente, que tienes mejores cosas que hacer con su tiempo de escribir código del sitio web en I ...

+3

¡Utilizo R para el análisis que sigue a la extracción de datos! Estoy haciendo que la operación sea completamente replicable, por lo que una tercera aplicación no funcionará. Sin embargo, estoy abierto a sugerencias con Python, por ejemplo. –

+0

¿Por qué Python está bien pero usando 'curl' en la línea de comando (posiblemente llamado forma R a través del sistema) no? Simplemente intentará duplicar la funcionalidad del curl de la línea de comandos a través de python o R, y ese es un gran esfuerzo sin sentido. Aún puede usar R, simplemente lo hace en los archivos descargados y guardados. Buena suerte con el trabajo replicable basado en el raspado de un sitio web ... – Spacedman

+4

Oh, 'curl' sería suficiente. Hay un buen código de raspado aquí para Ruby y Python, y para bash, por supuesto. Ahora, R es una forma práctica de compartir el código de raspado a lo largo del código de estadísticas, especialmente para los usuarios que no usan el código de forma regular. En cuanto a la replicabilidad, es un sitio web parlamentario, sus archivos tienden a durar. –