Pregunta

¿Cómo se analizan de forma inteligente los datos devueltos por los resultados de búsqueda en una página?

Por ejemplo, supongamos que me gustaría crear un servicio web que busque libros en línea analizando los resultados de búsqueda de los sitios web de muchos proveedores de libros. Podría obtener los datos HTML sin procesar de la página y hacer algunas expresiones regulares para que los datos funcionen para mi servicio web, pero si alguno de los sitios web cambia el formato de las páginas, ¡mi código se rompe!

RSS es de hecho una opción maravillosa, pero muchos sitios no tienen una búsqueda basada en XML / JSON.

¿Hay algún kit que ayude a difundir información en las páginas automáticamente? Una idea descabellada sería que un módulo de IA difuso reconozca patrones en una página de resultados de búsqueda y analice los resultados en consecuencia ...

¿Fue útil?

Solución

He hecho algo de esto recientemente, y aquí están mis experiencias.

Hay tres enfoques básicos:

  1. Expresiones regulares.
    • Más flexible, más fácil de usar con información poco estructurada y formatos cambiantes.
    • Es más difícil hacer un análisis estructural / de etiqueta, pero es más fácil hacer una coincidencia de texto.
    • Validación integrada del formato de datos.
    • Es más difícil de mantener que otros, porque debe escribir una expresión regular para cada patrón que desee usar para extraer / transformar el documento
    • Generalmente más lento que 2 y 3.
    • Funciona bien para listas de elementos con un formato similar
    • Una buena herramienta de desarrollo / prueba de expresiones regulares y algunas páginas de muestra ayudarán. Tengo cosas buenas que decir sobre RegexBuddy aquí. Prueba su demo.
    • He tenido el mayor éxito con esto. La flexibilidad le permite trabajar con código HTML desagradable, brutal y salvaje.
  2. Convierta HTML a XHTML y use herramientas de extracción de XML. Limpie HTML, conviértalo a XHTML legal y use XPath / XQuery / X-lo que sea para consultarlo como datos XML.
    • Herramientas: TagSoup, HTMLTidy, etc.
    • La calidad de la conversión de HTML a XHML es MUY importante y muy variable.
    • La mejor solución si los datos que desea están estructurados por el diseño HTML y las etiquetas (datos en tablas HTML, listas, grupos DIV / SPAN, etc.)
    • Más adecuado para obtener estructuras de enlaces, tablas anidadas, imágenes, listas, etc.
    • Debería ser más rápido que la opción 1, pero más lento que la opción 3.
    • Funciona bien si el formato de contenido cambia / es variable, pero la estructura / diseño del documento no lo hace.
    • Si los datos no están estructurados por etiquetas HTML, estás en problemas.
    • Se puede usar con la opción 1.
  3. Generador de analizador (ANTLR, etc.) : crea una gramática para el análisis y amp; analizando la página.
    • No he intentado esto porque no era adecuado para mis páginas (desordenadas)
    • Más adecuado si la estructura HTML es altamente estructurada, muy constante, regular y nunca cambia.
    • Use esto si hay patrones fáciles de describir en el documento, pero no involucran etiquetas HTML e involucran comportamientos complejos o recurrentes
    • No requiere entrada XHTML
    • RENDIMIENTO MÁS RÁPIDO, generalmente
    • Gran curva de aprendizaje, pero más fácil de mantener

He jugado con cosecha web para la opción 2, pero encuentro su sintaxis para ser un poco raro. Mezcla de XML y algo de lenguaje de script pseudo-Java. Si te gusta Java y te gusta la extracción de datos al estilo XML (XPath, XQuery), ese podría ser el boleto para ti.


Editar: si usa expresiones regulares, ¡asegúrese de usar una biblioteca con cuantificadores perezosos y grupos de captura! Las bibliotecas de expresiones regulares más antiguas de PHP carecen de estas, y son indispensables para hacer coincidir los datos entre las etiquetas de apertura / cierre en HTML.

Otros consejos

Sin una estructura HTML fija para analizar, odiaría mantener expresiones regulares para encontrar datos. Es posible que tenga más suerte al analizar el HTML a través de un analizador adecuado que construya el árbol. Luego seleccione elementos ... que serían más fáciles de mantener.

Obviamente, la mejor manera es obtener una salida XML del motor con un marcado fijo que pueda analizar y validar. Creo que una biblioteca de análisis HTML con algunas pruebas 'en la oscuridad' del árbol producido sería más fácil de mantener que las expresiones regulares.

De esta manera, solo tiene que verificar < a href = " blah " class = " cache_link " > ... convirtiéndose en < a href = " blah " class = " cache_result " > ... o lo que sea.

En pocas palabras, agrupar elementos específicos con regexp sería sombrío. Un mejor enfoque es construir un modelo DOM de la página y buscar 'anclas' para datos de caracteres en las etiquetas.

