jpmobileと検索クローラ

mobile?で検索クローラも真にしてしまえと。

一般的な用途に合うかどうかはさておき、モバイル用の検索クローラはモバイルとして扱えるようになってもよいかな、と。

正直、一番の目的はGitHubの利用です。forkしてcloneしてadd/commitしてpush。使い方がいまいちわからないので、本体に修正分が入ってしまいそうな恐怖と戦いながらの操作です。公開鍵が自分のしかないので、他人のリポジトリには書き込めないでしょうけど。

終わってみれば、安全に事を運べたように思います。本体を見ても、変更されていないようで一安心です。まあ、addせずに変更分がcommitできなかった事にpush後に気づいたのは内緒ですがね。

クローラ対応

さて、ここからは余談です。今回jpmobileをforkして修正した内容について、少しだけ書いておこうと思います。

  1. jpmobile便利に使わせていただいております!
  2. mobile?でtrueならモバイル用コンテンツを返したい
  3. 各キャリアの端末に対しては普通にできる
  4. クローラのインデクシングはどうなるんだろうか

このような流れで、モバイル用検索クローラからのリクエストも、モバイル端末からのリクエストとして扱いたいと思ったわけです。jpmobileでやる範囲のことなのか、深く考えていませんが、「mobile?」がひどく気に入っています。なので、「mobile?」を使いたいのです。

  • 有名どころはIPとUA情報を公開している
  • 簡単に見つかったのは、Google/Yahoo/Livedoor/Goo
  • 簡単に見つかったのだけ、とりあえず対応する

jpmobileの拡張(対応キャリア追加)は、IPアドレス情報とUA情報がわかれば簡単にできる様なので、上記の修正を加えてみました。ちなみに、4社の公開情報は以下です。

Googleの公開情報が、ブログでしか見つからなかったのが気になりますが、よしとしておきます。

適当な実装でごまかしましたが、端末とクローラの識別順序とでも言うのでしょうか、正規表現によるマッチングの実行順序をつけておきました。元々は、Jpmobile::Mobileが持っている定数をModule.constantsで取り出してeachしているわけですが、クローラのUAはDoCoMoから始まったりするので、クローラを優先的に処理しないと嘘になったりします。IPアドレスとセットでループさせても良かったかもしれませんが、定数名リストを明記して対応しました。

やった事はこんなところでしょうか。詳しくは"git://github.com/koshigoe/jpmobile.git"で。ここにも、forkしてからの差分を付けておきます。

diff --git a/CHANGELOG b/CHANGELOG
index 10ca10b..bc4eba4 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,8 @@
+== 0.0.3x 2008-08-20
+
+* clone
+* mobile web crawler
+
 == 0.0.1 2007-06-16
 
 * Initial release
diff --git a/lib/jpmobile.rb b/lib/jpmobile.rb
index 178ad7f..af7ac4c 100644
--- a/lib/jpmobile.rb
+++ b/lib/jpmobile.rb
@@ -15,6 +15,14 @@ module Jpmobile
     autoload :Emobile,   'jpmobile/mobile/emobile'
     autoload :Willcom,   'jpmobile/mobile/willcom'
     autoload :Ddipocket, 'jpmobile/mobile/willcom'
+    autoload :Google,    'jpmobile/mobile/google'
+    autoload :Yahoo,     'jpmobile/mobile/yahoo'
+    autoload :Livedoor,  'jpmobile/mobile/livedoor'
+    autoload :Goo,       'jpmobile/mobile/goo'
+
+    def self.constants_with_discovery_order
+      [ :Google, :Yahoo, :Livedoor, :Goo, :Docomo, :Au, :Softbank, :Vodafone, :Jphone, :Emobile, :Willcom, :Ddipocket ]
+    end
   end
 end
 
