Anemoneによる 
クローラー入門 
中野 佑 
1
About me 
中野 佑(ナカノ タスク) 
こう見えて22歳(新卒1年目) 
株式会社フィードフォース 
エンジニア 
※決して怪しい者では 
 ございません 
2
参考書 
• 「Rubyによるクローラー開発 
 技法」 
• 参考にさせていただきました 
• 入門から応用までわかりや 
すく解説が載っていました 
3
まずは… 
4
クローラーについて 
5
クローラー 
VS 
スクレイピング 
6
スクレイピングとは 
• Webページを解析してデータを抽出すること 
• HTMLを解析(parse)して、データを抽出する 
• 対象はWebページ1ページ全体 
7
クローラーとは 
• 自動的にWebページのリンクを巡回して情報を 
収集するプログラム 
• 情報を収集する際にはスクレイピングも 
行われる 
• Botなどとも呼ばれる 
例:Googleの検索エンジンなど 
8
クローラーの機能 
1. Webページ全体を見ていく 
2. スクレイピングをする 
3. 次のリンクを探して、 
そのリンク先のWebページへ遷移する 
4. 次のリンクがなくなるまで1~3を繰り返す 
9
Rubyのライブラリ 
• Webサイトの読み込み 
• open-uri 
• スクレイピング 
• nokogiri 
• Mechanize 
• クローラー 
• capybara 
10
今回ご紹介するgemは 
Anemone 
11
アネモネ 
• キンポウゲ科イチリンソウ属 
の多年草 
• 語源はギリシア語で「風」を 
意味するΆνεμος 
(anemos)から 
• 花言葉は「はかない夢」 
12
アネモネ 
• キンポウゲ科イチリンソウ属 
の多年草 
• 語源はギリシア語で「風」を 
意味するΆνεμος 
(anemos)から 
• 花言葉は「はかない夢」 
13
Anemone 
• Ruby製のクローラーgem 
• 階層をたどる、sleep機能 
など基本的な機能を網羅 
※画像は特に意味はありません 
14
Anemone 
• 基本的な使い方 
1. #crawlに、クロールしたい始点URLをセット 
2. 更にオプションも渡す 
3. ブロック引数を指定して、ページごとに処理を 
したり、巡回先を絞り込んだりする 
15
.crawlのオプション 
• 第一引数にURLを指定(複数指定は配列で) 
• :depth_limit 
• 階層の深さを指定 
• :skip_query_string 
• URLパラメータを無視するかを指定 
16
他にも 
• :proxy_host, :proxy_port 
• プロキシサーバの設定 
• :user_agent 
• ユーザエージェントを指定 
• :delay 
• アクセス間隔を指定(秒) 
17
ページに対する処理 
• .on_every_page 
• すべてのページに対して処理を行う 
• .on_pages_like 
• ページを指定して処理を行う 
• 正規表現で指定する 
18
実際にクローリング 
してみる 
19
クロール対象 
20
Webページ全てのURLを取得 
21
正規表現で絞り込む 
22
URLだけじゃなくて 
タイトルもほちぃ 
23
スクレイピング~ 
24
スクレイピングする上 
で大事なのが… 
25
HTMLの構造を 
理解すること! 
26
HTMLの構造を理解する 
• スクレイピングでクラス名やタグ、id名など 
を指定してデータを取得することが可能 
• 正規表現で取ってくることもできる 
27
正規表現なんて、 
やってられない! 
28
CSSからもっと簡単 
に! 
29
必要な情報を探したい 
• XPathを使う方法 
• CSSセレクタを使う方法 
• Nokogiri::XML::Nodeを理解する必要がある 
30
XPath 
• HTMLをXML文書として、階層構造で特定部分 
を示すための構文 
• 一番近いHTMLのルートの階層から始まる 
• 例: 
「//*[@id="content"]/article/div[1]/h1」 
31
XPathの取得方法 
32
XPathを取得した!▼ 
33
body内のid名 
34
1番目のarticleタグ 
35
article内のdivタグ 
36
目的のh1タグ 
37
Nodeについての話 
の前に… 
38
Nokogiri::HTML::parse 
について 
39
parseの挙動 
• URLを受け取って解析をしたあと、 
Nokogiri::HTML::Documentクラスの 
オブジェクトを返します 
• 以下の継承関係にあります 
• Nokogiri::HTML::Document 
• Nokogiri::XML::Document 
• Nokogiri::XML::Node 
40
余談 
• Nokogiri::parseメソッドでは受け取った値が 
HTMLか、XMLかを自動判定して、 
よしなに適したメソッドに渡す 
• しかし、誤判定もあるため、推奨されていない 
41
Nokogiri::XML::Node 
• NokogiriのXML::Documentから得られる 
検索系のメソッド 
• Nokogiri::XML::Nodeの挙動とメソッドを 
覚えることが大事 
• 要素の操作や検索時の機能を有している 
• XPathやCSSの検索機能もここに実装されて 
いる 
42
Node vs NodeSet 
• 共通のメソッドが多く、挙動が似ている 
• 違いを理解していないと、メソッドがないな 
どのエラーが出ることも 
• 検索系のメソッドはNodeと同じ名前で内部的 
にNodeを呼び出していることも多い 
• NodeSetはNodeを格納したリスト型配列 
43
細かいメソッドなどは 
本を読んでね☆ 
44
やっと本題に戻って 
解析してみる 
45
見出し一覧を 
取得したい 
46
47 
3つの記事を 
対象
見出しはh2タグ 
48
XPathを取得した!▼ 
49 
ここがほちぃ
対象を絞りこみ 
50
スクレイピング 
51
結果 
52
実際にはClassを確認 
しながら実装すると良いです 
53
最後にひとつだけ 
54
クローリングする上で 
のルール 
55
注意 
• クローラーで収集したデータをそのまま公開 
すると著作権違反になります 
• 頻繁にアクセスをしてしまうと、 
攻撃とみなされることもあります 
56
ルールブック 
57
robots.txt 
• 記述方式 
• User-agent: 拒否したいUA 
• Allow: クロールの可能なページのパス 
• Disallow: クロールされたくないページのパス 
• Crawl-delay: クロール間隔(単位はあやふや) 
• rubyには、robotexがある 
• https://github.com/chriskite/robotex 
58
robots.txt一覧 
• Amazon 
• http://www.amazon.com/robots.txt 
• はてなブログ 
• http://hatenablog.com/robots.txt 
• Wikipedia 
• http://ja.wikipedia.org/robots.txt 
59
みんなで守ろう! 
60
おまけ 
61
クローラーの効率化 
62
クローラーの高速化 
• 並列化する 
• cosmicrawlerというgemがある 
• まだ試せてないので割愛 
63
クローラーの使い道 
64
使い道 
• 天気予報サイトから天気を取得 
• ラズパイで毎朝天気を教えるものを作るとか 
• 週刊誌の発売日一覧を取得する 
• 株価の変動状況を取得する 
• 新刊情報を取得する 
65
以上です。 
66

Anemoneによるクローラー入門