2011-01-29 15 views
48

¿Cuál es el estado actual de las bibliotecas para rastrear sitios web con Haskell?Web Scraping con Haskell

Estoy intentando hacer más tareas rápidas y únicas en Haskell, para ayudar a aumentar mi nivel de comodidad con el idioma.

En Python, tiendo a utilizar la excelente biblioteca PyQuery para esto. ¿Hay algo similarmente simple y fácil en Haskell? He examinado Tag Soup, y aunque el analizador en sí mismo parece agradable, en realidad las páginas que atraviesan no parecen tan agradables como en otros idiomas.

¿Existe una mejor opción?

+1

¿Qué le parece que falta en TagSoup? –

+1

Las funciones para buscar el documento analizado parecen ser más limitadas que las bibliotecas en otros idiomas. Las funciones de propósito general, como las secciones, no parecen tan malas, pero aún requieren varias líneas de código para algunos usos realmente comunes. Por ejemplo, seleccionar un elemento por clase requiere al menos un par de líneas de código para hacer lo que sería una sola llamada en jquery. Eso no sería malo para un solo proyecto, pero mi caso de uso típico para esto es un pequeño proyecto único. Así que o bien mantengo algunos ayudantes, o me repito un montón. ¿Me estoy perdiendo de algo? – ricree

Respuesta

22

Desde mi búsqueda en las listas de correo de Haskell, parece que TagSoup es la elección dominante para analizar páginas. Por ejemplo: http://www.haskell.org/pipermail/haskell-cafe/2008-August/045721.html

En cuanto a los demás aspectos de la web raspado (tales como gatear, spidering y almacenamiento en caché), he buscado http://hackage.haskell.org/package/ para esas palabras clave, pero no encontraron nada prometedor. Incluso hojeé paquetes que mencionaban "http" pero nada saltó sobre mí.

Nota: No soy un Haskeller regular, por lo que espero que otros puedan responder si me pierdo algo.

+0

Puede valer la pena consultar Haskell XML Toolbox (HXT): http://en.wikibooks.org/wiki/Haskell/XML –

+7

Puedo responder por TagSoup: Lo utilicé exclusivamente para un proyecto que estaba basado completamente en raspado de HTML . En cuanto a los paquetes de cliente HTTP, escribí [http-enumerator] (http://hackage.haskell.org/package/http-enumerator) específicamente porque no vi ninguna buena alternativa. –

+2

Hay bisturí que se basa en TagSoup https: // github.com/fimad/scalpel – guido

34

http://hackage.haskell.org/package/shpider

Shpider es una biblioteca de automatización web de Haskell. Le permite rastrear rápidamente rastreadores, y para casos simples ( como los siguientes enlaces) incluso sin leyendo el origen de la página.

Tiene características útiles, tales como convertir enlaces relativos a una página en enlaces absolutos, las opciones para autorizar transacciones sólo en un dominio dado, y la opción de descarga única html documentos.

También proporciona una buena sintaxis para rellenando formularios.

Un ejemplo:

runShpider $ do 
     download "http://apage.com" 
     theForm : _ <- getFormsByAction "http://anotherpage.com" 
     sendForm $ fillOutForm theForm $ pairs $ do 
      "occupation" =: "unemployed Haskell programmer" 
      "location" =: "mother's house" 
+0

Interesante. Parece que shpider podría tener usos para pruebas web también. –

+0

Michael, ¿lo usaste para probar? – Qrilka

+0

Tengo un problema al instalar shpider en ghc 7.6.2 – Anton

11

Aunque todavía estoy por ahora un principiante en Haskell, que tienen la firme opinión de que análisis de HTML en 2012 debe hacerse usando selectores CSS, y parece que las bibliotecas recomendado hasta el momento, no use ese principio.

Una posibilidad es HandsomeSoup, que se construye en la parte superior de HXT:

http://egonschiele.github.com/HandsomeSoup/

http://codingtales.com/2012/04/25/scraping-html-with-handsomesoup-in-haskell

esta página HXT, sobre el que se basa HandsomeSoup, también será útil (vas a necesitar getText o getText de profundidad):

http://adit.io/posts/2012-04-14-working_with_HTML_in_haskell.html

Sin embargo, otra opción es dom-selector:

http://hackage.haskell.org/package/dom-selector

Es en este momento alfa y su mantenimiento a largo plazo podría ser un problema. La ventaja de dom-selector es que no pude obtener caracteres Unicode para trabajar con HandsomeSoup. Trabajaron de la caja con dom-selector.

Esta pregunta se relaciona con lo siguiente: Is it possible to use Text or ByteString on HXT in Haskell?

dom-selector se basa en HTML y XML-conducto-conducto, para lo cual el mantenimiento parece asegurada.

EDIT: tenga en cuenta mi nueva respuesta sobre el análisis basado en objetivos. Dejé esta respuesta ya que todavía está bien por sí misma, pero ahora personalmente preferiría usar el otro enfoque.

+1

HandsomeSoup es una biblioteca realmente ordenada. ¡Gracias por compartir esto o no hubiera sabido dónde mirar! – thegravian

6

Ya escribí otra respuesta a esta pregunta, sugiriendo el análisis basado en selectores de CSS, sin embargo esa respuesta tiene ahora año y medio, y hoy en día creo que las lentes podrían ser un mejor enfoque en haskell. En efecto, obtienes algo así como selectores compilados de tipo seguro.

Ver this reddit discussion para un par de opciones en ese sentido. En caso de que el enlace desaparece, copio los enlaces directos:

he utilizado ninguno de los que aún no, pero si escribiera un código nuevo para analizar HTML hoy, definitivamente elegiría un enfoque basado en lentes.