SlideShare ist ein Scribd-Unternehmen logo
1 von 66
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

MySQLユーザ視点での小さく始めるElasticsearch
MySQLユーザ視点での小さく始めるElasticsearchMySQLユーザ視点での小さく始めるElasticsearch
MySQLユーザ視点での小さく始めるElasticsearchKentaro Yoshida
 
Elasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバElasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバShinsuke Sugaya
 
MongoDB World 2014に行ってきた!
MongoDB World 2014に行ってきた!MongoDB World 2014に行ってきた!
MongoDB World 2014に行ってきた!Tetsutaro Watanabe
 
JavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなことJavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなことMayu Kimura
 
Python と Xpath で ウェブからデータをあつめる
Python と Xpath で ウェブからデータをあつめるPython と Xpath で ウェブからデータをあつめる
Python と Xpath で ウェブからデータをあつめるShuhei Iitsuka
 
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)Ryuji Tamagawa
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介Tetsutaro Watanabe
 
[大図解]ピグライフはこう動いている
[大図解]ピグライフはこう動いている[大図解]ピグライフはこう動いている
[大図解]ピグライフはこう動いているAkihiro Kuwano
 
いまいまMySQL@OSC2016長岡
いまいまMySQL@OSC2016長岡いまいまMySQL@OSC2016長岡
いまいまMySQL@OSC2016長岡sakaik
 
Node.jsで始める Modern JavaScript Framework
Node.jsで始める Modern JavaScript FrameworkNode.jsで始める Modern JavaScript Framework
Node.jsで始める Modern JavaScript Frameworkkamiyam .
 
TypeScriptへの入口
TypeScriptへの入口TypeScriptへの入口
TypeScriptへの入口Sunao Tomita
 
いまいまMySQL@OSC2016島根
いまいまMySQL@OSC2016島根いまいまMySQL@OSC2016島根
いまいまMySQL@OSC2016島根sakaik
 
Node.js で Web アプリ開発
Node.js で Web アプリ開発Node.js で Web アプリ開発
Node.js で Web アプリ開発Tatsumi Naganuma
 
今日はMongoDBの話はしない
今日はMongoDBの話はしない今日はMongoDBの話はしない
今日はMongoDBの話はしないAkihiro Kuwano
 
Node.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないときNode.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないときRyunosuke SATO
 
Node.jsでサーバプログラマ デビューしよう
Node.jsでサーバプログラマ デビューしようNode.jsでサーバプログラマ デビューしよう
Node.jsでサーバプログラマ デビューしようYuusuke Takeuchi
 

Was ist angesagt? (20)

MySQLユーザ視点での小さく始めるElasticsearch
MySQLユーザ視点での小さく始めるElasticsearchMySQLユーザ視点での小さく始めるElasticsearch
MySQLユーザ視点での小さく始めるElasticsearch
 
Elasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバElasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバ
 
MongoDB World 2014に行ってきた!
MongoDB World 2014に行ってきた!MongoDB World 2014に行ってきた!
MongoDB World 2014に行ってきた!
 
JavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなことJavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなこと
 
Python と Xpath で ウェブからデータをあつめる
Python と Xpath で ウェブからデータをあつめるPython と Xpath で ウェブからデータをあつめる
Python と Xpath で ウェブからデータをあつめる
 
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
RDB経験者に送るMongoDBの勘所(db tech showcase tokyo 2013)
 
初めてのMongo db
初めてのMongo db初めてのMongo db
初めてのMongo db
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
 
20150523
 20150523 20150523
20150523
 
Node js 入門
Node js 入門Node js 入門
Node js 入門
 
[大図解]ピグライフはこう動いている
[大図解]ピグライフはこう動いている[大図解]ピグライフはこう動いている
[大図解]ピグライフはこう動いている
 
いまいまMySQL@OSC2016長岡
いまいまMySQL@OSC2016長岡いまいまMySQL@OSC2016長岡
いまいまMySQL@OSC2016長岡
 
Node.jsで始める Modern JavaScript Framework
Node.jsで始める Modern JavaScript FrameworkNode.jsで始める Modern JavaScript Framework
Node.jsで始める Modern JavaScript Framework
 
TypeScriptへの入口
TypeScriptへの入口TypeScriptへの入口
TypeScriptへの入口
 
いまいまMySQL@OSC2016島根
いまいまMySQL@OSC2016島根いまいまMySQL@OSC2016島根
いまいまMySQL@OSC2016島根
 
Node.js で Web アプリ開発
Node.js で Web アプリ開発Node.js で Web アプリ開発
Node.js で Web アプリ開発
 
今日はMongoDBの話はしない
今日はMongoDBの話はしない今日はMongoDBの話はしない
今日はMongoDBの話はしない
 
Hello, Node.js
Hello, Node.jsHello, Node.js
Hello, Node.js
 
Node.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないときNode.js を選ぶとき 選ばないとき
Node.js を選ぶとき 選ばないとき
 
Node.jsでサーバプログラマ デビューしよう
Node.jsでサーバプログラマ デビューしようNode.jsでサーバプログラマ デビューしよう
Node.jsでサーバプログラマ デビューしよう
 

Ähnlich wie Anemoneによるクローラー入門

SQLアンチパターン メンター用資料
SQLアンチパターン メンター用資料SQLアンチパターン メンター用資料
SQLアンチパターン メンター用資料Hironori Miura
 
Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011 Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011 Hiro Yoshioka
 
20140903groonga発表資料
20140903groonga発表資料20140903groonga発表資料
20140903groonga発表資料Hironobu Saitoh
 
