2010-06-29 9 views
7

Estamos diseñando un proyecto de raspado/análisis a gran escala. Básicamente, el script debe ir a través de una lista de páginas web, extraer el contenido de una etiqueta en particular y almacenarlo en una base de datos. ¿Qué idioma recomendaría para hacer esto a gran escala (decenas de millones de páginas?). .¿Qué tecnología para raspado/análisis a gran escala?

Estamos usando MongoDB para la base de datos, por lo que cualquier cosa con controladores MongoDB sólidos es una ventaja.

Hasta ahora, hemos estado usando (no me rio) PHP, curl, y Simple HTML DOM Parser, pero no creo que sea escalable a millones de páginas, especialmente porque PHP no tiene multithreading adecuado.

Necesitamos algo que sea fácil de desarrollar, que pueda ejecutarse en un servidor Linux, que tenga un analizador robusto HTML/DOM para extraer fácilmente esa etiqueta, y que pueda descargar millones de páginas web en un tiempo razonable. No estamos realmente buscando un rastreador web, porque no necesitamos seguir enlaces e indexar todo el contenido, solo tenemos que extraer una etiqueta de cada página en una lista.

Respuesta

1

Hago algo similar usando Java con la biblioteca HttpClient commons. Aunque evito el analizador DOM porque estoy buscando una etiqueta específica que se puede encontrar fácilmente de una expresión regular.

La parte más lenta de la operación es realizar las solicitudes http.

7

Si usted está realmente hablando de gran escala, entonces es probable que desee algo que le permite escalar horizontalmente, por ejemplo, un mapa-Reducir marco como Hadoop. Puede escribir trabajos de Hadoop en varios idiomas, por lo que no está vinculado a Java. Aquí hay un artículo en writing Hadoop jobs in Python, por ejemplo. Por cierto, este es probablemente el lenguaje que usaría, gracias a libs como httplib2 para hacer las solicitudes y lxml para analizar los resultados.

Si un marco Map-Reduce es excesivo, puede mantenerlo en Python y usar multiprocessing.

ACTUALIZACIÓN: Si no desea un marco MapReduce y prefiere un idioma diferente, consulte el ThreadPoolExecutor en Java. Sin embargo, definitivamente usaría las cosas del cliente Apache Commons HTTP. Las cosas en el JDK propiamente dicho son mucho menos amigables con los programadores.

3

Probablemente deba utilizar las herramientas utilizadas para probar aplicaciones web (WatiN o Selenium).

Luego puede componer su flujo de trabajo separado de los datos usando una herramienta que he escrito.

https://github.com/leblancmeneses/RobustHaven.IntegrationTests

Usted no debería tener que hacer ningún análisis manual cuando el uso de WatiN o selenio. En su lugar, escribirás un css querySelector.

Usando TopShelf y NServiceBus puede escalar horizontalmente el número de trabajadores.

FYI: Con mono estas herramientas que menciono pueden ejecutarse en Linux. (aunque las millas pueden variar)

Si JavaScript no necesita ser evaluado para cargar datos dinámicamente: Todo lo que requiera que el documento se cargue en la memoria está perdiendo tiempo. Si sabes dónde está tu etiqueta, todo lo que necesitas es un analizador de saxofón.

+0

Por cierto, NServiceBus proporciona (distribución, persistencia, seguridad, transacciones y fiabilidad para el trabajo en cola) - muestra: https://github.com/leblancmeneses/NWebHooks –

0

¿qué ocurre con C++? hay muchas bibliotecas a gran escala que pueden ayudarlo.

boost asio puede ayudarle a hacer la red.

TinyXML puede analizar archivos XML.

No tengo idea acerca de la base de datos, pero casi todas las bases de datos tienen interfaces para C++, no es un problema.

Cuestiones relacionadas