CocProxyというツールがあります。名前の通りプロキシサーバーなのですが、用途が開発用です。置換プロキシと言うらしいですが、これがとっても便利です。例えば、クローラーの開発や、HTML,CSS,JavaScriptの修正をする際に、このCocProxyを利用するとダウンロード待ちのイライラが解消され、効率アップ間違いなしです。ローカルのみで完結するのと、Webへのアクセスが必要とするのでは、スピードが数十〜数百倍違います。一回だけでみたら、数百ミリSecの差ですが累積で考えると大きいですよ。
CocProxyとは?
Ruby製のProxyServerです。かつ標準ライブラリで動くことを目標としているので、Rubyの環境があれば、ダウンロードして直ぐに使えます。また基本的には1ファイルで完結するので、導入も簡単です。Ruby1.9をベースにしていますが、Ruby 2.0でも特に問題なく動くようです。
動作としては、Webファイルの取得時に、まずローカルのファイルもしくはキャッシュを確認して、存在したらそれを返します。なければWebファイルを取得にいきます。その際、キャッシュとしても保存するので、2回目以降は取得しないようになります。
ローカルファイルについてですが、filesというディレクトリを作成してファイルをおいておくと、まずそれを見てくれるようになります。つまり上手くやると、オフラインでも開発できるようになります。一致条件については、下記のルールとなります。
#{File.basename(req.path_info)}",
#{req.host}#{req.path_info}",
#{req.host}/#{File.basename(req.path_info)}",
.#{req.path_info}",
具体的にいうと、 http://blog.takuros.net/entry/2014/04/15/070434 にアクセスする場合、最初に070434というファイルを見て、次にhttpなしのFQDN、ドメイン名+ファイル名、絶対パスの順で照合していきます。下のケースですと、無いので取得にいってキャッシュしていますね。
Checking files/070434
Checking files/blog.takuros.net/entry/2014/04/15/070434
Checking files/blog.takuros.net/070434
Checking files/./entry/2014/04/15/070434
Cached: http://blog.takuros.net/entry/2014/04/15/070434
CocProxyのインストールと起動
インストールは、簡単です。下記のURLからCocProxyをダウンロードするだけです。
http://svn.coderepos.org/share/lang/ruby/cocproxy/proxy.rb
起動は、proxy.rbをrubyからキックするだけです。
デフォルトで、5432ポートを利用します。
$ ruby proxy.rb Use default configuration. Port : 5432 Dir : files/ Cache: true Rules: 1. #{File.basename(req.path_info)} 2. #{req.host}#{req.path_info} 3. #{req.host}/#{File.basename(req.path_info)} 4. .#{req.path_info} Checking files// Checking files/www.yahoo.co.jp/ Checking files/www.yahoo.co.jp// Checking files/./ Cached: http://www.yahoo.co.jp/ Checking files/070434 Checking files/blog.takuros.net/entry/2014/04/15/070434 Checking files/blog.takuros.net/070434 Checking files/./entry/2014/04/15/070434 Cached: http://blog.takuros.net/entry/2014/04/15/070434
ちなみに1ファイルでない、完全版は下記のURLからダウンロードできます。
http://svn.coderepos.org/share/lang/ruby/cocproxy/
CocProxyの利用 With Nokogiri
CocProxyは、各アプリからの設定でProxyとして指定することで利用できます。Nokogiriの場合は、次のような感じです。
require 'nokogiri' require 'open-uri' doc = Nokogiri::HTML(open('http://www.yahoo.co.jp', :proxy => 'http://localhost:5432')) puts doc.title # => Yahoo! JAPAN
動作はこの通りです。2回目は、キャッシュを参照しているのが解ります。
Checking files// Checking files/www.yahoo.co.jp/ Checking files/www.yahoo.co.jp// Checking files/./ From Cache: http://www.yahoo.co.jp/ Checking files// Checking files/www.yahoo.co.jp/ Checking files/www.yahoo.co.jp// Checking files/./ From Cache: http://www.yahoo.co.jp/
Nokogiriなどを使ってスクレイピングする場合は、なかなか一度で思い通りのデータを取得することは難しいです。何度も試行錯誤すると、当然ながら何度もWebサイトにアクセスすることになります。迷惑掛けていないか心苦しく思うことが多々あります。そんな際に、CocProxyがあれば思う存分試行錯誤できます。
改善点
ローカルファイル参照とキャッシュ参照の仕組みの二つがあるのは面白いです。一方で自分が使ってて思うのは、わざわざローカルファイルを置くのは面倒臭いというのがあります。初回取得時にキャッシュではなく、ローカルにファイルを置く機構があれば便利かなと思います。また、ローカルファイルの取得もURLのハッシュ値で取得するだけで充分です。また、ユーザーエージェントが取得先の動作に影響する場合があるので、考慮が必要な場合があります。その辺りは作者の方と利用想定が違うと思うので、自分用に改造して使っています。その辺り、次回くらいで紹介します。
まとめ
CocProxy便利です。もう5年以上前のモジュールですが、今でも色あせずに活躍しています。
See Also:
Ruby製のクローラー AnemoneでストレージをSQLite3, MongoDBに変更する
Ruby製のクローラー Anemoneでストレージをファイルに変更する
Ruby製の構文解析ツール、Nokogiriの使い方 with Xpath
Ruby製のクローラー Anemoneの文字化け対策
あらためてRuby製のクローラー、"anemone"を調べてみた
オープンソースのRubyのWebクローラー"Anemone"を使ってみる
JavaScriptにも対応出来るruby製のクローラー、Masqueを試してみる
複数並行可能なRubyのクローラー、「cosmicrawler」を試してみた
参照:
CocProxy – CodeRepos::Share – Trac
- 作者: るびきち,佐々木拓郎
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/08/25
- メディア: 大型本
- この商品を含むブログ (1件) を見る
Spidering hacks―ウェブ情報ラクラク取得テクニック101選
- 作者: Kevin Hemenway,Tara Calishain,村上雅章
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2004/05
- メディア: 単行本
- 購入: 52人 クリック: 904回
- この商品を含むブログ (103件) を見る