2009-12-05 825 views
6

Estoy escribiendo una araña en Python para rastrear un sitio. El problema es que necesito examinar alrededor de 2,5 millones de páginas, así que realmente podría usar algo de ayuda para optimizarlo para la velocidad.Escribiendo un Python Spider más rápido

Lo que tengo que hacer es examinar las páginas para un cierto número, y si se encuentra para grabar el enlace a la página. La araña es muy simple, solo necesita ordenar muchas páginas.

Soy completamente nuevo en Python, pero antes he usado Java y C++. Todavía tengo que comenzar a codificarlo, por lo que cualquier recomendación sobre bibliotecas o marcos para incluir sería genial. Cualquier consejo de optimización también es muy apreciado.

+3

Su mejor apuesta para acelerar el proceso es mejorar la velocidad de conexión. Ese será su cuello de botella, no la velocidad de Python. – tzot

Respuesta

9

Usted podría utilizar MapReduce como Google hace, ya sea a través de Hadoop (específicamente con Python: 1 y 2), Disco, o Happy.

La línea de pensamiento tradicional es escribir su programa en Python estándar, si lo encuentra demasiado lento, profile it, y optimizar los puntos lentos específicos. Puede hacer estos puntos lentos más rápidos bajando a C, usando extensiones C/C++ o incluso ctypes.

Si está spidering un solo sitio, considere usar wget -r (an example).

+0

¿El soporte de wget solo está buscando el html? No quiero ser más un desagüe entonces tengo que hacerlo. – MMag

+2

Sí, el indicador '-A' en wget le permite especificar las extensiones aceptadas, y' -R' le permite especificar las extensiones rechazadas. Entonces podrías hacer algo como 'wget -R.gif, .jpg, .png -r ejemplo.com' –

+0

+1 para wget, ¿por qué reinventar la rueda? – extraneon

3

Spidering el sitio de alguien con millones de solicitudes no es muy educado. ¿Puedes pedirle al webmaster un archivo del sitio? Una vez que tienes eso, es una simple cuestión de búsqueda de texto.

+0

El sitio web no está en inglés, y no hablo el idioma para preguntar. Además, es un sitio con una imagen de tráfico muy alta (otra razón que realmente no puedo preguntar) y solo necesito el html de cada página, así que con suerte no voy a agotar sus servidores. Solo planeo arañar cada página una vez, y nunca volver para recibir actualizaciones. – MMag

5

¿Dónde está almacenando los resultados? Puede usar la biblioteca en la nube de PiCloud para paralelizar fácilmente su raspado en un grupo de servidores.

+0

Solo tengo una estación de trabajo con una pequeña matriz Raid y las computadoras de algunos voluntarios. Solo tengo pensado almacenar algunas de las páginas que tienen el término de búsqueda correspondiente, que debe ser <1% – MMag

+0

Cuanto menos datos tenga, mejor. Si te encuentras necesitando más potencia computacional (el paralelismo acelerará en gran medida lo que estás haciendo), definitivamente prueba PiCloud. – BrainCore

3

Pierde mucho tiempo esperando las solicitudes de red cuando está spidering, por lo que definitivamente querrá hacer sus solicitudes en paralelo. Probablemente guardaría los datos del resultado en el disco y luego tendré un segundo proceso recorriendo los archivos buscando el término. Esa fase podría distribuirse fácilmente entre múltiples máquinas si necesitara un rendimiento adicional.

5

Como eres nuevo en Python, creo que lo siguiente puede ser útil para ti :)

  • si está escribiendo expresiones regulares para buscar cierto patrón en la página, compilar su expresión regular siempre que sea posible y reutilización el objeto compilado
  • BeautifulSoup es un analizador html/xml que puede ser de alguna utilidad para su proyecto.
+0

Se arregló parte del formato de tu publicación, espero que no te importe :) ¡Bienvenido a SO! – onnodb

+0

thx para su edición :) – satoru

0

Lo que Adam dijo. Lo hice una vez para mapear la red de Xanga. La forma en que lo hice más rápido es tener un conjunto seguro para subprocesos que contiene todos los nombres de usuario que tuve que buscar. Luego tuve 5 o más hilos haciendo solicitudes al mismo tiempo y procesándolas. Va a pasar mucho más tiempo esperando que la página llegue a DL que procesar el texto (lo más probable), así que solo busque maneras de aumentar el número de solicitudes que puede obtener al mismo tiempo.

Cuestiones relacionadas