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で始めるWebスクレイピング

31,351 views

Published on

Rubyで始めるWebスクレイピング
第1回Webスクレイピング勉強会@東京 発表資料

Published in: Technology
  • Be the first to comment

Rubyで始めるWebスクレイピング

  1. 1. 第1回Webスクレイピング勉強会@東京 ! Rubyで始める Webスクレイピング 2014年6月22日 @dkfj 佐々木拓郎
  2. 2. 今日は大阪から来ました
  3. 3. 今日は大阪から来ました
  4. 4. ✦ プロフィール ‣ Webシステムを得意とするSIerで勤務 ‣ 最近の仕事はAWS事業の推進・インフラチームのマネジメント ‣ Webスクレイピングして、データマイニングするのが趣味 ★ ソーシャル・ネットワーク ‣ blog: http://blog.takuros.net/ ‣ twitter: @dkfj ‣ Facebook: takuro.sasaki ‣ SlideShare: http://www.slideshare.net/takurosasaki/ @dkfj 自己紹介: 佐々木拓郎
  5. 5. 宣伝!! Rubyのクローラー本を書いています。 8月頃に発売予定です。しました。 Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例 http://amzn.to/1lsJ5id
  6. 6. Rubyで Webスクレイピングするには?
  7. 7. RubyでWebスクレイピング • Open-URI • Nokogiri • Anemone • Capybara+Selenium • cosmiccrawler • CocProxy
  8. 8. RubyでWebスクレイピング • Open-URI • Nokogiri • Anemone • Capybara+Selenium • cosmiccrawler • CocProxy 基本的なライブラリ クローラー フレームワーク 補助的なライブラリ
  9. 9. Open-URI • http/ftpに簡単にアクセスするためのライブラリ • Kernel#openを再定義 • ファイルのopenと同様に、URLを扱える require 'open-uri' open("http://www.ruby-lang.org/") {|f| f.each_line {|line| p line} }
  10. 10. • 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
  11. 11. • 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
  12. 12. 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
  13. 13. 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 puts get.response if get.response_header.status == 200 } 参照:複数並行可能なRubyのクローラー、「cosmicrawler」を試してみた http://blog.takuros.net/entry/20140103/1388701372
  14. 14. CocProxy • ほぼピュアRubyで実装されたプロキシサーバ • 開発用途で、クローラー作成時に便利 • 訪問済みのサイトをキャッシュしてくれる • 訪問先サイトに無駄に負荷を掛けずに試行錯誤できる 参照:開発用プロキシ、「CocProxy」が便利 http://blog.takuros.net/entry/2014/05/05/120747
  15. 15. スクレイピングの例
  16. 16. iTunesStoreのランキング • iTunesStoreのランキングの実体はHTML+JSON • UserAgentを”iTunes”にすればスクレイピング可能 • 国ごとのコードをX-Apple-Store-Frontで指定 • カテゴリIDとランキング種別は、引数で指定 参照:iTunesのランキングを毎日自動で取得する その1 http://blog.takuros.net/entry/20120521/1337549653
  17. 17. APIの活用 • Webスクレイピングの目的は、データの収集 • APIが提供されているのであれば、そちらが効率的 • ただし、APIは制約が多い !
  18. 18. Google Maps APIの活用 • 1IP辺り1日2,500回のリクエスト制限 • 郵便番号(12万件)を、経度緯度に変換したい • 120,000件/2,500回 ⇒ 48日 • AWSを利用して50台のサーバを使い1時間で完了 ! AWSでスポットインスタンスの活用 $0.0031×50台≒約16円
  19. 19. Twitter Streaming API • 全Tweetのうち、数%だけに絞って提供されている • それでも1日100万件近い分量 • 日本語のみ取り出すことも可能 ! 参照:Rubyのtwitterライブラリで、Twitter Streaming APIが扱えるようになっていた http://blog.takuros.net/entry/2014/05/19/002326
  20. 20. 引越にも • 参加表明後に、突然の異動の辞令 • 7月から東京勤務 • 相場観がないので、賃貸サイトをスクレイピング • 数十万件のデータから、駅ごとの㎡辺り単価の算出 ! GeoFUSEで視覚化しようとしたが 時間がなくて断念
  21. 21. ご清聴ありがとうございました 後日の質問は、@dkfjまで

×