LoginSignup
32

More than 5 years have passed since last update.

Anemone(Ruby)の使い方 - Rubyでクローラーを作る -

Last updated at Posted at 2016-10-21

Anemone

指定したドメインのリンク先を読み込み、URLを取得するサンプル。

anemone.rb

# -*- coding: utf-8 -*-

require 'anemone'

URL = ARGV[0]
Anemone.crawl(URL) do |anemone|
  anemone.on_every_page do |page|

      # URLを取得
      puts page.url

  end
end

実行する

$ ruby anemone.rb http://www.example.com/

注) http://www.example.com/ には任意のURLを入力してください。
  サイトによってはクローリングに時間がかかるのでご注意ください。

Anemon.crawl について

第一引数はURLを渡す。以下は第二引数以下。

引数 概要
:depth_limit 階層の制限を指定
:delay sleep機能(アクセス間隔を指定)
:user_agent UAを指定
:skip_query_strings trueにするとURLのパラメーターを無視する

depth_limit (sample)

crawl_depth.rb
# -*- coding: utf-8 -*-
require 'anemone'
URL = ARGV[0]
Anemone.crawl(URL, depth_limit: 1) do |anemone|
  anemone.on_every_page { |page| puts page.url }
end

delay (sample)

crawl_delay.rb
# -*- coding: utf-8 -*-
require 'anemone'
URL = ARGV[0]
Anemone.crawl(URL, delay: 2) do |anemone|
  anemone.on_every_page { |page| puts page.url }
end

skip_query_strings (sample)

crawl_skip_query_strings.rb
# -*- coding: utf-8 -*-
require 'anemone'
URL = ARGV[0]
Anemone.crawl(URL, skip_query_strings: true) do |anemone|
  anemone.on_every_page { |page| puts page.url }
end

Anemone::Coreで使用するメソッドについて

メソッド 概要
on_every_page 取得したすべてのページごとに処理を実行できる。
after_crawl クロール後に各ページのデータに処理を実行できる。
focus_crawl 各ページごとに巡回するリンク先を指定することができる。
on_pages_like 指定された正規表現にマッチするURLを持つページに処理を実行できる。
skip_links_like 指定された正規表現にマッチするURLを持つページは取得しない。

on_every_page (sample)

core_on_every_page.rb
# -*- coding: utf-8 -*-

require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # 出力
  anemone.on_every_page { |page| p page.url }

end

after_crawl (sample)

after_crawl.rb

focus_crawl (sample)

core_focus_crawl.rb
# -*- coding: utf-8 -*-

require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # ページから取得したリンクの最初の10個のみ取得する
  anemone.focus_crawl { |page| page.links.slice(0..9) }

  # 出力
  anemone.on_every_page { |page| p page.url }

end

on_pages_like (sample)

core_on_pages_like.rb
# -*- coding: utf-8 -*-

require 'anemone'

URL = ARGV[0]
REGEXP = /news/

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # 出力
  anemone.on_pages_like(REGEXP) { |page| p page.url }

end

skip_links_like (sample)

core_skip_links_like.rb

Anemone::Pageで使用する主なメソッドについて

メソッド 概要
url ページのURLを取得
headers header情報を取得
code HTTPのレスポンスコード(e.g. 200, 301, 404)を取得
body HTMLを取得
doc bodyをNokogiriで使用できる形式(Nokogiri::HTML::Document)で取得
links ページ内の <a> タグのリンクリストを取得(URI::HTTPで取得)

url (sample)

page_url.rb
# -*- coding: utf-8 -*-
require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # 出力
  anemone.on_every_page { |page| p page.url }

end

headers (sample)

page_headers.rb
# -*- coding: utf-8 -*-
require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # 出力
  anemone.on_every_page { |page| p page.headers }

end

code (sample)

page_code.rb
# -*- coding: utf-8 -*-
require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # 出力
  anemone.on_every_page { |page| p page.code }

end

body (sample)

page_body.rb
# -*- coding: utf-8 -*-
require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # 出力
  anemone.on_every_page { |page| p page.body }

end

doc (sample)

page_doc.rb
# -*- coding: utf-8 -*-
require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # 出力
  anemone.on_every_page { |page| p page.doc }

end

links (sample)

page_links.rb
# -*- coding: utf-8 -*-
require 'anemone'

URL = ARGV[0]

Anemone.crawl(URL, depth_limit: 0 ) do |anemone|

  # 出力
  anemone.on_every_page do |page|
    page.links.each { |link| p link.path }
  end

end

サンプル

sample02.rb
# -*- coding: utf-8 -*-
require 'anemone'
require 'nokogiri'


###########################################
# urlにnewsを含むページだけを取得して表示する。
###########################################

URL = ARGV[0]
REGEXP = /news/

site_data = []

Anemone.crawl(URL, depth_limit: 1) do |anemone|

  # 例 1
  anemone.focus_crawl do |page|
    # 条件に一致するリンクだけ残す
    page.links.keep_if { |link| link.to_s.match(REGEXP) }
  end

  anemone.on_every_page do |page|
    site_data << {
        url: page.url.to_s,
        title: page.doc.title.to_s
    }
  end


  # 例 2
  anemone.on_pages_like(REGEXP) do |page|
    page_doc = page.doc ? page.doc : nil
    site_data << {
        url: page.url.to_s,
        title: page_doc.title.to_s
    }
  end

end

p site_data

参考サイト

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32