Grattage De La Toile Avec Haskell

Quel est l'état actuel des bibliothèques pour gratter des sites web avec Haskell?

j'essaie de faire plus de mes tâches rapides et ponctuelles à Haskell, afin d'augmenter mon niveau de confort avec la langue.

en Python, j'ai tendance à utiliser l'excellente bibliothèque PyQuery pour cela. Y a-t-il quelque chose de tout aussi simple et facile à Haskell? J'ai regardé dans la soupe D'étiquette, et tandis que l'analyseur lui-même semble agréable, traverser des pages ne semble pas aussi agréable que dans d'autres langues.

Est-il une meilleure option?

49
demandé sur Robert 2011-01-29 20:02:48

4 réponses

D'après ma recherche sur les listes de diffusion Haskell, il semble que TagSoup soit le choix dominant pour l'analyse des pages. Exemple: http://www.haskell.org/pipermail/haskell-cafe/2008-August/045721.html

en ce qui concerne les autres aspects du raclage de toile (tels que ramper, Spider, et cacher), j'ai cherché http://hackage.haskell.org/package / for those keywords but didn't find anything promising. J'ai même écrémé grâce à des paquets mentionnant "http" mais rien ne m'a sauté aux yeux.

Note: Je ne suis pas un Haskeller régulier, donc j'espère que d'autres pourront intervenir si je manque quelque chose.

22
répondu David J. 2011-01-29 17:18:18

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

Shpider est une bibliothèque d'automatisation web pour Haskell. Il vous permet de rapidement écrire les chenilles, et pour les cas simples ( comme les liens suivants ), même sans la lecture de la source de la page.

il a des caractéristiques utiles telles que la rotation liens relatifs d'une page vers liens absolus, options pour autoriser transactions uniquement sur un domaine donné, et l'option de téléchargement html document.

Il fournit également une belle syntaxe pour le remplissage de formulaires.

un exemple:

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

(Édition en 2018 -- shpider est obsolète, ces jours-ci https://hackage.haskell.org/package/scalpel pourrait être un bon remplaçant)

35
répondu sclv 2018-09-13 00:15:35

bien que je sois encore pour l'instant un débutant à Haskell, j'ai la ferme opinion que L'analyse HTML en 2012 doit être faite en utilisant des sélecteurs CSS, et il semble que les bibliothèques recommandées jusqu'à présent n'utilisent pas ce principe.

une possibilité est HandsomeSoup, qui est construit sur le dessus de HXT:

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

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

cette page sur HXT, sur laquelle repose HandsomeSoup, sera également utile (vous aurez besoin de getText ou de deep getText):

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

mais un autre choix est dom-selector:

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

c'est en ce moment alpha et son entretien à long terme pourrait être un problème. L'avantage de dom-selector est que je ne pouvais pas faire fonctionner les caractères unicode avec HandsomeSoup. Ils ont travaillé avec dom-selector.

cette question est liée à: est-il possible d'utiliser du texte ou ByteString sur HXT à Haskell?

dom-sélecteur est basé sur html-conduit et xml-conduit, pour lequel la maintenance semble assurée.

EDIT: note mon nouvelle réponse sur l'objectif de l'analyse. J'ai laissé cette réponse car elle est encore bonne en elle-même, mais je préfère maintenant personnellement utiliser l'autre approche.

11
répondu Emmanuel Touzery 2017-05-23 12:16:57

j'ai déjà écrit une autre réponse à cette question, suggérant l'analyse basée sur les sélecteurs CSS, mais cette réponse est maintenant d'un an et demi, et de nos jours je pense que les lentilles pourraient être une meilleure approche à haskell. En effet, vous obtenez quelque chose comme type-safe compilé des sélecteurs.

Voir cette discussion reddit pour un couple d'options dans cette veine. Si le lien disparaît, je copie les liens directs:

Je n'ai encore utilisé aucun de ceux-là, mais si je devais écrire un nouveau code parsing HTML aujourd'hui, je serais certainement aller avec une approche basée sur l'objectif.

6
répondu Emmanuel Touzery 2014-07-12 20:53:26