¿Cómo raspar varios sitios con Beautiful Soup si cada sitio está estructurado de manera diferente? Es imposible

Este es uno de los principales problemas que enfrentan las empresas mientras desean adquirir datos de la web a gran escala. Los sitios web experimentan cambios estructurales y de diseño con bastante frecuencia en estos días y esto podría crear un gran problema en términos de mantenimiento al usar técnicas de extracción de datos automatizadas.

Debido a esta naturaleza dinámica de la web, no es posible escribir un solo programa que pueda manejar múltiples sitios web. La configuración de raspado web debe codificarse por separado para cada sitio de destino y esto necesita un equipo de programadores expertos. Además, dependiendo de sus requisitos, tendrá que monitorear constantemente cada sitio web para obtener nuevas actualizaciones todos los días o tal vez también cada pocas horas.

Dados los desafíos involucrados en garantizar un proceso de extracción de datos sin problemas, podría ser una distracción y un dolor de cabeza para las organizaciones cuando se realiza internamente. Una mejor opción sería ir con un proveedor de datos como servicio para asumir la propiedad completa del proceso de agregación de datos. Quién es experto en el manejo de tales aspectos del raspado web

Le ahorra la carga de crear un equipo de expertos en dominio técnicamente sólidos y recursos técnicos de alta gama que son cruciales para ejecutar una configuración de rastreo web. También lo ayudará a asignar más tiempo para aplicar los datos a su negocio y obtener información, ahorrando horas de trabajo y costos asociados.

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.

Deje que los profesionales se encarguen de eso – Datahen – Servicios de extracción de datos, rastreo y rastreo web

La respuesta es no. Hay tantas herramientas de raspado web por ahí. Eso facilita el raspado web. Los sitios web cambian, hay errores, por ejemplo, cuando accede a un sitio web, a veces es un tiempo de espera. ¿Imagina ese tiempo de espera en una escala de 10k páginas cargadas? Se convierte en una pesadilla. Algunas de las herramientas que puede usar son contentgrabber .com visualwebripper. com primero es mucho mejor pero más caro. Segundo obtendrá el trabajo, pero requiere más trabajo y una curva de aprendizaje más dura. Buena suerte