2016年7月6日水曜日

簡単なWEBスクレイピングをElixirで試す

ページを取得して、タグの内容を表示するシンプルなWebスクレイパーをElixirで実装してみます。

まずはシンプルにージを取得して表示するだけのものを作ります。
defmodule WebScripe do
  def main([]) do
    url = "http://www.pythonscraping.com/pages/page1.html"
    response = HTTPoison.get(url)
    IO.puts "#{inspects response}" 
  end
end

次に、例外処理を追加します。 Elixirは例外処理としてtry-rescueなどを持ちますが、パターンマッチを使うことにします。 そのため、HTTPoison.getを使います。(get!は例外を出すため今回は使用しません)

ok/errorを返してくれるので、そのままマッチさせます。ただ、HTTPステータスエラーについてはokが返ってくるためガードを使って2xx系のみbodyを取って表示するようにします。

それ以外の場合は、ステータスコードを表示するだけにしました。

case response do
  {:ok, %HTTPoison.Response{status_code: cd, body: body}} when (div cd, 100) == 2 ->
     IO.puts body
  {:ok, %HTTPoison.Response{status_code: cd}} ->
     IO.puts "HTTP Status Code: #{cd}"
  {:error, %HTTPoison.Error{reason: reason}} ->
     IO.puts "Error: #{inspect reason}"
end

HTMLパーサを追加して、h1タグを取得してみます。

Flokiのfindは、[{tag, attr, content}]を返すので、Listのheadを取って、elemでtupleから内容を取得して表示させました。

obj = Floki.find(body, "h1")
IO.puts "#{elem hd(obj), 2}"

まとめたコード

defmodule WebScripe do
  def main([]) do
    url = "http://www.pythonscraping.com/pages/page1.html"
    response = HTTPoison.get(url)
    case response do
      {:ok, %HTTPoison.Response{status_code: cd, body: body}} when (div cd, 100) == 2 ->
         obj = Floki.find(body, "h1")
         IO.puts "#{elem hd(obj), 2}"
      {:ok, %HTTPoison.Response{status_code: cd}} ->
         IO.puts "HTTP Status Code: #{cd}"
      {:error, %HTTPoison.Error{reason: reason}} ->
         IO.puts "Error: #{inspect reason}"
    end
  end
end

0 件のコメント:

コメントを投稿