公開したページは1秒でも早くGoogleBotに拾って欲しい
追加や更新したページは1秒でも早くGoogleBotに拾ってもらって検索結果に表示されて欲しいですよね。
もしも公開したページがGoogleにインデックス登録されて検索結果に表示される前に、他サイトにページ内容をコピーされ、このコピーした方が先にGoogleにインデックスされて検索結果に表示され、さもオリジナルのように扱われては困ってしまいます。
サイトにページを追加してからクローラーが訪問するまでに1週間とか掛っていたらガッカリしちゃいますよね。
ここではRailsとそのログを使って、リソースを更新(ページの更新)してからそれがGoogleのクローラーに拾われるまでを自動で算出してみます。
admin側のログ解析
まず最初にadmin側のログからリソースが更新された時間を収集します。適当にa.rbというスクリプトを作って、ログを読み込んで時間/リソース名/リソースIDの3つを抜き出します。
$ ruby a.rb < log/production.log > a.txt
#
# INPUT ->
# I, [2016-01-12T11:58:14.045660 #26423] INFO -- : Processing by PlansController#update as HTML
# I, [2016-01-12T11:58:14.045894 #26423] INFO -- : Parameters: {"utf8"=>"?", "..." => "...", "id"=>"5659"}
#
# OUTPUT ->
# 2016-01-12T11:58:14.045660 #26423, PlansController, 5659
#
lines = readlines
while(lines.length != 0)
line = lines.shift
if line =~ /#update/ || line =~ /#create/
updated_time = line.match(/\[([^\]]+)/i).captures[0]
controller_name = line.match(/by ([^#]+)/i).captures[0]
resource_id = lines.shift.match(/"id"=>"([0-9]+)"/i).captures[0]
puts "#{updated_time}, #{controller_name}, #{resource_id}"
end
end
フロントエンド側のログ解析
次はフロントエンド側のログからGoogleクローラーのIPを指定してリソースを参照している行に限定して時間/リソース名/リソースIDの3つを抜き出します。適当にb.rbというファイル名にしました。
$ cat log/production.log | grep 66.249. | grep "plan?plan_id=" | less > b.log
$ ruby b.rb < b.log > bb.txt
#
# INPUT ->
# I, [2016-01-12T20:43:50.753208 #25890] INFO -- : Started GET "/v/35/plan?plan_id=431" for 66.249.71.72 at 2016-01-12 20:43:50 +0900
# I, [2016-01-12T20:47:00.133113 #25890] INFO -- : Started GET "/v/17/plan?plan_id=644" for 66.249.71.64 at 2016-01-12 20:47:00 +0900
# I, [2016-01-12T21:18:10.562747 #27849] INFO -- : Started GET "/v/11/plan?plan_id=645" for 66.249.71.64 at 2016-01-12 21:18:10 +0900
# I, [2016-01-12T23:36:30.371424 #3054] INFO -- : Started GET "/v/80/fair?fair_id=81987" for 66.249.71.64 at 2016-01-12 23:36:30 +0900
#
# OUTPUT ->
# 2016-01-12T20:43:50.753208 #25890, v/35/plan, 431
# 2016-01-12T20:47:00.133113 #25890, v/17/plan, 644
# 2016-01-12T21:18:10.562747 #27849, v/11/plan, 645
#
lines = readlines
while(lines.length != 0)
line = lines.shift
if line =~ /plan\?plan_id=/
updated_time = line.match(/\[([^\]]+)/i).captures[0]
resource_name = line.match(/\/([^?]+)/i).captures[0]
resource_id = line.match(/_id=([0-9]+)/i).captures[0] rescue nil
puts "#{updated_time}, #{resource_name}, #{resource_id}"
end
end
admin側とフロントエンド側のログを突き比べて時間の差分を取る
さあ、上記2つが取れれば後はもうどうすれば良いのか分かりますよね。
admin側で更新時間があり、フロントエンド側で拾われた時間がありますので差分と取ればリソースを更新してからGoogleクローラーに拾われるまでの間隔を算出できます。適当にc.rbというファイル名にしました。
$ ruby c.rb
PlansController/644 は更新してから 528 分後にGoogleBotにクロールされました
PlansController/645 は更新してから 552 分後にGoogleBotにクロールされました
#
# aa.txt: a.rb の出力結果
# bb.txt: b.rb の出力結果
#
require 'time'
def to_datetime(s)
DateTime.strptime(s.split(/\s/)[0], '%Y-%m-%dT%H:%M:%S')
end
def minutes(a, b)
((a - b) * 24 * 60).to_i
end
map = {}
lines = File.readlines("aa.txt")
while(lines.length != 0)
line = lines.shift
time, resource, resource_id = line.split(", ").collect(&:chomp)
map["#{resource}/#{resource_id}"] = time
end
lines = File.readlines("bb.txt")
while(lines.length != 0)
line = lines.shift
time, resource, resource_id = line.split(", ").collect(&:chomp)
if resource =~ /\/plan/
next if map["PlansController/#{resource_id}"].nil?
m = minutes(to_datetime(time), to_datetime(map["PlansController/#{resource_id}"]))
puts %|PlansController/#{resource_id} は更新してから #{m} 分後にGoogleBotにクロールされました|
end
end
これでページ更新から何分後にGooglebotに見つけてもらえたのか分かりました。具体的な時間が分かっていれば明確な対策が打てます。
更新タイミングでpingを飛ばす、キャッシュが消えたタイミングでリソースが更新されているか見てpingを飛ばす、更新タイミングでTwitterやTumblrにURLを流す、サイト内に更新したページへの内部リンクを足す、などの方法がぱっと思いつきます。
さいごに
ログ解析ツールは多数ありますが、Googlebotに特化したものとなると全く見かけません。技術的なSEOをする中でGoogleからサイトに対するアクションを把握するのは重要なので、SEOで何をすれば良いのか分からなくなっているウェブマスターの方はログ解析を見直してみるの面白いと思います。
補足
GooglebotのIPについて
Googlebot かどうかの確認については以下URLで説明があります。
この記事のコードでは66.249.と大雑把に指定しましたが、説明では利用する帯域が変わる可能性があるからIPアドレスからDNSリバースルックアップしてgooglebot.com / google.comであることを確認するようにとあります。
GooglebotのUserAgentについて
UserAgentは偽装できるためIPの方が信頼できますがUserAgentから判断することもできます。
Googleが利用しているクローラーのUserAgentは以下URLで説明されています。
質問などについて
質問などあればコメント欄にお願いします。直接メッセージを送りたい方はTwitter宛てにお願いします。