リソース更新からGooglebotに見つけられるまでの時間をログから算出する

# 公開したページは1秒でも早くGoogleBotに拾って欲しい

追加や更新したページは1秒でも早くGoogleBotに拾ってもらって検索結果に表示されて欲しいですよね。

もしも公開したページがGoogleにインデックス登録されて検索結果に表示される前に、他サイトにページ内容をコピーされ、このコピーした方が先にGoogleにインデックスされて検索結果に表示され、さもオリジナルのように扱われては困ってしまいます。

サイトにページを追加してからクローラーが訪問するまでに1週間とか掛っていたらガッカリしちゃいますよね。

ここではRailsとそのログを使って、リソースを更新（ページの更新）してからそれがGoogleのクローラーに拾われるまでを自動で算出してみます。

# admin側のログ解析

まず最初にadmin側のログからリソースが更新された時間を収集します。適当にa.rbというスクリプトを作って、ログを読み込んで時間/リソース名/リソースIDの3つを抜き出します。

```bash
$ ruby a.rb < log/production.log > a.txt
```

```rb：a.rb
# 
# 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というファイル名にしました。

```bash
$ cat log/production.log | grep 66.249. | grep "plan?plan_id=" | less > b.log
$ ruby b.rb < b.log > bb.txt
```

```rb：b.rb
# 
# 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というファイル名にしました。

```bash
$ ruby c.rb

PlansController/644 は更新してから 528 分後にGoogleBotにクロールされました
PlansController/645 は更新してから 552 分後にGoogleBotにクロールされました
```

```rb:c.rb
#
# 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で説明があります。

https://support.google.com/webmasters/answer/80553?hl=ja

この記事のコードでは66.249.と大雑把に指定しましたが、説明では利用する帯域が変わる可能性があるからIPアドレスからDNSリバースルックアップしてgooglebot.com / google.comであることを確認するようにとあります。

## GooglebotのUserAgentについて

UserAgentは偽装できるためIPの方が信頼できますがUserAgentから判断することもできます。

Googleが利用しているクローラーのUserAgentは以下URLで説明されています。

https://support.google.com/webmasters/answer/1061943?hl=ja

# 質問などについて

質問などあればコメント欄にお願いします。直接メッセージを送りたい方は[Twitter](https://twitter.com/tkosuga)宛てにお願いします。