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.

Rubyで作るクローラー Ruby crawler

35,619 views

Published on

Published in: Technology

Rubyで作るクローラー Ruby crawler

  1. 1. 第62回 Ruby/Rails勉強会@関西 ! Rubyで作る クローラー 2014年7月26日 @dkfj 佐々木拓郎
  2. 2. 今日は東京の方(埼玉)から来ました https://flic.kr/p/jjvzc7
  3. 3. 先月まで大阪に住んでました https://flic.kr/p/iEo2Hp
  4. 4. 先月まで大阪に住んでました https://flic.kr/p/iEo2Hp
  5. 5. ✦ プロフィール ‣ Webシステムを得意とするSIerで勤務 ‣ 最近の仕事はAWS事業の推進・インフラチームのマネジメント ‣ Webスクレイピングして、データマイニングするのが趣味 ★ ソーシャル・ネットワーク ‣ blog: http://blog.takuros.net/ ‣ twitter: @dkfj ‣ Facebook: takuro.sasaki ‣ SlideShare: http://www.slideshare.net/takurosasaki/ ‣ http://www.justyo.co/TAKUROS/ @dkfj 自己紹介: 佐々木拓郎
  6. 6. 主にJAWSUG大阪で活動しています (AWS勉強会)
  7. 7. 私とRuby ✦ 正直、初中級者レベル ‣ 2006年くらいから、個人的に使いはじめる ‣ 2009~10年くらいに業務でRuby On Railsなどを導入 ‣ 以降、自分のチームではRailsを標準に               (でも、自分では余りソース書かず) ‣ AWSのAPI利用で、もっぱら利用 ‣ 2012~13年くらいにChef, Capistrano関係で再勉強
  8. 8. 宣伝!! そんな私ですが、 Rubyのクローラー本を書きました。 8月頃に発売予定です。しました。 Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例 http://amzn.to/1lsJ5id
  9. 9. クローラーって、 ご存知ですか?
  10. 10.  クローラ(Crawler)とは、ウェブ上の文書や画像などを周期 的に取得し、自動的にデータベース化するプログラムである。 「ボット(Bot)」、「スパイダー」、「ロボット」などとも呼 ばれる。  主に検索エンジンのデータベース、インデックス作成に用いら れているほか、統計調査などの目的にも利用される。近年では電 子メールアドレス収集業者などもクローラを利用して、スパムの 送信効率を上げている。 ウィキペディアより
  11. 11. と言われても、 よく解らないのでデモ ! Amazonから新刊情報を取得
  12. 12. クローラー周りの用語の説明
  13. 13. クローラー • Webを巡回するプログラムの総称 • ボット、スパイダー、ロボットなど様々な呼ばれ方がある • 巡回戦略を練るのが一番の仕事 • スクレイピングやストレージの機能を持つことが多い
  14. 14. スクレイピング • 取得したHTMLなどから、データを抜き出すこと • 例えば、HTML中のAタグのリンク先を全て取得する • 正規表現派と構文解析派が存在する
  15. 15. Rubyでクローラー作成 • Open-URI • Nokogiri • Anemone • Capybara+Selenium • cosmiccrawler • CocProxy
  16. 16. Rubyでクローラー作成 • Open-URI • Nokogiri • Anemone • Capybara+Selenium • cosmiccrawler • CocProxy 基本的なライブラリ クローラー フレームワーク 補助的なライブラリ
  17. 17. Open-URI • http/ftpに簡単にアクセスするためのライブラリ • Kernel#openを再定義 • ファイルのopenと同様に、URLを扱える require 'open-uri' open("http://www.ruby-lang.org/") {|f| f.each_line {|line| p line} }
  18. 18. • HTML/XMLの構文解析器(パーサー) • ほぼデファクトスタンダード • XPath or CSSセレクタで、HTML中の要素を選択 • UTF-8以外の文字コードを扱う場合は注意 require 'nokogiri' require 'open-uri' ! doc = Nokogiri.HTML(open("http://nokogiri.org/")) doc.css('a').each do |element| puts element[:href] end 参照:Ruby製の構文解析ツール、Nokogiriの使い方 with Xpath http://blog.takuros.net/entry/2014/04/15/070434
  19. 19. • Ruby製のクローラーフレームワーク • データ収集/解析/保存の全ての機能がある • 2年ほどメンテナンスされていない • ScrapyのあるPythonがうらやましい今日この頃 require 'anemone' ! Anemone.crawl("http://www.hatena.ne.jp/") do |anemone| anemone.on_every_page do |page| puts page.url puts page.doc.xpath("//head/title/text()").first.to_s if page.doc end end Anemone 参照:オープンソースのRubyのWebクローラー"Anemone"を使ってみる http://blog.takuros.net/entry/20110204/1296781291
  20. 20. Capybara+Selenium • 基本的には、UIテストツール • ブラウザを使うので、JavaScriptにも対応可能 • スクレイピング部分は、Nokogiriを利用 • CapybaraをラッパーしたMasqueというクローラー • ブラウザ代わりに、PhantomJSを使うのもあり 参照:JavaScriptにも対応出来るruby製のクローラー、Masqueを試してみる http://blog.takuros.net/entry/20131223/1387814711 参照:Capybara-DSLのはなし http://blog.takuros.net/entry/20140322/1395464375
  21. 21. cosmicrawler • 並列処理を得意とするクローラー • 並列処理の実装は、EventMachine • EventMachineの面倒くさい処理を隠蔽してくれる require 'cosmicrawler' ! Cosmicrawler.http_crawl(%w(http://b.hatena.ne.jp/hotentry/it http:// b.hatena.ne.jp/hotentry/life)) {|request| get = request.get response = get.response if get.response_header.status == 200 doc = Nokogiri::HTML(response) doc.xpath("//a").each do |element| 参照:複数並行可能なRubyのクローラー、「cosmicrawler」を試してみた http://blog.takuros.net/entry/20140103/1388701372 puts element[:href] end ! }
  22. 22. CocProxy • ほぼピュアRubyで実装されたプロキシサーバ • 開発用途で、クローラー作成時に便利 • 訪問済みのサイトをキャッシュしてくれる • 訪問先サイトに無駄に負荷を掛けずに試行錯誤できる 参照:開発用プロキシ、「CocProxy」が便利 http://blog.takuros.net/entry/2014/05/05/120747
  23. 23. クローラーの作成例
  24. 24. • 株価や為替の取得 • ニュース記事の取得 • ブログ記事の取得 • 書誌情報の取得 定番
  25. 25. iTunesStoreのランキング • iTunesStoreのランキングの実体はHTML+JSON • UserAgentを”iTunes”にすればスクレイピング可能 • 国ごとのコードをX-Apple-Store-Frontで指定 • カテゴリIDとランキング種別は、引数で指定 参照:iTunesのランキングを毎日自動で取得する その1 http://blog.takuros.net/entry/20120521/1337549653
  26. 26. APIの活用 • クローラーの目的は、データの収集 • APIが提供されているのであれば、そちらが効率的 • ただし、APIは制約が多いのも事実 !
  27. 27. Google Maps APIの活用 • 1IP辺り1日2,500回のリクエスト制限 • 郵便番号(12万件)を、経度緯度に変換したい • 120,000件/2,500回 ⇒ 48日 • AWSを利用して50台のサーバを使い1時間で完了 ! AWSでスポットインスタンスの活用 $0.0031×50台≒約16円
  28. 28. Twitter Streaming API • 全Tweetのうち、数%だけに絞って提供されている • それでも1日100万件近い分量 • 日本語のみ取り出すことも可能 ! 参照:Rubyのtwitterライブラリで、Twitter Streaming APIが扱えるようになっていた http://blog.takuros.net/entry/2014/05/19/002326
  29. 29. 引越にも • 6月中旬に、突然の異動の辞令 • 7月から東京勤務 • 相場観がないので、賃貸サイトをスクレイピング • 数十万件のデータから、駅ごとの㎡辺り単価の算出 ! GeoFUSEで視覚化しようとしたが 時間がなくて断念
  30. 30. ご清聴ありがとうございました 後日の質問は、@dkfjまで

×