Recientemente he aprendido que usar una expresión regular para analizar el HTML de un sitio web para obtener los datos que necesita no es el mejor curso de acción.
Entonces mi pregunta es simple: ¿Cuál es, entonces, la mejor / más eficiente y una forma generalmente estable de obtener estos datos?
Debo señalar que:
- No hay API's
- No hay otra fuente de donde pueda obtener los datos (sin bases de datos, feeds y demás)
- No hay acceso a los archivos de origen. (Datos de sitios web públicos)
- Digamos que los datos son texto normal, que se muestra en una tabla en una página html.
Actualmente estoy usando Python para mi proyecto, pero una solución / consejos independientes del lenguaje sería bueno.
Como una pregunta secundaria: ¿cómo lo harías cuando la página web esté construida por llamadas Ajax?
EDITAR:
En el caso del análisis HTML, sé que no hay una forma estable real de obtener los datos. Tan pronto como la página cambie, su analizador habrá terminado. Lo que quiero decir con estable en este caso es: una forma eficiente de analizar la página, que siempre me da los mismos resultados (obviamente para el mismo conjunto de datos) siempre que la página no cambie.
Respuestas:
Bueno, aquí están mis 2 centavos:
Si no hay AJAX involucrado, o se puede borrar fácilmente, 'arregle' el HTML a XHTML (usando HTMLTidy por ejemplo), luego use XPath en lugar de expresiones regulares para extraer la información.
En una página web bien estructurada, las entidades de información separadas lógicamente están en diferentes
<div>
correos electrónicos, o cualquier otra etiqueta, lo que significa que podrá encontrar fácilmente la información correcta con una simple expresión XPath. Esto también es genial porque puedes probarlo en, por ejemplo, la consola de Chrome o la consola de desarrollador de Firefox y verificar que funciona antes de escribir incluso una línea de otro código.Este enfoque también tiene una relación señal / ruido muy alta, ya que, por lo general, las expresiones para seleccionar la información relevante serán de una sola línea. También son mucho más fáciles de leer que las expresiones regulares y están diseñados para ese propósito.
Si hay AJAX y JavaScript serio involucrado en la página, incruste un componente del navegador en la aplicación y use su DOM para activar los eventos que necesita, y XPath para extraer información. Hay muchos componentes de navegador integrables buenos, la mayoría de los cuales usan navegadores del mundo real debajo del capó, lo cual es una buena cosa, ya que una página web puede ser incorrecta (X) HTML, pero aún así funciona bien en todos los principales navegadores ( en realidad, la mayoría de las páginas eventualmente se ponen de esta manera).
fuente
En mi experiencia, usando el entorno .NET, puede aprovechar el paquete de agilidad HTML .
Si la página está formateada como XHTML, también puede usar un analizador XML normal. Hay mucho de allí para cualquier entorno que puedas imaginar.
Para la pregunta secundaria sobre AJAX, puede usar el código de red HTTP normal para obtener datos y analizarlos.
Nuevamente, si su pila AJAX devuelve XML, tendrá muchas opciones. Si devuelve JSON, considere una biblioteca que le permita asignar la secuencia a los objetos escritos. En .NET te sugiero Newtonsoft.Json .
fuente
Analizar HTML no es una tarea completamente trivial, ya que uno tiene que lidiar con un marcado posiblemente incorrecto (etiqueta de sopa). Durante los años, los navegadores han implementado más o menos la misma estrategia para tratar los errores, y ese algoritmo ha sido bautizado en la especificación HTML5 (sí, la especificación HTML5 especifica qué hacer con cosas que no son HTML5).
Hay bibliotecas para todos los idiomas principales para analizar HTML, por ejemplo, este .
En cualquier caso, lo que obtendrá no es estable en ningún sentido. Cada vez que cambia el formato de la página web, debe adaptar su raspador.
fuente
Si se realizan llamadas ajax, es muy probable que sea alguna URL POST o GET con algunas variables.
Examinaría el JavaScript para averiguar cuáles son los puntos finales y los parámetros. Después de eso, es muy probable que los datos devueltos sean json / xml / texto plano o quizás html parcial.
Una vez que conoce la información anterior, simplemente realiza una solicitud GET o POST a ese punto final y analiza los datos devueltos.
fuente
HTTP_X_REQUESTED_WITH
es asíXMLHttpRequest
. Los buenos también implementarán algún tipo de protección XSRF para solicitudes POST, por lo que también necesitará esa cookie mágica. Hacer cosquillas en los puntos finales AJAX no expuestos deliberadamente por alguna API pública me parece un poco desagradable, y su raspador es tan propenso a romperse si cambia la salida (o la política de solicitud).No hay una forma estable o mejor de hacer esto, las páginas web HTML no fueron hechas para ser manipuladas por computadoras. Es para usuarios humanos, pero si necesita hacerlo, le sugiero que use un navegador y algunos javascript. En mi trabajo, participé en un proyecto que necesitaba extraer información de un sitio de terceros. La aplicación fue desarrollada como una extensión de Chrome. La lógica de la aplicación se escribe usando JavaScript que se inyecta en el sitio después de que se completa la carga de la página. Los datos que se extraen se envían a una base de datos a través de un servidor http. No es el mejor enfoque, pero funciona. Ps: El propietario del sitio nos ha autorizado a hacer tal cosa.
fuente