En 2003, me enfrenté a una pregunta similar. Necesitaba analizar el sitio web de mi periódico local. Su sitio web cambiaba periódicamente de estructura y estaba cansado de escribir actualizaciones en mi código Perl. En aquellos días, todo era REGEX. (Sigue siendo útil en muchas situaciones).
Así que tomé un enfoque drásticamente diferente para el contenido limpio, la última modificación, la información del autor, etc. Básicamente funciona así:
Caché una copia de cada página
Reste la página más nueva de la página anterior, primero limpie la estructura con algunas cosas como ajuste de línea, eliminación de comentarios, espacios en blanco adicionales, etc.
Tome la diferencia, inserte en la base de datos.
En cada carrera sucesiva, compare las capturas. Si hay un cambio en la estructura, puedo continuar el proceso.
Después de 2–5 capturas en las páginas cambiadas, puedo ver patrones. Escribí mis guiones para mirar esas estructuras de manera holgada, haciendo algunas expresiones regulares sobre cosas como marcas de tiempo en páginas, conteos de palabras, etc.
Cada cambio repentino marcado “Cambio significativo” = VERDADERO para que pueda consultar entre cambios repentinos.
El código era muy desordenado, pero hizo el trabajo. El software se retiró en 2008. Ejecuté 5 años, capaz de procesar muchos cambios en la estructura del sitio web con solo pequeños contratiempos. Cualquier contenido extraído que arrojara resultados bajos significaba que estaba en cola para compararlo en futuras memorias caché.
Básicamente, si un archivo de caché cuando se procesa, ya no produce contenido que se ajusta a ciertos patrones, o el analizador no puede encontrar etiquetas por ID, etc., marcamos ese archivo de caché en la base de datos para su procesamiento futuro, y nos olvidamos de él. Un trabajo separado espera hasta que X número de páginas estén disponibles.
Capturé el 100% del contenido de esta manera, manteniendo cuidadosamente los archivos de noticias.
Me gustaría volver a escribir esto nuevamente en PHP, pero esta vez, utilizando el método adicional de autodeterminación de la XPATH del árbol DOM donde se encontró el contenido y utilizando algunas otras técnicas que he aprendido a lo largo de los años.
No es imposible, lo hice. Si lo he hecho, otros también lo han hecho. No puedo ser el primero en hacerlo.
Mi inspiración para este proyecto provino de cómo podemos ver en detalle la distancia desde el suelo hasta el espacio interestelar. Al colocar dos telescopios en dos lugares, cada uno verá sus propios artefactos, como nubes, polvo, etc. Pero tome 2 imágenes y superpórtelas y, de repente, puede eliminar lo que es diferente, pero mantener lo mismo. De esta manera, puede capturar solo lo que cambió, o lo contrario, lo que es lo mismo.
Principalmente, será el contenido el que cambie entre cada captura. Eso es lo que estás buscando.
Otro enfoque que puede tomar es convertir el árbol DOM en una matriz, luego comparar las copias anteriores convertidas en matrices, luego usar las funciones de matriz para verificar las diferencias y luego aplicar alguna verificación de patrones lógicos en la salida. De esta forma, puede controlar más estrictamente el recorrido del árbol y eliminar automáticamente cosas como el espacio en blanco adicional.
Recientemente trabajé en un sistema para procesar OCR, capturando coordenadas de palabras conocidas como datos HOCR. Estos datos son básicamente un documento HTML puro con información sobre la ubicación de la palabra. En teoría, esto te ayuda a recrear un documento en HTML. Eso no es importante. Lo importante es que es un ejemplo de procesamiento de dom HTML mediante programación.
Considere esto usando la biblioteca de código abierto Simple Dom Parser para PHP
función html2json ($ filename, $ pageNumber = 0) {
$ sha1_of_source_pdf = sha1 ($ nombre de archivo);
$ html = file_get_html ($ nombre de archivo);
$ all_words = array ();
$ words_at_startx = array ();
foreach ($ html-> find (‘div [class = ocr_carea]’) como $ ocr_carea) {
foreach ($ ocr_carea-> find (‘p [class = ocr_par]’) como $ ocr_par) {
foreach ($ ocr_par-> find (‘span [class = ocr_line]’) como $ ocr_line) {
if (trim ($ ocr_line-> plaintext)! = “”) {
foreach ($ ocr_line-> find (‘span [class = ocrx_word]’) como $ ocrx_word) {
list ($ basura, $ startX, $ startY, $ endX, $ endY) = explotar (“”, explotar (‘;’, $ ocrx_word-> title) [0]);
$ all_words [$ ocrx_word-> id] [$ startX] [] = array ($ ocrx_word-> plaintext, array ($ startX, $ startY, $ endX, $ endY));
// $ fieldspotID = sha1 (json_encode (array ($ sha1_of_source_pdf, $ pageNumber, $ ocr_carea-> id, $ ocr_par-> id, $ ocr_line-> id, $ startX)));
$ fieldspotID = $ sha1_of_source_pdf. “->”. $ pageNumber. “->”. $ ocr_carea-> id. “->”. $ ocr_par-> id. “->”. $ ocr_line-> id. “-> “. $ startX;
$ fieldspotIDs [] = $ fieldspotID;
$ words_at_startx [$ ocr_carea-> id] [$ ocr_par-> id] [$ ocr_line-> id] [$ startX] = array (“ocrx_word” => trim ($ ocrx_word-> plaintext), “startX” => $ startX, “startY” => $ startY, “endX” => $ endX, “endY” => $ endY, “fieldspotLineID” => $ fieldspotID);
}
}
}
}
}
devuelve $ words_at_startx;
}
Como puede ver, esta función desgarra un documento, extrayendo datos conocidos de clases ya conocidas. SIN EMBARGO. Esto también se puede hacer de forma dinámica. Puede convertir todo el árbol DOM en una matriz.
Al hacer una diferencia de matriz, obtendrá una lista de contenido modificado. Esto solo funciona si la estructura permanece igual entre las capturas. Una vez que hay un cambio significativo, debe marcar cuándo ocurre este cambio y considerarlo en su código.
Hay varios trucos que puedes realizar para hacer lo que quieras.