algorithm - metas - meta tags online
¿Cómo determinar si dos páginas web son iguales? (13)
¿Cuáles son algunas de las técnicas buenas para detectar si una página web es igual a otra?
Por lo mismo, no me refiero al equivalente char-for-char (eso es fácil), pero es lo suficientemente robusto como para ignorar algo como una fecha / hora actual en la página, etc.
Por ejemplo, vaya a un Yahoo! Artículo de noticias cargar la página, abrir la misma página 10 minutos más tarde en otro navegador. Baring reescribe, esas páginas tendrán algunas diferencias (sellos de tiempo, posiblemente cosas como anuncios, posiblemente cosas como historias relacionadas), pero un ser humano podría mirar a los dos y decir que son lo mismo.
Tenga en cuenta que no estoy tratando de corregir (o confiar) en la normalización de URL. Es decir, descubriendo que foo.html y foo.html? Bar = bang son lo mismo.
Dependiendo de lo que estés haciendo, es posible que te interese TemplateMaker . Le das algunos hilos (como páginas web) y marca los bits que cambian.
En tu Yahoo! Ejemplo de noticias , podrías buscar la página una vez y decirle a TemplateMaker que la aprenda. Luego lo buscarías de nuevo y le dirías que lo aprendiera.
Cuando estaba contento de que su TemplateMaker supiera lo mismo cada vez, podía buscar otra página y preguntarle a TemplateMaker si coincidía con la plantilla de las demás. (Te daría las piezas que han cambiado, si estuvieras interesado en eso).
El primer pensamiento que se me vino a la cabeza fue procesar las páginas en documentos XML con BeautifulSoup (Python), ejecutar un diff en ellas y contar el número de líneas diferentes. Si el recuento es> X%, son diferentes. No muy robusto y probablemente propenso al error, pero ese sería el truco rápido que haría para probar.
Es posible que desee echar un vistazo a esta página que analiza la comparación de dos documentos XML:
http://www.ibm.com/developerworks/xml/library/x-diff/index.html
Un documento html puede ser coaccionado en un documento XML con una hermosa sopa y luego se puede comparar utilizando las técnicas enumeradas allí.
La forma de hacerlo es no comparar toda la página, porque como dices, un Humano tampoco sería engañado por eso. Digamos que está interesado en los artículos de noticias de un Yahoo! página, entonces debería mirar solo en la sección de noticias. Entonces puede hacer lo que sea, una comparación hash o literal entre la versión nueva y la anterior.
Podría tratar de usar encabezados HTTP como If-Modified-Since o algunos otros encabezados relacionados con caché. Además, puede ser útil mirar un archivo de mapa del sitio para ver con qué frecuencia se espera que los motores de búsqueda lo revisen.
Mi otro intento (tal vez para ser utilizado en conjunción) sería hacer una lista de todas las id
y class
encontradas en div
s en la página. Si estas listas no coinciden, es probable que haya habido un cambio razonablemente notable. De lo contrario, probablemente sean muy similares.
EDITAR: También puede comparar los src
s de los elementos img
.
Podrías generar un hash MD5 de cada uno de ellos, luego comparar eso. Como dijiste, bastante fácil.
Lo que estás buscando es una técnica para comparar dos páginas que tienen elementos arbitrarios que pueden cambiar. Es un problema difícil.
- Identifica las áreas en una página que pueden cambiar y no te importa. ¡Cuidadoso! Ellos siempre se moverán.
- Haga un hash o haga una suma de comprobación del DOM de solo las partes de la página que le interesan. ¡Cuidadoso! Estos también siempre estarán cambiando.
Te enfrentas a la primera regla del raspado de la pantalla: la página es inherentemente volátil. Entonces es un problema difícil. Su solución NUNCA será lo suficientemente robusta como para tener en cuenta la variedad infinita de cambios sutiles a los que estarán sujetos sus datos de origen, a menos que también tenga control directo sobre las páginas de origen y pueda diseñar su solución con eso.
¡Buena suerte! He tenido experiencia con sistemas que intentaron resolver este problema y es realmente un hueso duro de roer.
Puede detectar que dos páginas son iguales utilizando algún tipo de métrica de similitud, como la similitud del coseno . Luego, debe definir un umbral mínimo que puede usar para aceptar si los dos documentos son iguales. Por ejemplo, elegiría un valor más cercano a 1 al aplicar la medida del coseno, ya que varía de -1 para totalmente diferente y 1 para idéntico.
Puede usar un componente de navegador web para hacer una captura de pantalla de las dos páginas y luego comparar las imágenes. Podría ser la opción más simple.
Sin un conocimiento profundo de la estructura de las páginas que intenta comparar, entonces esto podría ser muy complicado. Es decir, cómo se supone que una máquina dice que una página con un par de imágenes diferentes es la misma; si se trata de un sitio de noticias con anuncios, entonces debería ser la misma, pero si es la cartera de un fotógrafo, entonces definitivamente es diferente.
Si conoces la estructura de la página, lo que haré es seleccionar manualmente partes de la página (usando identificadores, selectores de CSS, XPath, etc.) para comparar. Por ejemplo, solo compare los #content
entre actualizaciones de página. A partir de ahí, es posible que deba agregar un nivel de tolerancia a una comparación de carga por carga.
Hay un servicio que hace algo similar, en realidad. Se llama Rsspect (escrito por Ryan North de la fama de Qwantz), que detectará los cambios en cualquier sitio web y creará un canal RSS, incluso si no controla la página.
Tuve un problema similar. Estaba intentando diseñar un sistema de enlace seguro para un directorio de enlaces enviados por el usuario. Un usuario publicaría una página en un blog o sitio de noticias y enviaría el enlace al índice. Un humano verificará que el enlace sea apropiado y luego agregará la página al índice.
El problema era encontrar una forma de automatizar las comprobaciones que garantizaran que el enlace fuera apropiado a lo largo del tiempo. Por ejemplo, ¿alguien modificó la página unas semanas más tarde e insertó insultos raciales? ¿Empezó el sitio de noticias a decirle a la gente "debe suscribirse para leer esta historia"?
Terminé extrayendo elementos de párrafo <p> y comparando la copia en caché con la palabra por palabra actual. En los términos más simples:
cached[] = { "Lorem", "Ipsum", "..." };
scanned[] = { "Lorem, "foo", ... };
Después de eso, una serie de clasificadores trabajaría en ello, ignorando las palabras comunes "if but can orand" mientras se tratan otras palabras (profanity, etc) con un peso mayor.
Esto resultó en un sistema de puntuación que casi ignoraría ediciones menores y revisiones (errores tipográficos, estructura de oraciones, etc.) pero rápidamente revelaría si el contenido necesitaba ser examinado nuevamente. A continuación, se devolvió una puntuación, los puntajes por encima de un umbral se pondrían en una cola para que un ser humano vuelva a verificar.
Esto también ayudó a explicar los principales cambios cosméticos en el sitio. No me gustaría que funcione completamente solo, pero hizo su trabajo de forma predecible con un poco de ayuda de los humanos. Es cierto que el sistema no fue tan eficiente como podría haber sido en lo que respecta a la metodología.
Yo uso vgrep para ese tipo de cosas.
Es una herramienta poco conocida llamada visual-grep que se basa en tecnología avanzada como el dispositivo ocular sapient y la corteza visual para determinar muy rápidamente la uniformidad de las páginas una al lado de la otra, y es notablemente precisa y eficiente (debe ser ya que ha sido en desarrollo durante bastante tiempo).
Marcando la wiki de la comunidad en caso de que la policía del humor esté fuera hoy :-).
Hace poco encontré este problema y trabajé en una solución de JavaScript aquí: https://github.com/kennychua/pdiffy/
Le permite comparar imágenes de una página (preferiblemente formato PNG sin pérdida) y le indicará si las imágenes son diferentes y, de ser así, resaltará las diferencias.
También tiene la capacidad de ignorar áreas como el problema de la marca de tiempo que describes
Para este tipo de problema, creo que buscar documentos académicos es mucho mejor que preguntarle a , cuando se trata de detalles los expertos suelen ser mucho más inteligentes que la multitud.
Todos los webcrawlers o motores de búsqueda tienen este problema y lo han resuelto. Probablemente haya un buen enfoque utilizando un método basado en el kernel, como lo sugiere la respuesta aceptada , pero es probable que desee comenzar con técnicas más simples que se sabe que funcionan bien. Luego puede pasar a los métodos del kernel y probar para ver si mejoran sus resultados.
Su mejor apuesta es leer el artículo de Henzinger de 2006 "Encontrar páginas web casi duplicadas: una evaluación a gran escala de algoritmos"
y probablemente esté buscando generar una huella dactilar Rabin como primer paso con ''Huellas dactilares por polinomios aleatorios'' Rabin 1986 .
Parece que busca una forma robusta de medir la similitud de dos páginas.
Dado que la estructura de la página no cambiará tanto, podemos reducir el problema para probar si el texto en la página es más o menos el mismo. Por supuesto, con este enfoque, los problemas aludidos por nickf con respecto a la página de un fotógrafo siguen ahí, pero si usted está interesado principalmente en Yahoo! noticias o similares esto debería estar bien.
Para comparar páginas, puede usar un método de aprendizaje automático llamado "kernels de cadena". Aquí hay un documento temprano , un conjunto reciente de diapositivas en un paquete R y una conferencia en video .
Muy aproximadamente, un núcleo de cadena busca cuántas palabras, pares de palabras, triples de palabras, etc. dos documentos tienen en común. Si A y B son dos documentos y k es un núcleo de cadena, cuanto mayor sea el valor de k (A, B), más similares serán los dos documentos.
Si establece un umbral t y solo dice que dos documentos son iguales para k (A, B)> t, debe tener una forma razonablemente buena de hacer lo que quiera. Por supuesto, deberá ajustar el umbral para obtener los mejores resultados para su aplicación.