diff --git a/lib/jpmobile/mobile/goo.rb b/lib/jpmobile/mobile/goo.rb
new file mode 100644
index 0000000..77e5c92
--- /dev/null
+++ b/lib/jpmobile/mobile/goo.rb
@@ -0,0 +1,11 @@
+# = gooモバイルクローラ
+
+module Jpmobile::Mobile
+  # == gooモバイルクローラ
+  class Goo < AbstractMobile
+    autoload :IP_ADDRESSES, 'jpmobile/mobile/z_ip_addresses_goo'
+
+    # 対応するUser-Agentの正規表現
+    USER_AGENT_REGEXP = /ichiro\/mobile goo/
+  end
+end
diff --git a/lib/jpmobile/mobile/google.rb b/lib/jpmobile/mobile/google.rb
new file mode 100644
index 0000000..446002f
--- /dev/null
+++ b/lib/jpmobile/mobile/google.rb
@@ -0,0 +1,11 @@
+# = googleモバイルクローラ
+
+module Jpmobile::Mobile
+  # == googleモバイルクローラ
+  class Google < AbstractMobile
+    autoload :IP_ADDRESSES, 'jpmobile/mobile/z_ip_addresses_google'
+
+    # 対応するUser-Agentの正規表現
+    USER_AGENT_REGEXP = /Googlebot-Mobile/
+  end
+end
diff --git a/lib/jpmobile/mobile/livedoor.rb b/lib/jpmobile/mobile/livedoor.rb
new file mode 100644
index 0000000..a29c132
--- /dev/null
+++ b/lib/jpmobile/mobile/livedoor.rb
@@ -0,0 +1,11 @@
+# = livedoorモバイルクローラ
+
+module Jpmobile::Mobile
+  # == livedoorモバイルクローラ
+  class Livedoor < AbstractMobile
+    autoload :IP_ADDRESSES, 'jpmobile/mobile/z_ip_addresses_livedoor'
+
+    # 対応するUser-Agentの正規表現
+    USER_AGENT_REGEXP = /LD_mobile_bot/
+  end
+end
diff --git a/lib/jpmobile/mobile/yahoo.rb b/lib/jpmobile/mobile/yahoo.rb
new file mode 100644
index 0000000..8a41e88
--- /dev/null
+++ b/lib/jpmobile/mobile/yahoo.rb
@@ -0,0 +1,11 @@
+# = yahooモバイルクローラ
+
+module Jpmobile::Mobile
+  # == yahooモバイルクローラ
+  class Yahoo < AbstractMobile
+    autoload :IP_ADDRESSES, 'jpmobile/mobile/z_ip_addresses_yahoo'
+
+    # 対応するUser-Agentの正規表現
+    USER_AGENT_REGEXP = /^Y!J-(SRD|MBS)\/[0-9]+\.[0-9]+$/
+  end
+end
diff --git a/lib/jpmobile/mobile/z_ip_addresses_goo.rb b/lib/jpmobile/mobile/z_ip_addresses_goo.rb
new file mode 100644
index 0000000..89a0958
--- /dev/null
+++ b/lib/jpmobile/mobile/z_ip_addresses_goo.rb
@@ -0,0 +1,7 @@
+# = IPアドレス帯域テーブル(手動更新分)
+# == Goo
+# http://help.goo.ne.jp/help/article/1142/
+# 2008/08現在
+Jpmobile::Mobile::Goo::IP_ADDRESSES = %w(
+210.150.10.32/27
+).map {|ip| IPAddr.new(ip) }
diff --git a/lib/jpmobile/mobile/z_ip_addresses_google.rb b/lib/jpmobile/mobile/z_ip_addresses_google.rb
new file mode 100644
index 0000000..8f8754d
--- /dev/null
+++ b/lib/jpmobile/mobile/z_ip_addresses_google.rb
@@ -0,0 +1,8 @@
+# = IPアドレス帯域テーブル(手動更新分)
+# == Google
+# http://googlejapan.blogspot.com/2008/05/google.html
+# 2008/08現在
+Jpmobile::Mobile::Google::IP_ADDRESSES = %w(
+72.14.199.0/25
+209.85.238.0/25
+).map {|ip| IPAddr.new(ip) }
diff --git a/lib/jpmobile/mobile/z_ip_addresses_livedoor.rb b/lib/jpmobile/mobile/z_ip_addresses_livedoor.rb
new file mode 100644
index 0000000..a3b9513
--- /dev/null
+++ b/lib/jpmobile/mobile/z_ip_addresses_livedoor.rb
@@ -0,0 +1,7 @@
+# = IPアドレス帯域テーブル(手動更新分)
+# == Livedoor
+# http://helpguide.livedoor.com/help/search/qa/grp627
+# 2008/08現在
+Jpmobile::Mobile::Livedoor::IP_ADDRESSES = %w(
+203.104.254.0/24
+).map {|ip| IPAddr.new(ip) }
diff --git a/lib/jpmobile/mobile/z_ip_addresses_yahoo.rb b/lib/jpmobile/mobile/z_ip_addresses_yahoo.rb
new file mode 100644
index 0000000..3d03d8a
--- /dev/null
+++ b/lib/jpmobile/mobile/z_ip_addresses_yahoo.rb
@@ -0,0 +1,15 @@
+# 手動更新
+# = IPアドレス帯域テーブル(手動更新分)
+# == Yahoo
+# http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html
+# 2008/08現在
+Jpmobile::Mobile::Yahoo::IP_ADDRESSES = %w(
+124.83.159.146/31
+124.83.159.148/30
+124.83.159.152/29
+124.83.159.160/28
+124.83.159.176/29
+124.83.159.184/31
+124.83.159.224/28
+124.83.159.240/29
+).map {|ip| IPAddr.new(ip) }
diff --git a/lib/jpmobile/request_with_mobile.rb b/lib/jpmobile/request_with_mobile.rb
index e6f944c..15dcf39 100644
--- a/lib/jpmobile/request_with_mobile.rb
+++ b/lib/jpmobile/request_with_mobile.rb
@@ -33,7 +33,7 @@ module Jpmobile
     def mobile
       return @__mobile if @__mobile
 
