Pregunta

La siguiente frase me llamó la atención en el manual del Wget

wget --spider --force-html -i bookmarks.html

This feature needs much more work for Wget to get close to the functionality of real web spiders.

Encuentro las siguientes líneas de código relevantes para la opción de araña en wget.

src/ftp.c
780:      /* If we're in spider mode, don't really retrieve anything.  The
784:      if (opt.spider)
889:  if (!(cmd & (DO_LIST | DO_RETR)) || (opt.spider && !(cmd & DO_LIST)))
1227:      if (!opt.spider)
1239:      if (!opt.spider)
1268:      else if (!opt.spider)
1827:          if (opt.htmlify && !opt.spider)

src/http.c
64:#include "spider.h"
2405:  /* Skip preliminary HEAD request if we're not in spider mode AND
2407:  if (!opt.spider
2428:      if (opt.spider && !got_head)
2456:      /* Default document type is empty.  However, if spider mode is
2570:           * spider mode.  */
2571:          else if (opt.spider)
2661:              if (opt.spider)

src/res.c
543:  int saved_sp_val = opt.spider;
548:  opt.spider       = false;
551:  opt.spider       = saved_sp_val;  

src/spider.c
1:/* Keep track of visited URLs in spider mode.
37:#include "spider.h"
49:spider_cleanup (void)

src/spider.h
1:/* Declarations for spider.c

src/recur.c
52:#include "spider.h"
279:      if (opt.spider)
366:              || opt.spider /* opt.recursive is implicitely true */
370:             (otherwise unneeded because of --spider or rejected by -R) 
375:                   (opt.spider ? "--spider" : 
378:                     (opt.delete_after || opt.spider
440:      if (opt.spider) 

src/options.h
62:  bool spider;           /* Is Wget in spider mode? */

src/init.c
238:  { "spider",           &opt.spider,            cmd_boolean },

src/main.c
56:#include "spider.h"
238:    { "spider", 0, OPT_BOOLEAN, "spider", -1 },
435:       --spider                  don't download anything.\n"),
1045:  if (opt.recursive && opt.spider)

Me gustaría ver las diferencias en el código, no en abstracto. Me encanta ejemplos de código.

¿Cómo arañas web difieren de araña de Wget en el código?

¿Fue útil?

Solución

Una araña real es mucho trabajo

Escribir una araña para toda la WWW es una tarea --- usted tiene que tener cuidado acerca de muchos "pequeños detalles", tales como:

  • Cada equipo araña debe recibir datos de unos pocos miles de servidores en paralelo con el fin de hacer un uso eficiente del ancho de banda de conexión. (Socket asíncrono i / o).
  • Es necesario que varios ordenadores araña en paralelo con el fin de cubrir la gran cantidad de información en la WWW (agrupación; particionado el trabajo)
  • Es necesario ser amable con los sitios web spidered:
    • Respetar los archivos robots.txt.
    • No traiga mucha información demasiado rápido: esta sobrecarga los servidores
    • .
    • No traiga archivos que usted realmente no necesita. (Por ejemplo, imágenes de disco ISO; TGZ paquetes de descarga de software ...)
  • Usted tiene que tratar con galletas / ID de sesión: Muchos sitios se unen ID de sesión únicos para las direcciones URL para identificar las sesiones de cliente. Cada vez que llegue al sitio, se obtiene un nuevo identificador de sesión y un nuevo mundo virtual de páginas (con el mismo contenido). Debido a estos problemas, los primeros motores de búsqueda ignoran el contenido dinámico. motores de búsqueda modernos han aprendido cuáles son los problemas y cómo tratar con ellos.
  • Hay que detectar e ignorar los datos problemático:. Conexiones que proporcionan una cantidad aparentemente infinita de datos o conexiones que son demasiado lento para terminar
  • Además de seguir los enlaces, es posible que desee analizar mapas de sitio para obtener URL de las páginas.
  • Es posible que desee evaluar qué información es importante para usted y cambia con frecuencia que se actualice con más frecuencia que otras páginas. Nota: Una araña para toda la WWW recibe una gran cantidad de datos --- que paga por ese ancho de banda. Es posible que desee utilizar las peticiones HTTP HEAD de adivinar si una página ha cambiado o no.
  • Además de recibir, desea procesar la información y almacenarla. Google construye índices que enumeran para cada palabra de las páginas que lo contienen. Es posible que tenga ordenadores separados de almacenamiento y una infraestructura para conectarlos. bases de datos relacionales tradicionales no se mantienen al día con los requisitos de volumen de datos y rendimiento de almacenamiento / indexar toda la WWW.

Este es un montón de trabajo. Pero si su objetivo es más modesto que la lectura de toda la WWW, puede omitir algunas de las partes. Si lo que desea es descargar una copia de un wiki, etc. te pones a las especificaciones de wget.

Nota: Si usted no cree que es tanto trabajo, es posible que desee leer sobre cómo Google re-inventado la mayoría de las ruedas de computación (en la parte superior del núcleo de Linux básico) para construir buenas arañas. Incluso si se corta un montón de curvas, que es un montón de trabajo.

Permítaseme añadir unas cuantas observaciones técnicas en tres puntos

conexiones en paralelo / comunicación socket asíncrono

Se puede ejecutar varios programas de araña en procesos paralelos o hilos. Pero se necesita aproximadamente 5000-10000 conexiones en paralelo con el fin de hacer un buen uso de su conexión a la red. Y esta cantidad de paralelos procesos / hilos produce demasiada sobrecarga.

Una solución mejor es asíncrono de entrada / salida: Proceso de aproximadamente 1000 conexiones en paralelo en un solo hilo mediante la apertura de las tomas en el modo de no bloqueo y utilizar epoll o seleccionar para procesar sólo las conexiones que han recibido datos. Desde kernel de Linux 2.4, Linux tiene un excelente soporte para escalabilidad (También recomiendo que estudie los archivos mapeados en memoria) continuamente mejorado en versiones posteriores.

Nota: El uso de E / S asíncrona ayuda mucho más que el uso de una "lengua rápida": Es mejor escribir un proceso epoll impulsada por 1000 conexiones escritos en Perl que correr 1.000 procesos escritos en C. Si lo haces bien , se puede saturar una conexión de 100 Mb con los procesos escritos en perl.

A partir de la respuesta original: El lado negativo de este enfoque es queque tendrá que implementar la especificación HTTP a sí mismo en una forma asíncrona (no me consta de una biblioteca reutilizable que hace esto). Es mucho más fácil de hacer esto con el simple protocolo HTTP / 1.0 que la moderna protocolo HTTP / 1.1. Es probable que no se pueden beneficiar de las ventajas de HTTP / 1.1 para navegadores normales de todos modos, por lo que este puede ser un buen lugar para ahorrar algunos costes de desarrollo.

Editar cinco años más tarde: Hoy en día, hay una gran cantidad de tecnología de código libre / abierto disponible para ayudarle con este trabajo. Personalmente, me gusta el http aplicación de node.js --- que le ahorra todo el trabajo mencionado en el párrafo original anterior. Por supuesto, hoy en día también hay una gran cantidad de módulos fácilmente disponibles para los otros componentes que necesita en su araña. Tenga en cuenta, sin embargo, que la calidad de los módulos de terceros puede variar considerablemente. Usted tiene que echa un vistazo a todo lo que uso. [información Envejecimiento:] Recientemente, me escribió una araña usando Node.js y me encontré con la fiabilidad de los módulos de la NGP para el procesamiento de HTML para el enlace y la extracción de datos insuficientes. Para este trabajo, "externalizado" este procesamiento a un proceso escrito en otro lenguaje de programación. Pero las cosas están cambiando rápidamente y en el momento de leer este comentario, este problema puede ya una cosa del pasado ...

Dividir el trabajo a lo largo de varios servidores

Una computadora no puede seguir el ritmo de spidering toda la WWW. Es necesario para distribuir su trabajo a lo largo de varios servidores y el intercambio de información entre ellos. Sugiero asignar ciertos rangos de "nombres de dominio" a cada servidor: mantener una base de datos central de nombres de dominio con una referencia a un ordenador araña.

Extraer direcciones URL de las páginas web recibidas en lotes: clasificarlos según sus nombres de dominio; eliminar duplicados y enviarlos al ordenador araña responsable. En ese equipo, mantener un índice de direcciones URL que ya están descabellada a buscar las direcciones URL restantes.

Si se mantiene una cola de espera de URLs a ser exagerado en cada equipo de araña, no tendrá ningún embotellamientos de rendimiento. Pero es un buen montón de programación para implementar esto.

Lea las normas

he mencionado varias normas (HTTP / 1.x, robots.txt, galletas). Tómese su tiempo para leerlos y ponerlas en práctica. Si usted sólo tiene que seguir los ejemplos de sitios que usted sabe, se cometen errores (olvidar partes de la norma que no son relevantes para sus muestras) y causar problemas para aquellos sitios que utilizan estas características adicionales.

Es un dolor para leer el / 1.1 documento estándar HTTP. Pero todos los pequeños detalles consiguieron añaden a ella porque alguien realmente necesita ese pequeño detalle y ahora lo utiliza.

Otros consejos

No estoy seguro exactamente lo que el autor original del comentario se refería, pero puedo adivinar que wget es lento como una araña, ya que parece utilizar un solo hilo de ejecución (al menos por lo que se ha mostrado ).

arañas "reales" como Heritrix utilizan una gran cantidad de paralelismo y trucos para optimizar su velocidad de rastreo, mientras simultáneamente agradable a la página web que se arrastran. Esto normalmente significa limitar los accesos a un sitio a una tasa de 1 por segundo (más o menos), y el rastreo de múltiples sitios web al mismo tiempo.

Una vez que todo esto es sólo una suposición basada en lo que sé de las arañas en general, y lo que publicadas aquí.

Por desgracia, muchos de los más conocidos web spiders 'reales' están cerrados de código, y de hecho cerrado binario. Sin embargo, hay una serie de técnicas básicas wget falta:

  • Paralelismo; Nunca vas a ser capaz de mantenerse al día con toda la web sin tener que recuperar varias páginas a la vez
  • Priorización; algunas páginas son más importantes que otros a la araña
  • Limitación de velocidad; se le prohibió rápido si se mantienen tirando hacia abajo las páginas tan rápido como sea posible
  • guardar en algo más que un sistema de archivos local; la Web es lo suficientemente grande que no va a caber en un único árbol de directorios
  • Segunda verificación de páginas periódicamente sin necesidad de reiniciar todo el proceso; en la práctica, con una verdadera araña que querrá volver a revisar las páginas 'importantes' para las actualizaciones frecuentes, mientras que las páginas menos interesantes pueden pasar meses.

También hay varias otras entradas que se pueden utilizar como mapas de sitio y similares. El punto es, wget no está diseñado para la araña toda la web, y en realidad no es una cosa que puede ser capturado en una pequeña muestra de código, ya que es un problema de toda la técnica general que se utiliza, en lugar de cualquier pequeña subrutina única equivocarse para la tarea.

No voy a entrar en detalles de cómo la araña internet, creo que el comentario wget es con respecto a spidering un sitio web que sigue siendo un serio desafío.

  • Como una araña que tiene que averiguar cuándo parar, no entrar en recursivo se arrastra sólo porque la URL cambia como fecha = 1/1/1900 al 01/02/1900 y así
  • reto aún mayor para resolver reescritura de URL (no tengo idea de lo que nunca cómo Google o cualquier otro se encarga de esta). Es bastante grande desafío para rastrear lo suficiente, pero no demasiado. Y cómo se puede reconocer de forma automática de reescritura de URL con algunos parámetros aleatorios y cambios aleatorios en el contenido?
  • Es necesario analizar Flash / Javascript, al menos hasta cierto nivel
  • debe tener en cuenta algunos problemas HTTP locas como etiqueta Base . Incluso analizar el HTML no es fácil, considerando que la mayoría de los sitios web no son XHTML y navegadores son tan flexibles en la sintaxis.

No sé cuánto de éstos en práctica o considerada en wget pero puede que desee echar un vistazo a httrack para entender los retos de esta tarea.

Me encantaría darle algunos ejemplos de código, pero esto es grandes tareas y una araña decente será de unos 5000 loc sin bibliotecas 3 ª parte .

+ Algunos de ellos ya se ha explicado por @ yaakov-eructo así que no voy a escribir de nuevo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top