More Related Content
Similar to Rubyで作るクローラー Ruby crawler
Similar to Rubyで作るクローラー Ruby crawler (20)
More from Takuro Sasaki (18)
Rubyで作るクローラー Ruby crawler
- 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
自己紹介: 佐々木拓郎
- 7. 私とRuby
✦ 正直、初中級者レベル
‣ 2006年くらいから、個人的に使いはじめる
‣ 2009~10年くらいに業務でRuby On Railsなどを導入
‣ 以降、自分のチームではRailsを標準に
(でも、自分では余りソース書かず)
‣ AWSのAPI利用で、もっぱら利用
‣ 2012~13年くらいにChef, Capistrano関係で再勉強
- 20. Rubyでクローラー作成
• Open-URI
• Nokogiri
• Anemone
• Capybara+Selenium
• cosmiccrawler
• CocProxy
基本的なライブラリ
クローラー
フレームワーク
補助的なライブラリ
- 22. • 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
- 23. • 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
- 24. 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
- 25. 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
!
}
- 26. CocProxy
• ほぼピュアRubyで実装されたプロキシサーバ
• 開発用途で、クローラー作成時に便利
• 訪問済みのサイトをキャッシュしてくれる
• 訪問先サイトに無駄に負荷を掛けずに試行錯誤できる
参照:開発用プロキシ、「CocProxy」が便利
http://blog.takuros.net/entry/2014/05/05/120747
- 31. Google Maps APIの活用
• 1IP辺り1日2,500回のリクエスト制限
• 郵便番号(12万件)を、経度緯度に変換したい
• 120,000件/2,500回 ⇒ 48日
• AWSを利用して50台のサーバを使い1時間で完了
!
AWSでスポットインスタンスの活用
$0.0031×50台≒約16円
- 33. Twitter Streaming API
• 全Tweetのうち、数%だけに絞って提供されている
• それでも1日100万件近い分量
• 日本語のみ取り出すことも可能
!
参照:Rubyのtwitterライブラリで、Twitter Streaming APIが扱えるようになっていた
http://blog.takuros.net/entry/2014/05/19/002326
- 36. 引越にも
• 6月中旬に、突然の異動の辞令
• 7月から東京勤務
• 相場観がないので、賃貸サイトをスクレイピング
• 数十万件のデータから、駅ごとの㎡辺り単価の算出
!
GeoFUSEで視覚化しようとしたが
時間がなくて断念