Obtener datos de una página web de manera estable y eficiente

11

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.

Miguel
fuente
8
No hay una forma estable, no importa cómo implemente su raspado, puede romperse fácilmente con un simple cambio de la página web. La forma estable de obtener sus datos es contactar a los autores de los datos y negociar un acuerdo para que obtenga los datos en un formato correcto. A veces eso ni siquiera cuesta dinero.
Joachim Sauer
1
@JoachimSauer - La pregunta aún podría responderse con el 'mejor' método.
Anónimo
Dado que la mayoría de los sitios web son dinámicos y almacenan sus datos en bases de datos, la mejor manera es obtener la base de datos del sitio web. Si el sitio web tiene una API, puede usarla. En caso de que desee raspar las páginas estáticas, los módulos integrados Pyllib urllib y HTMLParser funcionan bien. En PyPi también hay disponibles algunos paquetes para raspar HTML.
Ubermensch
El raspado del sitio es un negocio skeezy. Realmente no hay una forma estable de hacer esto porque los propietarios de sitios no quieren que lo hagas, y la industria en su conjunto está tratando de evitar que la gente lo haga.
Steven Evers
1
¿Quizás incrustar un navegador web como Webkit y luego usar secuencias de comandos DOM para obtener información de la página renderizada? Casi todas las plataformas pueden hacer eso, pero así es como lo haría en Qt: doc.qt.nokia.com/4.7-snapshot/qtwebkit-bridge.html
user16764

Respuestas:

2

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).

K.Steff
fuente
Gracias, ciertamente echaré un vistazo a XPath un poco más. No estoy acostumbrado a trabajar con él, así que será bueno aprenderlo. +1 :)
Mike
5

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 .

gsscoder
fuente
¿Y por 'código de red HTTP' te refieres a capturar la respuesta del servidor cuando se realiza una solicitud? Gracias por las sugerencias, me aseguraré de mirarlas. +1
Mike
Exactamente. En .NET puede usar System.Net.WebClient o una biblioteca como RestSharp | restsharp.org . Lo he usado también en Mono para Droid.
gsscoder
4

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.

Andrea
fuente
Gracias, he estado usando Beautiful Soup para hacer el trabajo. Sé que no será estable, probablemente debería aclararlo en mis preguntas. +1 para ti :)
Mike
4

Como una pregunta secundaria: ¿cómo lo harías cuando la página web esté construida por llamadas Ajax?

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.

Noche oscura
fuente
2
Vale la pena señalar que muchos servicios inspeccionan los encabezados HTTP para asegurarse de que HTTP_X_REQUESTED_WITHes 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).
Tim Post
@TimPost estás 100% correcto. Estoy de acuerdo en que es "asqueroso" :) pero en ausencia de una API pública, las necesidades deben ...
Darknight
Podría usar esto en mi propia aplicación con tecnología AJAX (y por 'propio' no quiero decir que lo escribí, pero la configuración es mía), pero no me parece correcto intentar omitir el sistema de otro servidor, así que debo estar de acuerdo con @ TimPost, se siente un poco "asqueroso". Sin embargo, es una buena idea, ¡gracias! +1!
Mike
1

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.

nohros
fuente
Sé que las páginas HTML no deberían ser analizadas por las computadoras, pero a veces simplemente no hay otra opción. Además, estoy usando información disponible públicamente para un proyecto personal que no es comercial de ninguna manera, no creo que necesite autorización explícita, ¿verdad? ¡Gracias por tu contribución! +1 para ti también;)
Mike
@MikeHeremans Para saber si está autorizado para obtener información de un sitio web, lea el ToS y el archivo robots.txt. Si ambos no le niegan el derecho de eliminar información automáticamente, probablemente debería estar bien en la mayoría de los casos legalmente. Por supuesto, IANAL ...
K.Steff
Si desea ver el código del proyecto mencionado: code.google.com/p/acao-toolkit/source/browse/… . Verifique content_script.js, es el código que se inyecta en la página.
nohros