Programming camp code reading
Programming camp code readingProgramming camp code reading
Programming camp code readingHiro Yoshioka
 
WordPress中級者への道!テンプレートタグはどう動くのか!?
WordPress中級者への道!テンプレートタグはどう動くのか!?WordPress中級者への道!テンプレートタグはどう動くのか!?
WordPress中級者への道!テンプレートタグはどう動くのか!?Shinichi Nishikawa
 
PythonによるWebスクレイピング入門
PythonによるWebスクレイピング入門PythonによるWebスクレイピング入門
PythonによるWebスクレイピング入門Hironori Sekine
 
Search on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 SpringSearch on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 SpringEiji Shinohara
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, CodereadingHiro Yoshioka
 
協調フィルタリング with Mahout
協調フィルタリング with Mahout協調フィルタリング with Mahout
協調フィルタリング with MahoutKatsuhiro Takata
 
Word Press on Movable Type
Word Press on Movable TypeWord Press on Movable Type
Word Press on Movable TypeHajime Fujimoto
 
新しいCspojの紹介
新しいCspojの紹介新しいCspojの紹介
新しいCspojの紹介Shoichi Yasui
 
Lab-ゼミ資料-5-20150512
Lab-ゼミ資料-5-20150512Lab-ゼミ資料-5-20150512
Lab-ゼミ資料-5-20150512Yuki Ogasawara
 
今からはじめる! Linuxコマンド入門
今からはじめる! Linuxコマンド入門今からはじめる! Linuxコマンド入門
今からはじめる! Linuxコマンド入門VirtualTech Japan Inc.
 
Heliumエンジンの設計と実装
Heliumエンジンの設計と実装Heliumエンジンの設計と実装
Heliumエンジンの設計と実装DADA246
 
Web本文抽出 using crf
Web本文抽出 using crfWeb本文抽出 using crf
Web本文抽出 using crfShuyo Nakatani
 
HTML5での制作、いつから始める?
HTML5での制作、いつから始める?HTML5での制作、いつから始める?
HTML5での制作、いつから始める?Fuminori Mori
 
Excel 方眼紙撲滅委員会 活動報告 2012.11 #odstudy
Excel 方眼紙撲滅委員会 活動報告 2012.11 #odstudyExcel 方眼紙撲滅委員会 活動報告 2012.11 #odstudy
Excel 方眼紙撲滅委員会 活動報告 2012.11 #odstudyTakeshi Komiya
 
Elastic circle ci-co-webinar-20210127
Elastic circle ci-co-webinar-20210127Elastic circle ci-co-webinar-20210127
Elastic circle ci-co-webinar-20210127Shotaro Suzuki
 

Ähnlich wie Anemoneによるクローラー入門 (20)

JavaScript 研修
JavaScript 研修JavaScript 研修
JavaScript 研修
 
SQLアンチパターン メンター用資料
SQLアンチパターン メンター用資料SQLアンチパターン メンター用資料
SQLアンチパターン メンター用資料
 
Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011 Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011
 
20140903groonga発表資料
20140903groonga発表資料20140903groonga発表資料
20140903groonga発表資料
 
Programming camp code reading
Programming camp code readingProgramming camp code reading
Programming camp code reading
 
WordPress中級者への道!テンプレートタグはどう動くのか!?
WordPress中級者への道!テンプレートタグはどう動くのか!?WordPress中級者への道!テンプレートタグはどう動くのか!?
WordPress中級者への道!テンプレートタグはどう動くのか!?
 
PythonによるWebスクレイピング入門
PythonによるWebスクレイピング入門PythonによるWebスクレイピング入門
PythonによるWebスクレイピング入門
 
Search on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 SpringSearch on AWS - IVS CTO Night and Day 2016 Spring
Search on AWS - IVS CTO Night and Day 2016 Spring
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
協調フィルタリング with Mahout
協調フィルタリング with Mahout協調フィルタリング with Mahout
協調フィルタリング with Mahout
 
Word Press on Movable Type
Word Press on Movable TypeWord Press on Movable Type
Word Press on Movable Type
 
新しいCspojの紹介
新しいCspojの紹介新しいCspojの紹介
新しいCspojの紹介
 
Lab-ゼミ資料-5-20150512
Lab-ゼミ資料-5-20150512Lab-ゼミ資料-5-20150512
Lab-ゼミ資料-5-20150512
 
今からはじめる! Linuxコマンド入門
今からはじめる! Linuxコマンド入門今からはじめる! Linuxコマンド入門
今からはじめる! Linuxコマンド入門
 
Heliumエンジンの設計と実装
Heliumエンジンの設計と実装Heliumエンジンの設計と実装
Heliumエンジンの設計と実装
 
Ssaw08 1028
Ssaw08 1028Ssaw08 1028
Ssaw08 1028
 
Web本文抽出 using crf
Web本文抽出 using crfWeb本文抽出 using crf
Web本文抽出 using crf
 
HTML5での制作、いつから始める?
HTML5での制作、いつから始める?HTML5での制作、いつから始める?
HTML5での制作、いつから始める?
 
Excel 方眼紙撲滅委員会 活動報告 2012.11 #odstudy
Excel 方眼紙撲滅委員会 活動報告 2012.11 #odstudyExcel 方眼紙撲滅委員会 活動報告 2012.11 #odstudy
Excel 方眼紙撲滅委員会 活動報告 2012.11 #odstudy
 
Elastic circle ci-co-webinar-20210127
Elastic circle ci-co-webinar-20210127Elastic circle ci-co-webinar-20210127
Elastic circle ci-co-webinar-20210127
 

Anemoneによるクローラー入門