無いなら作ろうシリーズ 第4弾
サイトマップのURLをIndex APIに投げ込むスクリプトです。前回は、前準備としてGoogleのAPIの設定までやりました。今日は実際のプログラムを作ります。
2024年9月にIndexing APIに変更がありました。使い方を間違えるとスパム扱いするとGoogleのドキュメントに明記されましたのでお気をつけください。この記事はルール変更前に書かれたものです。
Google Indexing APIを実行するとGoogleのクローラーを呼び込むことができ、記事の最新の内容をGoogleのキャッシュに載せやすくすることができます。
使ったもの
プログラム作成に使ったものはこちらです
- Windows10
- PHP 7.2.11
- Google Indexing API
- Google API Library
Windowsでやってます。
バージョンアップが面倒なのでPHPが7.2系で動かしています。もしかしたらPHPの5.x系でも8.x系でも動くかもしれません。
APIを使うときに気を付けること
APIに実行制限があるので、制限内に収まるようにコントロールする必要があります。一応、コード上はなんとなく制限をしています。厳密ではないのでエラーが出ることもありますが、まぁ無防備よりいいレベルです。
1日あたりのAPIの実行数は200回
- バッチ実行あたりで200回にしているので、1日1回しか動かない前提です。
1分間あたりのAPIの実行数は60回 600回
1コールあたり2秒スリープして30回/分程度になるようにしています。- 間違えてました。1分あたり60回ではなく600回が上限です。1秒あたり10回なので普通にプログラムを作ったら超えないと思います。
参照
https://developers.google.com/search/apis/indexing-api/v3/quota-pricing
プログラムの仕様
こんな感じで作ります
- サイトマップインデックスのURLを指定する
- サイトマップインデックスファイルを読み、サイトマップのURLを全部集める
- サイトマップURLを見に行き、サイトマップ内にあるページのURLを集める
- 全部集め終わったら
lastmod
の逆順(更新があった順)に並び替える - 新しい順に200個のURLまで、Google Indexing APIを実行する
- 結果をまとめる
やらなかったこと
以下のことは未実装です。
APIに投げ込むURLをサイトマップ(XML)から取り出しているので、サイトマップ(XML)に載ってないものは対象外です。
頑張って改良すれば、できそうではあるがいったん保留。
APIの実行上限が1日で200件。サイトマップ(XML)から全件取り出すと200件以上になった場合には全件実行できません。このプログラムでは更新日の新しい順で並べているので、更新のない201番目以降の記事は出番が回ってこないです。
記事自体を何かしら変更をするとサイトマップのlastmod
(最終更新日)が新しくなるので、処理対象になります。現段階では大きな問題にはならないので、気にしないでおきます。
どうしても気になる場合は、プログラムを改良してたまに逆順で並べて実行するとか、ですかね。
プログラム
プログラムは、ここに置きました。
https://github.com/kanaxx/hatenablog-indexing/
PHPファイル1枚だけで書いたので、動かすのはそんなに難しくないと思いますが、簡単に説明を書いておきます。
クライアントライブラリをインストール
C:\ λ mkdir hatena_indexing C:\ λ cd hatena_indexing\ C:\hatena_indexing λ composer require google/apiclient:"^2.0" ./composer.json has been created Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 16 installs, 0 updates, 0 removals - Installing ralouphie/getallheaders (3.0.3): Loading from cache - Installing psr/http-message (1.0.1): Downloading (100%) (省略) Writing lock file Generating autoload files C:\hatena_indexing λ ls composer.json composer.lock vendor/
composer.json, composer.lock, vendorディレクトリができてればOK
認証ファイルを置く
前回作った認証用のjson
ファイルをC:\hatena_indexing
にコピーします。
ファイルの名前はなんでもよいですが、変更した場合はプログラム側と合わせてください。credential.json
として置くならPHPのプログラムの修正は不要です。
//ここに置く C:\hatena_indexing\credential.json
PHPファイルを置く
次はPHPファイルです。Githubからファイルを持ってきて、C:\hatena_indexing\
に置いてください。
publish_sitemap_to_indexing_api.php
の最初の変数は、認証ファイルを置いた場所に合わせる。
<?php //認証用のファイル $credentialFile = './credential.json'; //サイトマップ $sitemapOrIndexUrls = [];
実行
phpコマンドで実行します。
引数に、<サイトマップURL>か<サイトマップインデックスURL>を指定して実行します。
こんな感じです。
>php publish_sitemap_to_indexing_api.php "https://kanaxx.hatenablog.jp/sitemap_common.xml"
>php publish_sitemap_to_indexing_api.php "https://kanaxx.hatenablog.jp/sitemap_index.xml"
コマンドのパラメータに&が入るときはダブルクオートで囲む必要があります。月別のサイトマップを指定するときは気を付けてください。
実行サンプル
サイトマップインデックスだとログの量が多くなるので、4月分のサイトマップを指定して実行しています。
php publish_sitemap_to_indexing_api.php "https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=4" -getting XML >> https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=4 got 12 entries. page :2020-06-10 20:05:03 https://kanaxx.hatenablog.jp/entry/screenpresso-timer page :2020-06-10 20:05:18 https://kanaxx.hatenablog.jp/entry/screenpresso-image-resizing page :2020-06-10 20:05:31 https://kanaxx.hatenablog.jp/entry/screenpresso-image-composite page :2020-06-10 20:05:58 https://kanaxx.hatenablog.jp/entry/chrome-ext-localization page :2020-05-09 20:51:15 https://kanaxx.hatenablog.jp/entry/windows10-taskbar page :2020-06-10 20:06:51 https://kanaxx.hatenablog.jp/entry/image-compress page :2020-06-17 20:09:02 https://kanaxx.hatenablog.jp/entry/google-adsense-approved page :2020-06-13 19:35:47 https://kanaxx.hatenablog.jp/entry/screenpresso-gif-animation page :2020-06-15 12:33:51 https://kanaxx.hatenablog.jp/entry/hatenablog-sitemap page :2020-04-05 20:38:04 https://kanaxx.hatenablog.jp/entry/try-google-adsense-6 page :2020-06-10 20:07:33 https://kanaxx.hatenablog.jp/entry/screenpresso-scanning-qrcode page :2020-06-10 20:07:45 https://kanaxx.hatenablog.jp/entry/screenpresso-chrome-extension === URL ==== 12 ============ 200:OK|https://kanaxx.hatenablog.jp/entry/google-adsense-approved|2020-06-21 19:55:37 200:OK|https://kanaxx.hatenablog.jp/entry/hatenablog-sitemap|2020-06-21 19:55:39 200:OK|https://kanaxx.hatenablog.jp/entry/screenpresso-gif-animation|2020-06-21 19:55:42 200:OK|https://kanaxx.hatenablog.jp/entry/screenpresso-chrome-extension|2020-06-21 19:55:44 200:OK|https://kanaxx.hatenablog.jp/entry/screenpresso-scanning-qrcode|2020-06-21 19:55:46 200:OK|https://kanaxx.hatenablog.jp/entry/image-compress|2020-06-21 19:55:48 200:OK|https://kanaxx.hatenablog.jp/entry/chrome-ext-localization|2020-06-21 19:55:51 200:OK|https://kanaxx.hatenablog.jp/entry/screenpresso-image-composite|2020-06-21 19:55:53 200:OK|https://kanaxx.hatenablog.jp/entry/screenpresso-image-resizing|2020-06-21 19:55:55 200:OK|https://kanaxx.hatenablog.jp/entry/screenpresso-timer|2020-06-21 19:55:57 200:OK|https://kanaxx.hatenablog.jp/entry/windows10-taskbar|2020-06-21 19:56:00 200:OK|https://kanaxx.hatenablog.jp/entry/try-google-adsense-6|2020-06-21 19:56:02 === Result === 200:12 ==============
たらたらとログが出れば終わりです。最後にステータスコードごとの集計が出ます。200
は成功、200
以外は何かしら失敗してるということです。
例だとサイトマップファイルから、12個のURLが見つかり12個のAPIを投げて12個とも成功したということです。
実行した結果
クローラーが来ていないページを一つ見つけたので、スクリプトの実行前と後の比較用のスクショを残しておきます。
実行前のサーチコンソール
クローリングが2020年4月30日で止まってるページ
API実行のログ
12:58にAPIを投げました。
200:OK https://kanaxx.hatenablog.jp/entry/chrome-ext-localization 2020-06-21 12:58:58
(▲記事の横幅の関係で改行してます)
実行後のサーチコンソール
2020年6月21日13時16分に来て、日付が更新されました!
まとめ
定期的にクローラーがやってきて最新データを持って行ってくれるはずですが、結構古いものが残っていたので、APIでまとめて処理してみました。 インデックス数が足りていないわけではないので、このブログにとっては効果は限定的かなと思います。新しい記事を作ったときにインデックスされるまでの時間が短くなる程度ですかね。
サイトマップ登録が上手くいってなかったり、記事インデックス数が足りてない場合には、やってみると効果があるかもしれません(ないかもしれません)
という感じで、お休みの内職が終わりました。1日1回、定期的に実行するサーバーを確保しないといけないですね。Herokuかなぁ。
気が向いたらやること
- ローカルディスクに置いたサイトマップxmlから、URLを拾うようにする。カテゴリページなどのURLを効率よくインデックスさせるため
- 200回の制限を上手に緩和する策
- どこかの環境にデプロイ
参考資料
割り当てと料金
https://developers.google.com/search/apis/indexing-api/v3/quota-pricing
Google API Client Library
https://github.com/googleapis/google-api-php-client
追記
サンプルを追加
PHPのサンプルの別のバージョンを作りました。よかったらこちらを参考に。
個別の開発実績
IndexingAPIを使ったプログラム開発を有償で受けています。
少ないながら実績はありますので、ご相談ください。