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
参考サイト