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

More Related Content

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