HaskellでWebサイトをスクレイピングするためのライブラリーの現状はどうなっていますか?
私はHaskellで自分の簡単な単発タスクをより多く実行できるようにして、言語の使いやすさを向上できるようにしています。
Pythonでは、このために優れた PyQuery ライブラリを使用する傾向があります。 Haskellにも同様にシンプルで簡単なものはありますか?私はタグスープを調べましたが、パーサー自体は素晴らしいように見えますが、実際にページをトラバースすることは、他の言語のように素晴らしいとは思えません。
そこに良いオプションはありますか?
私がHaskellメーリングリストを検索したところ、TagSoupがページの解析に最も適しているようです。例: http://www.haskell.org/pipermail/haskell-cafe/2008-August/045721.html
Webスクレイピングの他の側面(クロール、スパイダー、キャッシュなど)に関しては、これらのキーワードを http://hackage.haskell.org/package/ で検索しましたが、何も見つかりませんでした有望。私は "http"を言及しているパッケージをすくい取りさえしましたが、私には何も飛び出しませんでした。
注:私は通常のHaskellerではないので、何かを逃した場合、他の人がチャイムを鳴らしてくれることを願っています。
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 は良い置き換えになるかもしれません)
私は今のところまだ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:レンズベースの解析に関する私の新しい答えに注意してください。この答えはそれ自体でまだ良いので残しましたが、今は個人的に他のアプローチを使用するつもりです。
CSSセレクターベースの解析を提案して、この質問に対する別の回答を既に書いていますが、その回答は1年半前であり、最近ではレンズがhaskellのより良いアプローチであると思います。実際には、タイプセーフなコンパイル済みセレクターのようなものが得られます。
その流れのいくつかのオプションについては このredditの議論 を参照してください。リンクが消えた場合は、直接リンクをコピーします。
私はまだそれらのどれも使用していませんが、今日HTMLを解析する新しいコードを作成する場合、レンズベースのアプローチを使用します。