O envíe un correo electrónico al sitio indicando un caso para una API XML ... ¡podría ser contratado!

No dices qué idioma estás usando. En Java, puede usar TagSoup y XPath para ayudar a minimizar el dolor. Hay un ejemplo de este blog (por supuesto, el XPath puede ser mucho más complicado según lo requieran sus necesidades):

URL url = new URL("http://example.com");
SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser"); // build a JDOM tree from a SAX stream provided by tagsoup
Document doc = builder.build(url);
JDOMXPath titlePath = new JDOMXPath("/h:html/h:head/h:title");
titlePath.addNamespace("h","http://www.w3.org/1999/xhtml");
String title = ((Element)titlePath.selectSingleNode(doc)).getText();
System.out.println("Title is "+title);

Recomiendo externalizar las expresiones XPath para que tenga alguna medida de protección si el sitio cambia.

Aquí hay un ejemplo de XPath que definitivamente no estoy usando para crear pantallas en este sitio. De ninguna manera, yo no:

"//h:div[contains(@class,'question-summary')]/h:div[@class='summary']//h:h3"

No ha mencionado qué pila de tecnología está utilizando. Si está analizando HTML, usaría una biblioteca de análisis:

También hay servicios web que hacen exactamente lo que estás diciendo: comerciales y gratuitos. Raspan sitios y ofrecen interfaces de servicio web.

Y un servicio web genérico que ofrece algo de raspado de pantalla es Yahoo Pipes. pregunta anterior de stackoverflow sobre esa

No es infalible, pero es posible que desee ver un analizador como Beautiful Soup No encontrará mágicamente la misma información si el diseño cambia, pero es mucho más fácil que escribir expresiones regulares complejas. Tenga en cuenta que este es un módulo de Python.

Desafortunadamente, 'raspar' es la solución más común, como dijiste al intentar analizar HTML de sitios web. Puede detectar cambios estructurales en la página y marcar una alerta para que la arregle, de modo que un cambio al final no dé como resultado datos incorrectos. Hasta que la web semántica sea una realidad, esa es prácticamente la única forma de garantizar un gran conjunto de datos.

Alternativamente, puede apegarse a pequeños conjuntos de datos proporcionados por las API. Yahoo está trabajando muy duro para proporcionar datos de búsqueda a través de las API (ver YDN), creo que la API de Amazon abre muchos datos de libros, etc., etc.

¡Espero que ayude un poco!

EDITAR: y si está utilizando PHP, recomendaría SimpleHTMLDOM

¿Ha buscado utilizar una biblioteca de manipulación html? Ruby tiene algunas muy buenas. por ejemplo, hpricot

Con una buena biblioteca, puede especificar las partes de la página que desea utilizando selectores CSS o xpath. Sería mucho más robusto que usar expresiones regulares.

Ejemplo de hpricot wiki:

 doc = Hpricot(open("qwantz.html"))
 (doc/'div img[@src^="http://www.qwantz.com/comics/"]')
   #=> Elements[...]

Estoy seguro de que podría encontrar una biblioteca que haga cosas similares en .NET o Python, etc.

Intenta buscar en Google para el screen scraping + el idioma que prefieras. Conozco varias opciones para python, puede encontrar el equivalente para su idioma preferido:

  • Sopa hermosa
  • mecanizar: similar a perl WWW: Mecanizar. Le proporciona un objeto similar al navegador para que no interactúe con las páginas web
  • lxml: enlace de python a libwww
  • scrapemark: utiliza plantillas para raspar partes de páginas
  • pyquery: le permite realizar consultas jQuery en documentos xml / xhtml
  • scrapy: un marco de raspado y rastreo web de alto nivel para escribir arañas para rastrear y analizar páginas web

Dependiendo del sitio web para eliminar, es posible que deba utilizar uno o más de los enfoques anteriores.

Si puede usar algo como Tag Soup , sería Un lugar para comenzar. Entonces podría tratar la página como una API XML, un poco.

Tiene una implementación de Java y C ++, ¡podría funcionar!

El perejil en http://www.parselets.com parece bastante elegante.

Le permite definir 'parslets' utilizando JSON lo que usted define qué buscar en la página, y luego analiza esos datos por usted.

Como han dicho otros, puede usar un analizador HTML que construye una representación DOM y consultarlo con XPath / XQuery. Encontré un artículo muy interesante aquí: teoría y práctica de Java: raspado de pantalla con XQuery - http://www.ibm.com/developerworks/xml/library/j-jtp03225.html

Muy bien, voy a usar el método de sopa The Tag como se recomienda.

Como una pregunta de seguimiento: ¿cómo lo hacen esos grandes sitios de tipo rascador? ¡He visto un motor de búsqueda de empleo (por ejemplo, Indeed.com) que escanea miles de sitios! ¿Son miles de expresiones regulares? Es casi imposible ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top