AMP の
妥当性検証 で
再クロールを
AMP(Accelerated Mobile Pages)URL API
と
これで、
結果を
前提
Python の version
AMP(Accelerated Mobile Pages)URL API
のbatchget
を
Python の
python -V -------------------------- Python 2.7.10 --------------------------
api key の 取得 と api の 有効化
batchget
の
api key をbatchget
を
PERMISSION_DENIED
が
{u'error': {u'code': 403, u'message': u'The request is missing a valid API key.', u'status': u'PERMISSION_DENIED'}}
以下の
1. API の 有効化
https://console.developers.google.com/ に
ライブラリから、Accelerated Mobile Pages (AMP) URL API
を
Accelerated Mobile Pages (AMP) URL API
API を
有効化する
2. API KEY の 発行 と referer の 設定
続いて、
認証情報を
作成する
認証情報を作成します。 Accelerated Mobile Pages (AMP) URL API
は、API KEY のみ 使えるようなので、
そちらを作成します。 refererの
設定
referer の設定を します。
python スクリプトからは、ここで 許可ドメインを refererに 設定します。
IPアドレス固定ならIPアドレスでもいいかもしれません。
Python スクリプト
以下、
batch_get_amp_url.py
こちらを# -*- coding: utf-8 - import requests from bs4 import BeautifulSoup import json try: # Python 3 from itertools import zip_longest except ImportError: # Python 2 from itertools import izip_longest as zip_longest SITEMAP_URL = "your_sitemap_url" BATCH_GET_API_URL = "https://acceleratedmobilepageurl.googleapis.com/v1/ampUrls:batchGet" API_KEY = "your_api_key" REFERER = "your.domain.com" LOOKUP_STRATEGY = "IN_INDEX_DOC" def execute(): soup = BeautifulSoup(requests.get(SITEMAP_URL).text, "xml") urls = [] for loc in soup.find_all('loc'): urls.append(loc.get_text()) collect_exists_urls = [] collect_url_errors = [] for splited_urls in zip_longest(*[iter(urls)] * 50): obj = {"urls": filter(lambda n: n is not None, splited_urls), "lookupStrategy": LOOKUP_STRATEGY} json_data = json.dumps(obj).encode("utf-8") headers = {'X-Goog-Api-Key': API_KEY, 'referer': REFERER} response = requests.post(BATCH_GET_API_URL, data=json_data, headers=headers) json_o = response.json() if json_o.get("ampUrls"): collect_exists_urls.extend(json_o.get("ampUrls")) if json_o.get("urlErrors"): collect_url_errors.extend(json_o.get("urlErrors")) print("### EXISTS URLS ### ") for idx, amp_url_dict in enumerate(collect_exists_urls): print("|[" + str(idx) + "]" + "|URL:" + amp_url_dict.get("originalUrl") + "|AMPURL:" + amp_url_dict.get("cdnAmpUrl") + "|") print("### ERROR URLS ### ") for idx, amp_url_dict in enumerate(collect_url_errors): error_code = amp_url_dict.get("errorCode") if error_code != "URL_IS_VALID_AMP": print("|[" + str(idx) + "]" + "|URL:" + amp_url_dict.get("originalUrl") + "|CODE:" + str(amp_url_dict.get("errorCode")) + "|") if __name__ == '__main__': execute()
実行すると、 以下のようなOUTPUT が 出力されます。 OUTPUT
### EXISTS URLS ### |[0]|URL:https://www.monotalk.xyz/blog/In-IntelliJ-IDEA-Could-not-find-executable-in-%60GAUGE_HOME%60,%60PATH%60-or-%60GAUGE_ROOT%60-occurred/|AMPURL:https://www-monotalk-xyz.cdn.ampproject.org/c/s/www.monotalk.xyz/blog/In-IntelliJ-IDEA-Could-not-find-executable-in-%60GAUGE_HOME%60,%60PATH%60-or-%60GAUGE_ROOT%60-occurred/| |[1]|URL:https://www.monotalk.xyz/blog/Try-Japanese-translation-of-rule-of-SonarQube/|AMPURL:https://www-monotalk-xyz.cdn.ampproject.org/c/s/www.monotalk.xyz/blog/Try-Japanese-translation-of-rule-of-SonarQube/| |[2]|URL:https://www.monotalk.xyz/blog/Wicket-AjaxButton-Controls-behavior-when-an-error-occurs-onSubmit-method/|AMPURL:https://www-monotalk-xyz.cdn.ampproject.org/c/s/www.monotalk.xyz/blog/Wicket-AjaxButton-Controls-behavior-when-an-error-occurs-onSubmit-method/| ### ERROR URLS ### |[0]|URL:https://www.monotalk.xyz/blog/execute_redpen_on_wercker/|CODE:URL_IS_INVALID_AMP| |[1]|URL:https://www.monotalk.xyz/blog/django-htmlmin-on-mezzanine/|CODE:NO_AMP_URL| |[2]|URL:https://www.monotalk.xyz/blog/rundeck-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E5%90%8D%E7%A7%B0%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%9F%E3%82%89%E5%8B%95%E3%81%8B%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F/|CODE:NO_AMP_URL| |[3]|URL:https://www.monotalk.xyz/blog/migrations-to-mezzanine-4.2.2-from-4.2.0/|CODE:NO_AMP_URL|
説明
batchget の
リクエストに 含める ことのできる URL の 上限に ついて
Link to AMP Content | Google AMP Cache | Google Developersに記載が ありますが、
上限は50 URLに なります。 sitemap上 50以上 url が 記載されていたので、
itertools.zip_longest
を使って、 要素数50 に リストを 分割して、 リクエストを 送付するように しています。 API KEY の
設定方法に ついて
Link to AMP Content | Google AMP Cache | Google Developersに記載が ありますが、
request ヘッダーにX-Goog-Api-Key: YOUR-DEVELOPER-KEY
の形式で 設定します。
スクリプトでは、requests
を使用したので 以下のように referer とともに 設定しました。 headers = {'X-Goog-Api-Key': API_KEY, 'referer': REFERER}
戻り値に
ついて
戻りはJSON電文で 返却されます。
ampUrls
には、正常に cacheされている URL情報 が 設定され、
urlErrors
には、cacheされていない、 または cacheされているが なんらかの 異常が ある URL情報が 設定されます。 errorCode に
ついて
urlErrors
に設定された エラー情報には、 errorCode が 設定されますが、
設定されるエラーコードは 以下に なります。
Method: ampUrls.batchGet | Google AMP Cache | Google Developers の説明を 参考に しています。 INPUT_URL_NOT_FOUND
要求されたURLが何らかの 理由で、 インデックスに 見つからない 場合、 設定されます。 NO_AMP_URL
要求されたURLに対応する AMP URLが 見つからなかった 場合、 設定されます。 APPLICATION_ERROR
サーバーで何らかの 種類の アプリケーションエラーが 発生した 場合、 設定されます。 URL_IS_VALID_AMP
要求されたURLが有効な AMP URLである 場合、 設定されます。 APIの 説明で 廃止されるとあり、 この エラーの 場合は、 実装上エラーと して 出力しないようにしました。 URL_IS_INVALID_AMP
リクエストURLに対応する AMP URLが 見つかったが、 有効な AMP HTMLではない 場合、 設定されます。
実際に スクリプトを 実行し、 その 結果を 元に 改善してみる
正常に
エラーに
INPUT_URL_NOT_FOUND
以下、
python2.7 batch_get_amp_url.py | grep INPUT_URL_NOT_FOUND | wc ------------------- 27 27 4319 -------------------
結構な
URL に
何故ここに、
NO_AMP_URL
以下、
python2.7 batch_get_amp_url.py | grep NO_AMP_URL | wc ------------------- 105 105 16661 -------------------
これも
batchget
api のLOOKUP_STRATEGY
オプションをFETCH_LIVE_DOC
に
[1] batchget のLOOKUP_STRATEGY
は、FETCH_LIVE_DOC
です。
これで、
再度、
python2.7 batch_get_amp_url.py | grep NO_AMP_URL | wc ------------------- 105 105 16661 -------------------
結果が
python2.7 batch_get_amp_url.py | grep INPUT_URL_NOT_FOUND | wc
を
結果は
------------------- 0 0 0 -------------------
LOOKUP_STRATEGY は、INPUT_URL_NOT_FOUND
と
APPLICATION_ERROR
以下、
特に
python2.7 batch_get_amp_url.py | grep APPLICATION_ERROR | wc ------------------- 0 0 0 -------------------
URL_IS_INVALID_AMP
以下、
python2.7 batch_get_amp_url.py | grep URL_IS_INVALID_AMP | wc ------------------- 32 32 4951 -------------------
32件あります。
update-pingを
を
cache の
curl --head "https://cdn.ampproject.org/update-ping/c/s/www.monotalk.xyz/blog/mezzanine-amp-%E5%AF%BE%E5%BF%9C%E3%81%AE%E3%83%86%E3%83%BC%E3%83%9E%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F" ---------------------------------------------- HTTP/1.1 204 No Content Content-Type: text/html; charset=ISO-8859-1 Strict-Transport-Security: max-age=31536000 X-Content-Type-Options: nosniff Date: Fri, 14 Jul 2017 09:50:16 GMT Server: sffe X-XSS-Protection: 1; mode=block Alt-Svc: quic=":443"; ma=2592000; v="39,38,37,36,35" ----------------------------------------------
以下、
python2.7 batch_get_amp_url.py | grep URL_IS_INVALID_AMP | wc ------------------- 32 32 4951 -------------------
即時だと、
しばらく
まとめ
以下、
batchget API の
実行には、 API KEY の 発行と、 referer、 IP アドレスなどでの 制限が 必要(いれる ことは 必須ではないが いれた ほうが いい)。 batchget API は
上限50URL までなので、 50以上の URL の 状況を 調べるには、 千切って 何回か リスエストを 投げる 必要が ある。 INPUT_URL_NOT_FOUND
エラーは、LOOKUP_STRATEGY
は、FETCH_LIVE_DOC
とする ことで 解消される。 URL_IS_INVALID_AMP
は、AMP Cache の 妥当性検証エラーと なっている。 元の AMP の エラーが 解消されても、
Cacheは残り続けるので、 update-ping で cache 削除を 促した ほうが いいと 思う。 (が、 即時反映は されない)。
参考
以下、
以上です。
コメント