2009-01-19 17 views
11

¿Cuáles son algunas de las técnicas buenas para detectar si una página web es igual a otra?¿Cómo determinar si dos páginas web son iguales?

Por igual, no me refiero a char-para-char equivalente (eso es fácil), pero es lo suficientemente robusta como para ignorar algo así como una fecha/hora actual en la página, etc.

por ejemplo, tome una 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.

Nota No estoy tratando de corregir (o confiar) en la normalización de URL. Es decir, descubriendo que foo.html & foo.html? Bar = bang son lo mismo.

+0

¿Qué pasó al final? – RJHunter

Respuesta

11

Parece que está buscando 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 the problems alluded to by nickf con respecto a una página de fotógrafos todavía están allí, pero si usted está principalmente interesado 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í está un paper temprano un conjunto reciente de slides en un paquete R y un video lecture.

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 los mismos 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.

+1

La URL de "diapositivas" (http://www.logic.at/staff/feinerer/publications/talks/237_GfKl_2006.pdf) está roto. –

0

Sin un conocimiento profundo de la estructura de las páginas que está tratando de comparar, 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 conoce la estructura de la página, entonces lo que haría es seleccionar manualmente porciones de la página (usando ID, selectores de CSS, XPath, etc.) para comparar. Por ejemplo, solo compare las divisiones #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.

0

Puede generar un hash MD5 de cada uno de ellos, luego compare 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.

  1. Identifique las áreas de una página que pueden cambiar y que no le interesan. ¡Cuidadoso! Ellos siempre se moverán.
  2. Haz un hash o realiza una suma de comprobación del DOM de solo las partes de la página que te interesan. ¡Cuidadoso! Estos también siempre estarán cambiando.

Usted se enfrenta a la primera regla de 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 contra eso.

¡Buena suerte! He tenido experiencia con sistemas que intentaron resolver este problema y es realmente un hueso duro de roer.

+0

Hashing solo te llevará hasta el momento b/c es una diferencia binaria; o ellos hacen lo mismo o no lo hacen. Mientras que otras medidas mencionadas anteriormente (similitud de coseno, etc.) miden con mayor precisión * cómo * cerca están las páginas. Tratando con cosas de la web, ese es probablemente el ámbito en el que quieres estar. –

0

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.

2

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 ya que ha estado en desarrollo durante bastante tiempo).

Marcando la wiki de la comunidad en caso de que la policía del humor esté fuera hoy :-).

+1

La policía humorística debería tan abajo-votar por la cojera de esta broma;) –

+0

+1. Lástima que tu comunidad sea wiki-ed. =) –

+0

Si no lo hubiera hecho, sospecho que ahora tendré -20. La mayoría de los So'ers (yo incluido) parecen fruncir el ceño al humor en las respuestas. – paxdiablo

5

Puede detectar que dos páginas son iguales utilizando algún tipo de métrica de similitud, como cosine similarity. 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.

0

Lo primero que 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 trata de comparar dos documentos XML:
http://www.ibm.com/developerworks/xml/library/x-diff/index.html

un documento HTML se puede forzar en un documento XML con hermosa sopa continuación, en comparación con las técnicas que allí se indican.

1

Puede usar un componente del 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.

0

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 idear una forma de automatizar las comprobaciones que garantizaran que el enlace seguía siendo 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 el párrafo <p> elementos y comparando la copia en caché con la palabra actual por palabra. En términos más simples:

cached[] = { "Lorem", "Ipsum", "..." }; 
scanned[] = { "Lorem, "foo", ... }; 

Después de eso, una serie de clasificadores sería trabajar en él sin tener en cuenta las palabras comunes 'si, pero puede o y' mientras que el tratamiento de otras palabras (profanidad, etc.) con un peso más pesado.

Esto dio como resultado un sistema de puntuación que casi ignoraría ediciones menores y revisiones (errores tipográficos, estructura de oraciones, etc.) pero revelaría rápidamente 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.

2

Dependiendo de lo que esté haciendo, le puede interesar TemplateMaker. Le das algunos hilos (como páginas web) y marca los bits que cambian.

En su Yahoo! News ejemplo, usted iría a la página una vez y le diría 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. (Le daría las piezas que cambiaron, si le interesaba eso)

0

Puede tratar de usar encabezados HTTP como If-Modified-Since, u 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 conjunto) sería hacer una lista de todos id sy class es encontrado 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 elementos img.

4

Para este tipo de problema, encuentro que buscar documentos académicos es mucho mejor que pedir StackOverflow, 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 kernel like the accepted answer is suggesting, pero es probable que desee comenzar con técnicas más simples que funcionan bien. Luego puede pasar a los métodos del kernel y probar para ver si mejoran sus resultados.

Lo mejor es leer Henzinger's 2006 paper 'Finding near-duplicate web pages: a large scale evaluation of algorithms'

y es probable que se busca en la generación de una huella digital Rabin como primer paso con 'Fingerprinting by random polynomials' Rabin 1986.

0

me encontré recientemente este problema y trabajaron en una solución JavaScript aquí: https://github.com/kennychua/pdiffy/

Se le permite comparar las imágenes de una página (formato PNG preferentemente sin pérdida) y se le indicará si las imágenes son diferentes, y si es así, resaltará las diferencias.

También tiene la capacidad de ignorar el problema áreas como marca de tiempo que usted describe

Cuestiones relacionadas