2009-08-03 10 views
28

¿Cómo se analizan inteligentemente los datos devueltos por los resultados de búsqueda en una página?¿Manera "inteligente" de analizar y usar datos del sitio web?

Por ejemplo, digamos que me gustaría crear un servicio web que busque libros en línea mediante el análisis de los resultados de búsqueda de muchos sitios web de proveedores de libros. Pude obtener los datos HTML sin formato 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 kits que ayuden a diseminar información en páginas automáticamente? Una idea loca sería tener un módulo de IA difusa reconocer patrones en una página de resultados de búsqueda, y analizar los resultados en consecuencia ...

+0

con respecto al idioma, estoy avanzado en php, pero estoy dispuesto a utilizar asp.net si es necesario. ¡Gracias por todas las respuestas! – bluebit

+0

Una buena expresión regular puede ser sorprendentemente flexible y tolerante en uso. Una buena técnica es hacer coincidir un área * antes de * un elemento de datos, luego colocar los datos en un grupo de captura con un cuantificador perezoso, luego unir un área * después * de los datos. Si define las coincidencias antes/después de una manera flexible, puede manejar los cambios en el formato muy bien. www.regular-expressions.info ofrece algunas buenas explicaciones sobre esta y otras técnicas. – BobMcGee

Respuesta

23

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

Hay tres enfoques básicos:

  1. expresiones regulares.
    • Más flexible, fácil de usar con información poco estructurada y formatos cambiantes.
    • Más difícil de hacer estructural/etiqueta de análisis, pero más fácil de hacer la coincidencia de texto.
    • Validación incorporada del formato de datos.
    • más difícil de mantener que otros, ya que hay que escribir una expresión regular para cada patrón que desea utilizar para extraer/transformar el documento
    • general más lento que 2 y 3.
    • funciona bien para las listas de de similar elementos formateados
    • 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
    • que he tenido el mayor éxito con esto. La flexibilidad le permite trabajar con un código HTML sucio, brutal e in-the-wild.
  2. Convierta HTML a XHTML y use herramientas de extracción XML. Limpiar HTML, convertirlo a XHTML legal y usar XPath/XQuery/X-whatever para consultarlo como datos XML.
    • Herramientas: TagSoup, HTMLTidy, etc
    • 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 y las etiquetas HTML (datos en tablas HTML, listas, grupos DIV/SPAN, etc.)
    • Más adecuado para obtener estructuras de enlace, tablas anidadas, imágenes, listas y etc.
    • debe ser más rápido que la opción 1, pero más lento que la opción 3.
    • funciona bien si los cambios de formato de contenido/es variable, pero la estructura del documento/diseño no lo hace.
    • Si los datos no se estructura mediante etiquetas HTML, que está en problemas.
    • se puede utilizar con la opción 1.
  3. generador de analizadores sintácticos (antlr, etc) - crear una gramática para analizar & análisis de la página.
    • No he probado esto porque no era adecuado para mis páginas (desordenadas)
    • El más conveniente si la estructura HTML es muy estructurado, muy constante, regular, y nunca cambia.
    • usar esto si existen fácil de describir los patrones en el documento, pero no implican etiquetas HTML e implican la recursividad o comportamientos complejos
    • no requiere conexión a XHTML
    • de rendimiento más rápido, por lo general
    • gran curva de aprendizaje, pero más fácil de mantener

he vanamente con web harvest para la opción 2, pero encuentran su sintaxis sea un poco raro. Mezcla de XML y algún lenguaje de scripting pseudo Java. Si le gusta Java, y le gusta la extracción de datos de estilo XML (XPath, XQuery), puede ser el boleto para usted.


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

3

Sin una estructura fija HTML para analizar, me gusta mantener las expresiones regulares para encontrar datos. Puede tener más suerte analizando el HTML a través de un analizador apropiado que construye el árbol. Luego selecciona elementos ... que serían más fáciles de mantener.

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

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

En pocas palabras, desmenuzar elementos específicos con expresiones regulares sería desalentador. Un mejor enfoque es construir un modelo tipo DOM de la página y buscar 'anclajes' a los datos de los caracteres en las etiquetas.

O envíe un correo electrónico al sitio indicando un caso para una API XML ... ¡es posible que lo contraten!

+0

Las expresiones regulares se pueden mantener si se hacen bien. Algunos sabores permiten comentarios incrustados, que pueden ayudar MUCHO. También puede usar grupos de captura y cuantificadores perezosos para hacer coincidir los elementos estructurales antes y después, y capturar los datos (con cuantificador diferido) en el medio. Se comporta mucho como DOM o análisis de árbol, pero no necesita XML limpio. – BobMcGee

1

¿Ha analizado el uso de una biblioteca de manipulación html? Ruby tiene algunos muy bonitos. por ejemplo, hpricot

Con una buena biblioteca puede especificar las partes de la página que desee mediante selectores CSS o xpath. Estos serían mucho más sólidos 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 hace cosas similares en .NET o Python, etc.

3

Usted no dice qué idioma está utilizando. En Java land puedes usar TagSoup y XPath para ayudar a minimizar el dolor. Hay un ejemplo de this blog (por supuesto, el XPath puede conseguir mucho más complicada según 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); 

lo recomiendo externalización de las expresiones XPath para que tenga un cierto grado de protección si los cambios en el sitio.

Aquí hay un ejemplo de XPath que definitivamente no estoy usando para screencrapear este sitio.De ninguna manera, no me:

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

Si usted puede usar algo como Tag Soup, que sería un punto de partida. Entonces podrías tratar la página como una API XML, un poco.

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

1

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

Como alternativa, puede ceñirse 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 API (ver YDN), creo que la API de Amazon abre una gran cantidad de datos de libros, etc. etc.

Espero que ayude un poco!

EDIT: Y si usted está usando PHP me gustaría recomendar SimpleHTMLDOM

2

No ha mencionado, que pila de tecnología que está utilizando. Si estás análisis de HTML, que haría uso de una biblioteca de análisis:

También existen servicios web que hacen exactamente lo que usted Está diciendo - comercial y gratis. Raspan sitios y ofrecen interfaces de servicios web.

Y un servicio web genérico que ofrece algunos raspados de pantalla es Yahoo Pipes. previous stackoverflow question on that

2

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

1

Try googlear para la pantalla raspado + el idioma que prefiera. Conozco varias opciones para Python, es posible encontrar el equivalente de su idioma preferido:

  • Beautiful Soup
  • mecanizar: similar a Perl WWW: mecanizar.le da un navegador como objeto a ineract con las páginas web
  • lxml: unión a libwww
  • scrapemark pitón: utiliza plantillas para raspar piezas de páginas
  • pyquery: le permite hacer consultas jQuery en documentos XML/XHTML
  • scrapy: un alto nivel de raspado y rastreo web marco para la escritura de las arañas para rastrear y analizar las páginas web

Dependiendo de la página web para raspar puede que tenga que utilizar uno o más de los enfoques anteriores.

-2

Bastante, voy a utilizar el método de sopa de etiqueta como se recomienda.

Como una pregunta complementaria: ¿cómo es posible que lo hagan esos grandes sitios tipo raspador? ¡He visto un motor de búsqueda de empleo (por ejemplo, indeed.com) que escanea miles de sitios! ¿Es eso miles de expresiones regulares? Es casi imposible ...

0

Perejil en http://www.parselets.com se ve bastante resbaladizo.

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

+2

¿Qué, los enlaces no duran 6 años? –

Cuestiones relacionadas