52 Stimmen

Web Scraping mit Haskell

Was ist der aktuelle Stand der Bibliotheken für das Scraping von Websites mit Haskell?

Ich versuche, mehr meiner schnellen, einmaligen Aufgaben in Haskell zu erledigen, um meinen Komfort mit der Sprache zu erhöhen.

In Python neige ich dazu, die ausgezeichnete PyQuery Bibliothek für diese. Gibt es etwas ähnlich Einfaches und Leichtes in Haskell? Ich habe mir Tag Soup angeschaut, und während der Parser selbst nett zu sein scheint, scheint das Durchlaufen von Seiten nicht so nett zu sein wie in anderen Sprachen.

Gibt es eine bessere Alternative?

1 Stimmen

Was fehlt Ihrer Meinung nach bei TagSoup?

1 Stimmen

Die Funktionen zum Durchsuchen des geparsten Dokuments scheinen begrenzter zu sein als bei Bibliotheken in anderen Sprachen. Die Funktionen für allgemeine Zwecke, wie z.B. Abschnitte, scheinen nicht so schlecht zu sein, aber es sind immer noch mehrere Zeilen Code für einige wirklich häufige Anwendungen erforderlich. Zum Beispiel erfordert die Auswahl eines Elements nach Klasse mindestens ein paar Zeilen Code, um das zu tun, was ein einziger Aufruf in Jquery wäre. Das wäre nicht schlecht für ein einzelnes Projekt, aber mein typischer Anwendungsfall ist ein kleines einmaliges Projekt. Also pflege ich entweder einige Helfer, oder wiederhole mich ein Haufen. Übersehe ich etwas?

36voto

sclv Punkte 38177

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

Shpider ist eine Bibliothek zur Webautomatisierung für Haskell. Sie erlaubt es Ihnen, schnell Crawler zu schreiben, und für einfache Fälle ( wie das Verfolgen von Links) sogar ohne den Quelltext der Seite zu lesen.

Sie verfügt über nützliche Funktionen wie das Drehen relative Links von einer Seite in absolute Links, Optionen zur Autorisierung von Transaktionen nur auf einer bestimmten Domain zu autorisieren, und die Option, nur html herunterzuladen Dokumente herunterzuladen.

Es bietet auch eine schöne Syntax für Ausfüllen von Formularen.

Ein Beispiel:

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

(Edit in 2018 -- shpider ist heutzutage veraltet. https://hackage.haskell.org/package/scalpel könnte ein guter Ersatz sein)

1 Stimmen

Interessant. Es sieht so aus, als könnte shpider auch für Web-Tests verwendet werden.

0 Stimmen

Michael, haben Sie es zum Testen verwendet?

0 Stimmen

Ich habe ein Problem bei der Installation von shpider auf ghc 7.6.2

23voto

David J. Punkte 29769

Nach meinen Recherchen auf den Haskell-Mailinglisten scheint es, dass TagSoup die vorherrschende Wahl für das Parsen von Seiten ist. Zum Beispiel: http://www.haskell.org/pipermail/haskell-cafe/2008-August/045721.html

Was die anderen Aspekte des Web Scraping (wie Crawling, Spidering und Caching) betrifft, so habe ich folgende Informationen gesucht http://hackage.haskell.org/package/ nach diesen Stichwörtern gesucht, aber nichts Vielversprechendes gefunden. Ich habe sogar Pakete überflogen, in denen "http" erwähnt wird, aber mir ist nichts aufgefallen.

Anmerkung: Ich bin kein regelmäßiger Haskeller, daher hoffe ich, dass andere sich melden können, wenn ich etwas übersehen habe.

0 Stimmen

Die Haskell XML Toolbox (HXT) könnte einen Blick wert sein: de.wikibooks.org/wiki/Haskell/XML

8 Stimmen

Ich kann für TagSoup bürgen: Ich habe es ausschließlich für ein Projekt verwendet, das ausschließlich auf HTML-Scraping basierte. Was die HTTP-Client-Pakete angeht, so schrieb ich http-enumerator Und zwar deshalb, weil ich keine guten Alternativen gesehen habe.

3 Stimmen

Es gibt ein Skalpell, das auf TagSoup aufbaut github.com/fimad/scalpel

11voto

Emmanuel Touzery Punkte 8370

Obwohl ich noch ein Anfänger in Haskell bin, bin ich der festen Überzeugung, dass HTML-Parsing im Jahr 2012 mit CSS-Selektoren durchgeführt werden muss, und es scheint, dass die bisher empfohlenen Bibliotheken dieses Prinzip nicht verwenden.

Eine Möglichkeit ist HandsomeSoup, das auf HXT aufbaut:

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

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

Diese Seite über HXT, auf der HandsomeSoup basiert, wird ebenfalls hilfreich sein (Sie benötigen getText oder deep getText):

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

Eine andere Möglichkeit ist der Dom-Selektor:

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

Sie ist derzeit Alpha und ihre langfristige Instandhaltung könnte ein Problem darstellen. Der Vorteil von dom-selector ist, dass ich Unicode-Zeichen nicht mit HandsomeSoup zum Laufen bringen konnte. Mit dom-selector funktionierten sie von Anfang an.

Diese Frage hängt damit zusammen: Ist es möglich, Text oder ByteString auf HXT in Haskell zu verwenden?

dom-selector basiert auf html-conduit und xml-conduit, für die die Wartung gesichert scheint.

EDIT: Beachten Sie meine neuere Antwort zum linsenbasierten Parsing. Ich habe diese Antwort gelassen, da sie für sich genommen immer noch gut ist, aber ich persönlich würde jetzt lieber den anderen Ansatz verwenden.

1 Stimmen

HandsomeSoup ist eine wirklich nette Bibliothek. Vielen Dank, dass Sie das geteilt haben, sonst hätte ich nicht gewusst, wo ich suchen muss!

6voto

Emmanuel Touzery Punkte 8370

Ich habe bereits eine andere Antwort auf diese Frage geschrieben, in der ich CSS-Selektoren-basiertes Parsing vorschlug, aber diese Antwort ist jetzt anderthalb Jahre alt, und heutzutage denke ich, dass Linsen ein besserer Ansatz in Haskell sein könnten. Im Endeffekt erhält man so etwas wie typsicher kompilierte Selektoren.

Ver diese reddit-Diskussion für eine Reihe von Optionen in dieser Richtung. Für den Fall, dass der Link verschwindet, kopiere ich die direkten Links:

Ich habe noch keine davon verwendet, aber wenn ich heute neuen Code zum Parsen von HTML schreiben würde, würde ich auf jeden Fall einen linsenbasierten Ansatz wählen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X