Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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 
• No...
余談 
• Nokogiri::parseメソッドでは受け取った値が 
HTMLか、XMLかを自動判定して、 
よしなに適したメソッドに渡す 
• しかし、誤判定もあるため、推奨されていない 
41
Nokogiri::XML::Node 
• NokogiriのXML::Documentから得られる 
検索系のメソッド 
• Nokogiri::XML::Nodeの挙動とメソッドを 
覚えることが大事 
• 要素の操作や検索時の機能を有し...
Node vs NodeSet 
• 共通のメソッドが多く、挙動が似ている 
• 違いを理解していないと、メソッドがないな 
どのエラーが出ることも 
• 検索系のメソッドはNodeと同じ名前で内部的 
にNodeを呼び出していることも多い 
...
細かいメソッドなどは 
本を読んでね☆ 
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: クロール間隔(単位...
robots.txt一覧 
• Amazon 
• http://www.amazon.com/robots.txt 
• はてなブログ 
• http://hatenablog.com/robots.txt 
• Wikipedia 
• h...
みんなで守ろう! 
60
おまけ 
61
クローラーの効率化 
62
クローラーの高速化 
• 並列化する 
• cosmicrawlerというgemがある 
• まだ試せてないので割愛 
63
クローラーの使い道 
64
使い道 
• 天気予報サイトから天気を取得 
• ラズパイで毎朝天気を教えるものを作るとか 
• 週刊誌の発売日一覧を取得する 
• 株価の変動状況を取得する 
• 新刊情報を取得する 
65
以上です。 
66
Upcoming SlideShare
Loading in …5
×

Anemoneによるクローラー入門

Anemone is ruby gem for crawler.
How to use Anemone.

  • Be the first to comment

Anemoneによるクローラー入門

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

×