web-crawler - metacrawler - web crawler python
¿Qué técnicas se pueden usar para detectar los llamados "agujeros negros"(una trampa de araña) al crear un rastreador web? (8)
Al crear un rastreador web, debe diseñar algún tipo de sistema que reúna enlaces y los agregue a una cola. Algunos, si no la mayoría, de estos enlaces serán dinámicos, que parecen ser diferentes, pero no agregan ningún valor, ya que se crean específicamente para engañar a los rastreadores.
Un ejemplo:
Le pedimos a nuestro rastreador que rastree el dominio evil.com ingresando una URL de búsqueda inicial.
Asumamos que dejamos que rastree la página principal inicialmente, evil.com/index
El HTML devuelto contendrá varios enlaces "únicos":
- evil.com/somePageOne
- evil.com/somePageTwo
- evil.com/somePageThree
El rastreador los agregará al búfer de las URL sin rastrear.
Cuando se está rastreando algunosPageOne, el rastreador recibe más URL:
- evil.com/someSubPageOne
- evil.com/someSubPageTwo
Estos parecen ser únicos, y así son. Son únicos en el sentido de que el contenido devuelto es diferente de las páginas anteriores y que la URL es nueva para el rastreador, sin embargo, parece que esto solo se debe a que el desarrollador ha realizado una "trampa de bucle" o "agujero negro".
El rastreador agregará esta nueva subpágina y la subpágina tendrá otra subpágina, que también se agregará. Este proceso puede continuar infinitamente. El contenido de cada página es único, pero totalmente inútil (es texto generado de forma aleatoria o texto extraído de una fuente aleatoria). Nuestro rastreador seguirá encontrando nuevas páginas, que en realidad no nos interesan.
Estas trampas de bucle son muy difíciles de encontrar, y si su rastreador no tiene nada que lo impida, se quedará atascado en un determinado dominio hasta el infinito.
Mi pregunta es, ¿qué técnicas se pueden usar para detectar los llamados agujeros negros?
Una de las respuestas más comunes que he escuchado es la introducción de un límite en la cantidad de páginas que se rastrearán. Sin embargo, no puedo ver cómo esto puede ser una técnica confiable cuando no se sabe qué tipo de sitio se debe rastrear. Un sitio legítimo, como Wikipedia, puede tener cientos de miles de páginas. Tal límite podría devolver un falso positivo para este tipo de sitios.
¿Qué pasa si MD5(the content of the URL)
?
Sé que no es la solución más delicada, pero puedes detectar algunos contenidos duplicados. Tendrá que crear un campo md5 único (en una base de datos o similar) y verificar el contenido de cada url en este campo.
Si la página tiene algo diferente en cada solicitud (es decir, marca de tiempo), esta solución no funcionará.
Bueno, has hecho una pregunta muy desafiante. Hay muchos problemas:
En primer lugar , ¿crees que alguien haría algo así para evitar la intrusión en la web? Una araña web podría actuar como ataque DoS si se quedara atascada en dicha estructura.
En segundo lugar , si la página está hecha para usuarios, ¿cómo reaccionarían ante un gran número de enlaces sin sentido que se vinculan con ''sitios de basura'' generados al azar? Estos enlaces deben ser invisibles para el usuario, ya sea algunos de ellos o estarían ocultos de alguna manera. Luego, debe verificar, si los enlaces tienen una pantalla: ninguna, fuente de 1 px, etc.
En tercer lugar , ¿cómo se comportaría google? Bueno, Google no indexa todo lo que puede. Agrega enlaces a la cola, pero no los sigue inmediatamente. No le gusta seguir los enlaces con referencias profundas, que no están vinculados desde páginas previamente indexadas. Hace que no indexe todo, pero finalmente se visita el índice de lo que los usuarios con más probabilidad visitarán. De lo contrario, las páginas que describa serán utilizadas con frecuencia por los spammers de SEO ;)
Yo construiría la cola de prioridad. Cada enlace a cada URL agrega 1 punto de prioridad (más, cuando de la página principal). Las páginas con prioridad 1 están al final de la lista. Limitaría el número de páginas visitadas, por lo que, en el peor de los casos, vería las páginas más importantes. Sería una página sospechosa que contenga demasiados enlaces con muy poco contenido. En pocas palabras, simule el comportamiento de Google tanto como sea necesario.
El contenido de algunos sitios mal diseñados a veces puede ser muy redundante, pero no veo ninguna razón legítima para evitar las trampas de los agujeros negros.
El propósito de un agujero negro es detectar robots que no respeten el archivo /robots.txt (si existe) o rel = "nofollow" en los enlaces. Dichos robots se usan generalmente para raspar las direcciones de correo electrónico y otra información con el propósito expreso de enviar correos no deseados a personas o vender esos datos a los remitentes de correo no deseado.
Los enlaces a los agujeros negros suelen estar ocultos para que los usuarios normales no queden atrapados accidentalmente. Tampoco son un problema para Google, Bing, etc. porque hacen lo que el propietario del sitio les ha pedido que hagan (es decir, respeten el archivo robots.txt de los propietarios). Las únicas personas que quedan atrapadas son aquellas que no dan rastreadores de ^ & @ y mal diseñados.
El contenido es la diferencia entre un agujero negro y un sitio legítimo, como Wikipedia. Si bien WP es de hecho un gran sitio web dimensional, cada URL contiene kilobytes de datos legítimos. Un sitio de trampa de arañas puede ser igual de "grande", pero las páginas no contendrán mucho: es totalmente perverso para desperdiciar los recursos del servidor y el ancho de banda que genera cantidades considerables de datos incomprensibles simplemente para atar a un rastreador web.
En lugar de poner límites superiores a la amplitud o profundidad del árbol de URL de un sitio (que atraparía sitios ricos en contenido como WP), tal vez rastree la cantidad de páginas escaneadas que se encuentran debajo de un piso de "tamaño útil". Luego puede tirar del controlador de expulsión de su araña una vez que el recuento exceda un límite aceptable.
En el mejor de los casos, cualquier solución será heurística, por lo que tendrá que conformarse con resultados menos que perfectos. Hubiera pensado que el enfoque de límite de página funcionaría bastante bien si se implementara correctamente.
Puede poner un límite en el número de páginas que se rastrearán sin abandonar el dominio ; esto no impide que todas las páginas se indexen, ya que si la araña se cierra antes de llegar a una página en particular, probablemente habrá más rutas a esa página que ingresen al dominio "más cerca" de ella, lo que permitirá su acceso. antes del corte
Recuerde también que sin ese límite, una araña podría quedar atrapada en un sitio legítimo como Wikipedia durante mucho tiempo, simplemente debido a la abrumadora cantidad de contenido.
No creo que haya una solución para detectar los agujeros negros, ya que hay muchas razones por las que un sitio puede crear un número infinito de páginas por una buena razón y sería difícil decir algo sobre el contenido de dicho sitio. Por esta razón, propongo un cambio de enfoque que evita que las arañas caven indefinidamente:
Creo que sería mejor desarrollar una estrategia donde cada página tenga asignado un valor de clasificación de página. Los enlaces también tienen un valor asignado, todos los enlaces idénticos producen un ranking final de objetivos (posible retorno en la búsqueda de la página).
A una araña solo se le debe permitir rastrear durante un período de tiempo según lo definido por el retorno potencial. Ahora se eliminan las arañas, se extraen datos y se levantan y se vuelven a colocar donde está la demanda.
De esta manera, un servidor no tendrá las arañas atrapadas buscando páginas de forma indefinida, ya que se reasignan continuamente a donde la demanda es mayor.
Quizás pueda agregar un límite de la longitud de una URL para rastrear.
Además, la mayoría de los servidores web tienen un límite en la longitud de una URL. Así que no deberías estar en un bucle infinito.
Encontré un documento al respecto. No sé si todavía es up2date sin embargo.
Compruébelo: http://www.boutell.com/newfaq/misc/urllength.html
También puedes limitar la ''profundidad'' de las páginas.
Me gusta domain.com/page/subpage/subsubpage/subsubsubpage/subsubsubsubpage/subsubsubsubpage/etc/etc/etc/etc/etc
Si estuviera creando un rastreador web a gran escala, tendría sentido adoptar el siguiente enfoque:
En primer lugar, los enlaces de rastreo mencionados explícitamente en el
sitemap.xml
o los archivos del mapa del sitio mencionados por elsite map index file
delsite map index file
. Dado que se espera que unsitemap.xml
no tenga más de 50,000 urls, y que un índice del mapa del sitio no tenga más de 1000 archivos de índice, sería razonable esperar que si rastreara estos enlaces primero, tendría una Índice del contenido de los sitios. Ya que tendría sentido poner las URL más importantes en el mapa del sitio. ¡Esto podría ser de hasta 50 millones de urls! Eso es mucho, no estoy seguro de que haya muchos sitios que tengan más de 50 millones de direcciones URL. Wikipedia afirma que hay 32,663,401 páginas de acuerdo a sus contadores activos. Así que si sigues este esquema, al menos puedes arrastrar wikipedia, lo que es un logro (ya que tomaría un tiempo). Tenga en cuenta que esta táctica le ayudará a rastrear solo los sitios que realmente han creado un mapa del sitio, pero es más probable que un sitio web útil tenga un mapa del sitio, a diferencia de uno que no lo tiene.El siguiente paso podría ser hacer una lista de las URL que no se mencionan en el mapa del sitio (podemos priorizar cuáles se rastrearán más adelante)
Rastrear otros dominios web siguiendo los dos primeros pasos.
Una vez que te quedas sin dominios web para rastrear (si te quedas sin dominios para rastrear, ¡eso es un gran logro!), Entonces puedes comenzar a clasificar las urls de la página, incluidas las que aún no has rastreado (desde el paso 2!)
Es más probable que las direcciones URL del paso 2 sean direcciones URL válidas, si otros dominios externos con un alto rango de páginas se han vinculado a ellas. Por lo tanto, puede priorizar qué urls rastrear. Si no se han vinculado dominios externos a las URL del paso 2, es más probable que el contenido no sea tan útil para las personas que han visitado la página o que nadie haya visitado la página, o que sea una trampa de araña. Ahora, es posible que una url que no tenga ningún dominio externo vinculado a ella, no tenga enlaces porque nunca ha sido indexada antes, y nadie sabe que existe. Puede valer la pena indexar esta página, pero a medida que avanza "más abajo", las páginas a las que se vincula deben tratarse con menos importancia.
Otro truco útil, (pero mucho más complicado), es verificar si el texto / urls en una página son legibles. Algunos sitios intentan ocultar el texto / urls haciéndolo del mismo color que el fondo para que los humanos no los vean de inmediato, pero se pueden usar para engañar a las máquinas. Igualmente se puede ocultar algún contenido usando CSS. Su rastreador / índice debe detectarlos para disminuir el puntaje de una página en particular y darle menos importancia al determinar qué url rastrear a continuación.
Finalmente, una vez que se completa el rastreo, debe comenzar el siguiente ciclo de rastreo y repetir el proceso anterior. Esta vez, si encuentra dominios externos que enlazan con las URL del paso 2, ¡su rango de páginas aumenta! ¡Y ahora puedes profundizar más! De esta manera, deberías tener un índice razonablemente bueno para contenido más común y evitar las trampas de arañas.
Otro paso que no he mencionado es "Procesamiento / indexación de contenido rastreado". Este es un paso realmente grande, pero como su pregunta fue más sobre el rastreo que sobre cómo construir un sistema completo de recuperación de información, no lo mencioné antes.
El contenido más legítimo, tiende a tener sentido desde una perspectiva de procesamiento del lenguaje natural. Por ejemplo, un ser humano que lee una página puede saber inmediatamente si la página es solo una colección de palabras aleatorias unidas o si se trata de un contenido real que intenta expresar una idea. Al procesar datos de sitios legítimos "conocidos", uno puede crear un conjunto de reglas y heurísticas sobre cómo se debe ver un idioma en particular. Esto se puede usar para indicar a su rastreador web si un enlace en particular contiene contenido real o real. Esto se puede usar para calificar una URL y determinar qué tan importante es seguirla.
Como se mencionó en otras respuestas, también puede codificar el contenido de cada url para determinar la "singularidad". El contenido que es idéntico no necesita ser analizado para las URL de nuevo, por lo que esto le permite evitar las trampas que reutilizan el mismo contenido. El procesamiento del lenguaje natural debería ayudarlo a evitar el alboroto al azar.
Un tercer problema es que las páginas se crean dinámicamente mediante el uso de contenido legítimo de otros sitios web. Este es un problema más complicado, pero una vez más, puede darles menos importancia al usar el rango de página. Si realmente puede construir un sistema escalable que pueda rastrear todas las direcciones URL mencionadas en los mapas de sitios de cada dominio en Internet, eso es todo un logro, y también significa que es muy rico y poderoso ya que probablemente tenga miles de computadoras en su disposición. Siendo un tipo tan rico, probablemente debería enfocarse en cosas más importantes y hacer que sus ingenieros resuelvan esto. XD