37
第62回 Ruby/Rails勉強会@関西 Rubyで作る クローラー 2014年7月26日 @dkfj 佐々木拓郎

Rubyで作るクローラー Ruby crawler

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Rubyで作るクローラー Ruby crawler

第62回 Ruby/Rails勉強会@関西 !

Rubyで作る クローラー

2014年7月26日 @dkfj 佐々木拓郎

Page 2: Rubyで作るクローラー Ruby crawler

今日は東京の方(埼玉)から来ました

https://flic.kr/p/jjvzc7

Page 3: Rubyで作るクローラー Ruby crawler

先月まで大阪に住んでました

https://flic.kr/p/iEo2Hp

Page 4: Rubyで作るクローラー Ruby crawler

先月まで大阪に住んでました

https://flic.kr/p/iEo2Hp

Page 5: Rubyで作るクローラー Ruby crawler

✦ プロフィール

‣ 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

自己紹介: 佐々木拓郎

Page 6: Rubyで作るクローラー Ruby crawler

主にJAWSUG大阪で活動しています (AWS勉強会)

Page 7: Rubyで作るクローラー Ruby crawler

✦ 正直、初中級者レベル

‣ 2006年くらいから、個人的に使いはじめる

‣ 2009~10年くらいに業務でRuby On Railsなどを導入

‣ 以降、自分のチームではRailsを標準に              (でも、自分では余りソース書かず)

‣ AWSのAPI利用で、もっぱら利用

‣ 2012~13年くらいにChef, Capistrano関係で再勉強

私とRuby

Page 8: Rubyで作るクローラー Ruby crawler

宣伝!!

そんな私ですが、 Rubyのクローラー本を書きました。 8月頃に発売予定です。しました。

http://amzn.to/1lsJ5id

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Page 9: Rubyで作るクローラー Ruby crawler

クローラーって、 ご存知ですか?

Page 10: Rubyで作るクローラー Ruby crawler

 クローラ(Crawler)とは、ウェブ上の文書や画像などを周期的に取得し、自動的にデータベース化するプログラムである。「ボット(Bot)」、「スパイダー」、「ロボット」などとも呼ばれる。  主に検索エンジンのデータベース、インデックス作成に用いられているほか、統計調査などの目的にも利用される。近年では電子メールアドレス収集業者などもクローラを利用して、スパムの送信効率を上げている。

ウィキペディアより

Page 11: Rubyで作るクローラー Ruby crawler

と言われても、 よく解らないのでデモ

!

Amazonから新刊情報を取得

Page 12: Rubyで作るクローラー Ruby crawler
Page 13: Rubyで作るクローラー Ruby crawler
Page 14: Rubyで作るクローラー Ruby crawler
Page 15: Rubyで作るクローラー Ruby crawler
Page 16: Rubyで作るクローラー Ruby crawler

クローラー周りの用語の説明

Page 17: Rubyで作るクローラー Ruby crawler

クローラー

• Webを巡回するプログラムの総称 • ボット、スパイダー、ロボットなど様々な呼ばれ方がある • 巡回戦略を練るのが一番の仕事 • スクレイピングやストレージの機能を持つことが多い

Page 18: Rubyで作るクローラー Ruby crawler

スクレイピング

• 取得したHTMLなどから、データを抜き出すこと • 例えば、HTML中のAタグのリンク先を全て取得する • 正規表現派と構文解析派が存在する

Page 19: Rubyで作るクローラー Ruby crawler

Rubyでクローラー作成

• Open-URI • Nokogiri • Anemone • Capybara+Selenium • cosmiccrawler • CocProxy

Page 20: Rubyで作るクローラー Ruby crawler

Rubyでクローラー作成

• Open-URI • Nokogiri • Anemone • Capybara+Selenium • cosmiccrawler • CocProxy

基本的なライブラリ

クローラー フレームワーク

補助的なライブラリ

Page 21: Rubyで作るクローラー Ruby crawler

Open-URI

• http/ftpに簡単にアクセスするためのライブラリ • Kernel#openを再定義 • ファイルのopenと同様に、URLを扱える require 'open-uri' open("http://www.ruby-lang.org/") {|f| f.each_line {|line| p line} }

