web-dev-qa-db-ja.com

HaskellによるWebスクレイピング

HaskellでWebサイトをスクレイピングするためのライブラリーの現状はどうなっていますか?

私はHaskellで自分の簡単な単発タスクをより多く実行できるようにして、言語の使いやすさを向上できるようにしています。

Pythonでは、このために優れた PyQuery ライブラリを使用する傾向があります。 Haskellにも同様にシンプルで簡単なものはありますか?私はタグスープを調べましたが、パーサー自体は素晴らしいように見えますが、実際にページをトラバースすることは、他の言語のように素晴らしいとは思えません。

そこに良いオプションはありますか?

51
ricree

私がHaskellメーリングリストを検索したところ、TagSoupがページの解析に最も適しているようです。例: http://www.haskell.org/pipermail/haskell-cafe/2008-August/045721.html

Webスクレイピングの他の側面(クロール、スパイダー、キャッシュなど)に関しては、これらのキーワードを http://hackage.haskell.org/package/ で検索しましたが、何も見つかりませんでした有望。私は "http"を言及しているパッケージをすくい取りさえしましたが、私には何も飛び出しませんでした。

注:私は通常のHaskellerではないので、何かを逃した場合、他の人がチャイムを鳴らしてくれることを願っています。

22
David J.

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

ShpiderはHaskellのWebオートメーションライブラリです。それはあなたがクローラーを素早く書くことを可能にし、そしてページのソースを読まなくても(リンクをたどるような)単純なケースのために。

これには、ページからの相対リンクを絶対リンクに変換する、特定のドメインでのみトランザクションを承認するオプション、htmlドキュメントのみをダウンロードするオプションなどの便利な機能があります。

また、フォームに入力するための素晴らしい構文も提供します。

例:

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

(2018年に編集-shpiderは非推奨になりました、最近 https://hackage.haskell.org/package/scalpel は良い置き換えになるかもしれません)

36
sclv

私は今のところまだHaskellの初心者ですが、2012年のHTML解析はCSSセレクターを使用して実行する必要があるという強い意見があり、これまで推奨されているライブラリーはその原則を使用していないようです。

1つの可能性は、HXTの上に構築されたハンサムスープです。

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

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

このハンサムスープが依存するHXTに関するページも役立ちます(getTextまたはディープgetTextが必要になります)。

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

しかし、もう1つの選択肢はdom-selectorです。

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

現時点ではアルファ版であり、長期的なメンテナンスが問題になる可能性があります。 dom-selectorの利点は、Unicode文字をハンサムスープで動作させることができなかったことです。彼らはdom-selectorを使ってそのまま動作しました。

この質問はそれに関連しています: HaskellのHXTでTextまたはByteStringを使用することは可能ですか?

dom-selectorはhtml-conduitとxml-conduitに基づいており、メンテナンスは保証されています。

EDIT:レンズベースの解析に関する私の新しい答えに注意してください。この答えはそれ自体でまだ良いので残しましたが、今は個人的に他のアプローチを使用するつもりです。

11

CSSセレクターベースの解析を提案して、この質問に対する別の回答を既に書いていますが、その回答は1年半前であり、最近ではレンズがhaskellのより良いアプローチであると思います。実際には、タイプセーフなコンパイル済みセレクターのようなものが得られます。

その流れのいくつかのオプションについては このredditの議論 を参照してください。リンクが消えた場合は、直接リンクをコピーします。

私はまだそれらのどれも使用していませんが、今日HTMLを解析する新しいコードを作成する場合、レンズベースのアプローチを使用します。

6