2010-03-27 21 views
5

Estoy usando PHP para raspar un sitio web y recopilar algunos datos. Todo está hecho sin usar expresiones regulares. Estoy utilizando el método de explosión de php() para encontrar etiquetas HTML particulares en su lugar.¿Cómo saber si el sitio web que se está raspando ha cambiado?

Es posible que si la estructura del sitio web cambia (CSS, HTML), el raspador pueda recopilar datos incorrectos. Entonces la pregunta es: ¿cómo sé si la estructura HTML ha cambiado? Cómo identificar esto antes de almacenar cualquier información en mi base de datos para evitar que se almacenen datos incorrectos.

Respuesta

7

Creo que no tiene ninguna solución limpia si está raspando una página donde el contenido cambia.

He desarrollado varios rascadores de pitón y sé cómo puede ser frustrante cuando el sitio solo hace un cambio sutil en su diseño.

Puede intentar una solución a la mecanizada (no conoce la contraparte php) y si tiene suerte puede aislar el contenido que necesita extraer (¿enlaces?).

Otro enfoque posible sería codificar algunas restricciones y verificarlas antes de almacenar en db.

Por ejemplo, si está raspando Urls, deberá verificar que lo que rasparon haya sido formalmente una Url válida; lo mismo para ID entero o lo que sea que quiera raspar que pueda reconocerse como válido.

Si está raspando texto sin formato, será más difícil de verificar.

+0

Hola, ese soy yo. Lo siento porque no fue intencional !! Presioné el botón equivocado y ahora no puedo cambiarlo. Dice: "vote demasiado viejo para ser cambiado, a menos que se edite esta respuesta". Perdón nuevamente, por favor cambie la respuesta para poder votarla. No fue intencional. – Yeti

1

En primer lugar, en algunos casos es posible que desee comparar hashes del original al nuevo html. MD5 y SHA1 son dos hash populares. Esto puede o no ser válido en todas las circunstancias, pero es algo con lo que debe estar familiarizado. Esto le indicará si algo ha cambiado: contenido, etiquetas o cualquier otra cosa.

Para comprender si la estructura ha cambiado, deberá capturar un histograma de las ocurrencias de las etiquetas y luego compararlas. Si te preocupa que las etiquetas estén fuera de servicio, entonces debes capturar un árbol de las etiquetas y hacer una comparación para ver si las etiquetas aparecen en el mismo orden. Esto va a ser muy específico para lo que quiere lograr.

PHP Simple HTML DOM Parser es una herramienta que te ayudará a analizar el código HTML.

+2

@BrainLy: El hecho de que el nuevo archivo html tenga un hash diferente, no significa que la estructura HTML haya cambiado. – codaddict

+0

¡Los valores hash * siempre * difieren porque los datos que estoy recortando cambian cada hora! Lo que quise decir fue, ¿qué pasaría si cambiaran el diseño del sitio, cómo se puede detectar de una manera eficiente? – Yeti

+0

Las páginas dinámicas producirán consistentemente hashes diferentes, generalmente sin grandes cambios estructurales. –

0

Explode() no es un analizador HTML, pero desea conocer los cambios en la estructura HTML. Eso va a ser complicado. Intenta usar un analizador HTML. Nada más podrá hacer esto correctamente.

+0

¿Alguien quiere explicar su voto negativo? – spender

2

Si desea conocer los cambios con respecto a la estructura, creo que la mejor manera es almacenar la estructura DOM de su primera página y luego compararla con una nueva.

Hay muchas manera que puede hacerlo: - SAXParser DOMParser etc

tengo un pequeño blog que le dará algunos consejos para lo que quiero decir http://let-them-c.blogspot.com/2009/04/xml-as-objects-in-oops.html

o puede utilizar http://en.wikipedia.org/wiki/Simple_API_for_XML o Analizador de utilidad DOm.

+1

Debe tener mucho cuidado al tratar de usar analizadores XML con HTML. Tienden a explotar en el más mínimo HTML malformado. –

2

Hablando de mi trasero aquí, pero es posible que desee consultar algunos métodos de Document Object Model PHP.

http://php.net/manual/en/book.dom.php

Si mi muy, muy limitada comprensión del DOM es correcta, un cambio en la estructura del sitio HTML cambiaría el modelo de objetos de documento, sino un cambio de contenido simple dentro de una estructura fija no lo haría. Entonces, si pudieras capturar el estado DOM y luego compararlo en cada raspado, ¿no podrías, en teoría, determinar que se ha realizado tal cambio?

(Por cierto, la forma en que hice esto cuando estaba tratando de recibir una notificación por correo electrónico cuando los resultados del examen de la barra se publicaron en una página en particular fue simplemente comparar los valores file_get_contents(). Sorprendentemente, funcionó perfectamente: No falsos positivos y me envió un correo electrónico tan pronto como el sitio publicó el contenido.)

2

Depende del sitio, pero puede contar el número de elementos de página en la página rayada como div, clase & etiquetas de estilo luego comparando estos totales con los de los rasguños posteriores detectan si la estructura de la página ha sido modificada.

Se podría utilizar un proceso similar para el archivo CSS donde los nombres de cada clase o identificación se pueden extraer usando expresiones regulares simples, almacenados y verificados según sea necesario. Si esta lista tiene nuevas incorporaciones, es casi seguro que la estructura de la página haya cambiado en alguna parte del sitio que se está raspando.

Cuestiones relacionadas