Page 22: Rubyで作るクローラー Ruby crawler

• 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

Page 23: Rubyで作るクローラー Ruby crawler

• 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

Page 24: Rubyで作るクローラー Ruby crawler

• 基本的には、UIテストツール • ブラウザを使うので、JavaScriptにも対応可能 • スクレイピング部分は、Nokogiriを利用 • CapybaraをラッパーしたMasqueというクローラー • ブラウザ代わりに、PhantomJSを使うのもあり

Capybara+Selenium

参照:Capybara-DSLのはなし http://blog.takuros.net/entry/20140322/1395464375

参照:JavaScriptにも対応出来るruby製のクローラー、Masqueを試してみる http://blog.takuros.net/entry/20131223/1387814711

Page 25: Rubyで作るクローラー Ruby crawler

• 並列処理を得意とするクローラー • 並列処理の実装は、EventMachine • EventMachineの面倒くさい処理を隠蔽してくれる

cosmicrawler

参照:複数並行可能なRubyのクローラー、「cosmicrawler」を試してみた http://blog.takuros.net/entry/20140103/1388701372

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| puts element[:href] end !}

Page 26: Rubyで作るクローラー Ruby crawler

• ほぼピュアRubyで実装されたプロキシサーバ • 開発用途で、クローラー作成時に便利 • 訪問済みのサイトをキャッシュしてくれる • 訪問先サイトに無駄に負荷を掛けずに試行錯誤できる

CocProxy

参照:開発用プロキシ、「CocProxy」が便利 http://blog.takuros.net/entry/2014/05/05/120747

Page 27: Rubyで作るクローラー Ruby crawler

クローラーの作成例

Page 28: Rubyで作るクローラー Ruby crawler

• 株価や為替の取得 • ニュース記事の取得 • ブログ記事の取得 • 書誌情報の取得

定番

Page 29: Rubyで作るクローラー Ruby crawler

• iTunesStoreのランキングの実体はHTML+JSON • UserAgentを”iTunes”にすればスクレイピング可能 • 国ごとのコードをX-Apple-Store-Frontで指定 • カテゴリIDとランキング種別は、引数で指定

iTunesStoreのランキング

参照:iTunesのランキングを毎日自動で取得する その1 http://blog.takuros.net/entry/20120521/1337549653

Page 30: Rubyで作るクローラー Ruby crawler

• クローラーの目的は、データの収集 • APIが提供されているのであれば、そちらが効率的 • ただし、APIは制約が多いのも事実 !

APIの活用

Page 31: Rubyで作るクローラー Ruby crawler

• 1IP辺り1日2,500回のリクエスト制限 • 郵便番号(12万件)を、経度緯度に変換したい • 120,000件/2,500回 ⇒ 48日 • AWSを利用して50台のサーバを使い1時間で完了 !

Google Maps APIの活用

AWSでスポットインスタンスの活用 $0.0031×50台≒約16円

Page 32: Rubyで作るクローラー Ruby crawler
Page 33: Rubyで作るクローラー Ruby crawler

• 全Tweetのうち、数%だけに絞って提供されている • それでも1日100万件近い分量 • 日本語のみ取り出すことも可能 !

Twitter Streaming API

参照:Rubyのtwitterライブラリで、Twitter Streaming APIが扱えるようになっていた http://blog.takuros.net/entry/2014/05/19/002326

Page 34: Rubyで作るクローラー Ruby crawler
Page 35: Rubyで作るクローラー Ruby crawler
Page 36: Rubyで作るクローラー Ruby crawler

引越にも

• 6月中旬に、突然の異動の辞令 • 7月から東京勤務 • 相場観がないので、賃貸サイトをスクレイピング • 数十万件のデータから、駅ごとの㎡辺り単価の算出 !

GeoFUSEで視覚化しようとしたが 時間がなくて断念

Page 37: Rubyで作るクローラー Ruby crawler

ご清聴ありがとうございました 後日の質問は、@dkfjまで