HaskellでスクレイピングとWebサーバーを開発する手順を書いていきます。
# Haskellの開発環境構築
$ brew install stack
$ stack setup
# プロジェクトの作成
$ stack new scraping-server
$ cd scraping-server
package.yaml
ファイルの dependencies:
の部分を以下のように記述します。
dependencies:
- base >= 4.7 && < 5
- warp
- wai
- http-types
- xml-conduit
- html-conduit
- http-conduit
- aeson
- text
インストールしている外部パッケージは以下のものです。
まず、app/Main.hs
を以下の内容に変更します。
{-# LANGUAGE OverloadedStrings #-}
module Main where
import qualified Network.Wai.Handler.Warp as Warp
import qualified Network.Wai as Wai
import qualified Network.HTTP.Types as HTypes
app :: Wai.Application
app _ send = do
send $ Wai.responseBuilder HTypes.status200 [] "test"
main :: IO ()
main = do
Warp.run 3000 app
その後、以下コマンドを実行して http://localhost:3000 にブラウザでアクセスすると、”test” の文字が表示されます。
$ stack run
これで、Webサーバーの起動ができました。
スクレイピングで取得した情報を表示する
app/Main.hs
に以下の実装を追加します。
{-# LANGUAGE OverloadedStrings #-}
module Main where
import qualified Network.Wai.Handler.Warp as Warp
import qualified Network.Wai as Wai
import qualified Network.HTTP.Types as HTypes
-- パッケージの追加
import Text.XML.Cursor
import Text.HTML.DOM as H
import Network.HTTP.Conduit
import Data.Aeson (encode)
import qualified Data.Text as T
import Data.Text.Lazy.Encoding
-- 関数を追加
getItems :: Cursor ->
getItems cursor = do
cursor
$// attributeIs "class" "div-col"
&// element "li"
&// element "a"
&// content
app :: Wai.Application
app _ send = do
-- スクレイピング用の処理を追加
doc <- parseLBS <$> simpleHttp "https://en.wikipedia.org/wiki/List_of_programming_languages"
let cursor = fromDocument doc
let items = getItems cursor
let itemsJson = encode items
let decodedItems = decodeUtf8 itemsJson
send $ Wai.responseBuilder HTypes.status200 [] (encodeUtf8Builder decodedItems)
main :: IO ()
main = do
Warp.run 3000 app
追加実装の後、 $ stack run を再実行して http://localhost:3000 にアクセスすると、 Wikipediaのページから取得したプログラミング言語一覧の文字が表示されるようになります。
HaskellのAPIや機能を調べるとき、登場する記号が多いので、Google検索では調べにくいです。
そのため、HoogleというHaskellのAPIを検索するための専用サイトを利用することがおすすめです。