💻️
スクレイピングとサーバー実行のサンプルコード(Haskell)

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

インストールしている外部パッケージは以下のものです。

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

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を検索するための専用サイトを利用することがおすすめです。