カバレッジエラーの対策[404編]

##まえがき

[株式会Ancar](https://ancar.co.jp/)のWebエンジニアをしている、keiと申します。
「[株式会Ancar ~Advent Calendar 2019~](https://adventar.org/calendars/4429)」 11日目を担当させていただきます。

弊社は安心・安全な移動体験を届けるをモットーに

[中古車の個人間売買をオンラインで行うサービス](https://www.ancar.jp/)
[全国の中古車からお買い得な車を検索・比較できるサービス](https://www.ancar.jp/search/) を展開しております。

当記事では、GoogleSearchConsoleにサイトマップを登録後、発生したカバレッジエラーに対しての対応について共有させていただきます。

##おしながき
- カバレッジエラーの現状把握
- ４０４の調査結果
- カバレッジエラー対策
    - その１
    - その２
- 最終結果

## カバレッジエラーの現状把握
上記サービスは、５０万以上の車両詳細ページがあります。しかし、どんなにユーザーに役立つページを持っていたとしても、クローラーがページを見つけられなかったら、検索結果に表示されません。
ということで、より多くのページを検索結果に表示させたいと思い、サイトマップをGoogleSearchConsoleで登録しました。:point_down_tone1:送信したサイトマップの一部
<img width="924" alt=" 2019-12-11 0.38.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431450/1facb8aa-5049-bcac-f811-f855aaec18b6.png">

ステータスが成功になり送信できました:clap:

が、、、喜んでるのも束の間
最大で251ページも404が見つかってしまいました:sob:
<img width="924" alt=" 2019-12-11 0.40.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431450/4abbc83b-90f0-db65-5050-4c6131a3f938.png">
<img width="543" alt=" 2019-12-11 0.49.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431450/379062de-d025-cfa9-94e7-1ae4a74278aa.png">
エラーがたくさん見つかってしまったので、次になぜクローラーが251ページも404を返してしまったのかを調査していきました。

## ４０４の調査結果
サーバーのアクセスログとDBを調査したところ、2019年の第41週において、中古車情報取得コマンドの実行中にデータの欠損が起きていたことが判明しました
そのため、 `第42週のデータがcreateされる前に`クローラーが欠損した出品ページにアクセスしエラーを吐いた。
中古車情報取得コマンドにおいて、41週目のデータ欠損が起こった一例

```
+---- +------+--------------+----------------------+---------------------+
| uid | week | car_make_id  |       created_at     |      updated_at     |                                              |
+-----+------+--------------+ ---------------------+---------------------+
|  1  |  40  |       7      |  2019-09-30 16:44:03 | 2019-09-30 22:25:10 |
+-----+------+--------------+----------------------+---------------------+
1 row in set, 1 warning (0.00 sec)
```
```
+---- +------+--------------+----------------------+---------------------+
| uid | week | car_make_id  |       created_at     |      updated_at     |                                              |
+-----+------+--------------+ ---------------------+---------------------+
|  1  |  42  |       7      |  2019-10-08 17:30:03 | 2019-10-08 21:55:10 |
+-----+------+--------------+----------------------+---------------------+
1 row in set, 1 warning (0.00 sec)
```
しかし、たとえ中古車取得コマンドで欠損が起こらなくても、 `前の週にあった出品が今週なくなった` という場合に同様のエラーが起こる可能性がある。
したがって、前週にあって今週には存在しない出品について、今週のサイトマップをSearch Consoleが読み込むまでの間はクローラーが存在しない出品ページにアクセスするという状況を作り出してはならない。

## カバレッジエラー対策その１
対応策として行ったことは、前の週にあった出品が今週なくなった場合、掲載終了ページを作成することで404のレスポンスコードを返さないようにする方法である。
:point_down_tone1:実際に作成したページ
<img width="900" alt=" 2019-12-11 1.43.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431450/74c82e0e-6011-a982-8d6c-d86fbefc30ca.png">

カバレッジエラー修正リクエスト後
GoogleSearchConsoleを見てみると、あれ？増えているではありませんか。。
<img width="318" alt=" 2019-12-11 1.53.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431450/aa4bd0d1-98da-88a6-2edb-d149cc3ae94d.png">


## カバレッジエラー対策その２
ということで、第２弾修正を行っていくことにしました。

### エラー再調査

クローラーがサイトを訪れたタイミングとデータが作られた時間の比較
![ 2019-11-14 15 18 12](https://user-images.githubusercontent.com/39236040/68831604-1dcc4500-06f2-11ea-842a-fda4c9b2e483.png)

```
+---- +------+--------------+----------------------+---------------------+
| uid | week | car_make_id  |       created_at     |      updated_at     |                                              |
+-----+------+--------------+ ---------------------+---------------------+
|  4  |  41  |       5      |  2019-10-07 05:53:03 | 2019-10-07 12:43:15 |
+-----+------+--------------+----------------------+---------------------+
1 row in set, 1 warning (0.00 sec)
```

```
+---- +------+--------------+----------------------+---------------------+
| uid | week | car_make_id  |       created_at     |      updated_at     |                                              |
+-----+------+--------------+ ---------------------+---------------------+
|  4  |  45  |       5      |  2019-11-05 06:55:03 | 2019-11-06 07:25:10 |
+-----+------+--------------+----------------------+---------------------+
1 row in set, 1 warning (0.00 sec)
```
上記時刻を見てみると、クローラーが2019/11/04に対して、DBのcreateした時刻は2019/11/05である。
今回の場合は、41週目の次にデータが出来たのは45週目でした。

そのため、前週のデータが有り、かつ今週のデータが無い場合は掲載終了ページを表示するようにしていたが、先週だけのステータスだけだと今回みたいに過去にデータがあった場合、クローラーがきた時に404を返してしまうということが新たに判明した。

対策として、先週だけのステータスだけではなく、データが過去１週でも有り、かつ今週のデータが無い場合は掲載終了ページを表示するようにしました。

## 最終結果
カバレッジエラー対策その2後、再度Googleにクロールをリクエストすると、251ページもあったエラーが49ページまで減りました:clap:
<img width="1018" alt=" 2019-12-11 2.12.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431450/999bd59f-0630-af14-0e41-fe6e6a0f5f26.png">

残りの49ページはクロールが来るのを待っているという状況なので、404のカバレッジエラー が０件になる日もそう遠くはありません！！
<img width="925" alt=" 2019-12-11 2.15.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431450/5c9a80a1-15df-479b-e31f-ea5c7a7f8fcf.png">