-      Jpmobile::Mobile.constants.each do |const|
+      Jpmobile::Mobile.constants_with_discovery_order.each do |const|
         c = Jpmobile::Mobile.const_get(const)
         return @__mobile = c.new(self) if c::USER_AGENT_REGEXP && user_agent =~ c::USER_AGENT_REGEXP
       end
diff --git a/spec/controllers/goo_spec.rb b/spec/controllers/goo_spec.rb
new file mode 100644
index 0000000..731e531
--- /dev/null
+++ b/spec/controllers/goo_spec.rb
@@ -0,0 +1,14 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+
+describe "モバイルgoo 携帯検索クローラ からのアクセス" do
+  before do
+    request.user_agent = "DoCoMo/2.0 P900i(c100;TB;W24H11)(compatible; ichiro/mobile goo; +http://help.goo.ne.jp/door/crawler.html)"
+  end
+  controller_name :mobile_spec
+  it "request.mobile は Goo のインスタンスであるべき" do
+    request.mobile.should be_an_instance_of(Jpmobile::Mobile::Goo)
+  end
+  it "request.mobile? は true であるべき" do
+    request.mobile?.should be_true
+  end
+end
diff --git a/spec/controllers/google_spec.rb b/spec/controllers/google_spec.rb
new file mode 100644
index 0000000..51b69ec
--- /dev/null
+++ b/spec/controllers/google_spec.rb
@@ -0,0 +1,14 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+
+describe "Google モバイルウェブクローラー からのアクセス" do
+  before do
+    request.user_agent = "DoCoMo/1.0/N505i/c20/TB/W20H10 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)"
+  end
+  controller_name :mobile_spec
+  it "request.mobile は Google のインスタンスであるべき" do
+    request.mobile.should be_an_instance_of(Jpmobile::Mobile::Google)
+  end
+  it "request.mobile? は true であるべき" do
+    request.mobile?.should be_true
+  end
+end
diff --git a/spec/controllers/livedoor_spec.rb b/spec/controllers/livedoor_spec.rb
new file mode 100644
index 0000000..52955ab
--- /dev/null
+++ b/spec/controllers/livedoor_spec.rb
@@ -0,0 +1,14 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+
+describe "Livedoor モバイルサイト検索用のクローラー からのアクセス" do
+  before do
+    request.user_agent = "DoCoMo/1.0/N505i/c20/TB/W20H10 (compatible; LD_mobile_bot; +http://helpguide.livedoor.com/help/search/qa/grp627)"
+  end
+  controller_name :mobile_spec
+  it "request.mobile は Livedoor のインスタンスであるべき" do
+    request.mobile.should be_an_instance_of(Jpmobile::Mobile::Livedoor)
+  end
+  it "request.mobile? は true であるべき" do
+    request.mobile?.should be_true
+  end
+end
diff --git a/spec/controllers/yahoo_spec.rb b/spec/controllers/yahoo_spec.rb
new file mode 100644
index 0000000..2344d81
--- /dev/null
+++ b/spec/controllers/yahoo_spec.rb
@@ -0,0 +1,17 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+
+describe "モバイル版Yahoo!検索の検索エンジン用ロボット からのアクセス" do
+  controller_name :mobile_spec
+  it "request.mobile は Yahoo のイン

forkしてcloneした後の"rake spec"が実行できず、四苦八苦してましたが、"rspec-fixture"というgemが必要だったようです。"sudo gem install rspec-fixture"したら実行できる様になりました。

プロフィール

このブログ記事について

このページは、koshigoeが2008年8月20日 22:58に書いたブログ記事です。

ひとつ前のブログ記事は「iPhone 3Gのオンライン販売が始まってた」です。

次のブログ記事は「ipcount便利」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。