どうも
どうも、み・な・さ・ま!こんちくわ!さて、今回も全国の中年引きニートの皆さまのため、若年引きニートのわたくしが、恐らく有益だろう情報を、パッと見の雑さと裏腹にそれなりの労力をかけて書き連ねていきます。
まとめてインデックス申請したい
以前の記事で、PythonからIndexing APIを使ったのですが、今回はその応用でWordpress の Rest API を活用して、ブログ内の記事を一括でインデックス申請したいと思います!😍
流れ
- REST APIの導入
- REST APIから記事リンクの取得
- Indexing APIでリクエスト
REST APIの導入
wordpressのサイドバーにて、「プラグイン -> 新規追加」から検索窓で「REST API」と打てばひょいっと出てくるので、インストールして有効化。
REST APIで記事リンクの取得
ここからは、ドキュメントを参考に進めます。細かいことはドキュメントを見ればわかります。
記事のデータを取得
まずは記事のデータを取ります。細かいことはこちらに全て載っています。
では早速コードを貼って解説します。
import requests import urllib.parse as up import json GET_POSTS_PATH="wp-json/wp/v2/posts" HEADERS={'User-Agent': 'Mozilla/4.5 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4517.159 Safari/537.36'} def getPosts(url,page=1,params={}): params["page"]=page url=up.urljoin(url,GET_POSTS_PATH) res=requests.get(url,headers=HEADERS,params=params) if res.status_code // 100 != 2: return for data in json.loads(res.text): yield data
引数
引数 | 意味 |
---|---|
url | ブログのURL |
page | 取りたいページ |
params | REST APIにリクエストする際の引数。ドキュメントを参照。 |
paramsとはREST APIにリクエストする際の引数で、色々あるのですが、主なものを挙げると
引数 | 意味 |
---|---|
per_page | データの数 |
search | 検索文字列。ブログ内の検索窓に打つときと同じように返る。 |
offset | オフセット。何番目から始めるか。 |
categories | カテゴリーID |
orderby | 並び順。 author,date,id,rand,…… など。 |
categoriesのカテゴリーIDとは、「ゲーム、ブログ、…」のようなカテゴリー名ではなく、数字の番号なんで、一工夫必要です。少し具体的にいえば、REST APIのカテゴリー検索でとります。
試す
一応試します。さっきのつづき🤩
url="https://torino2019.com/fanzacapa/" for data in getPosts(url): print(data)
ピピピピピピ……
'id': 1612997243, 'date': '2022-03-12T18:10:48', 'date_gmt': '2022-03-12T09:10:48', 'guid': {'rendered': 'https://torino2019.com/fanzacapa/2022/03/12/%e7%b6%9a%e3%83%bb%e7%b4%a0%e4%ba%ba%e5%a8%98%e3%80%81%e3%81%8a%e8%b2%b8%e3%81%97%e3%81%97%e3%81%be%e3%81%99%e3%80%82-vol-30-%e3%80%90mgs%e3%81%a0%e3%81%91%e3%81%ae%e7%89%b9%e5%85%b8%e6%98%a0%e5%83%8f/'}, 'm ............... : : :
記事リンクの取得
data["link"]
でとれます。
url="https://torino2019.com/fanzacapa/" for data in getPosts(url): link=data["link"] print(link)
じ、じ、じ、… 実行!
https://torino2019.com/fanzacapa/2022/03/12/%e7%b6%9a%e3%83%bb%e7%b4%a0%e4%ba%ba%e5%a8%98%e3%80%81%e3%81%8a%e8%b2%b8%e3%81%97%e3%81%97%e3%81%be%e3%81%99%e3%80%82-vol-30-%e3%80%90mgs%e3%81%a0%e3%81%91%e3%81%ae%e7%89%b9%e5%85%b8%e6%98%a0%e5%83%8f/ : : :
インデックスのリクエスト
前の記事をご覧ください。
まとめる
import urllib.parse as up import requests import json import time from myutil import site from oauth2client.service_account import ServiceAccountCredentials import httplib2 import json import urllib.parse as up GET_POSTS_PATH="wp-json/wp/v2/posts" def getPosts(url,page=1,params={}): params["page"]=page url=up.urljoin(url,GET_POSTS_PATH) res=requests.get(url,headers=site.HEADERS,params=params) if res.status_code // 100 != 2: return for data in json.loads(res.text): yield data SCOPES = [ "https://www.googleapis.com/auth/indexing" ] ENDPOINT = "https://indexing.googleapis.com/v3/urlNotifications:publish" META_ENDPOINT="https://indexing.googleapis.com/v3/urlNotifications/metadata" def get_client(json_file): credentials = ServiceAccountCredentials.from_json_keyfile_name(json_file, scopes=SCOPES) return credentials.authorize(httplib2.Http()) def update(client,url): content ={ "url":url, "type": "URL_UPDATED" } content=json.dumps(content) return client.request(ENDPOINT, method="POST", body=content) def updates(client,urls): for url in urls: update(client,url) def get_meta(client,url): endpoint=META_ENDPOINT+"?url="+url return client.request(endpoint, method="GET") if __name__ == "__main__": url="https://torino2019.com/fanzacapa/" JSON_FILE=r"C:\Users\tetsu\Downloads\phrasal-faculty-287800-e3434667778b.json" client=get_client(JSON_FILE) for data in getPosts(url): link=data["link"] res,content=update(client,link) print(content) time.sleep(1)
updates(client,map(lambda data:data["link"],getPosts(url)))
の方がシュッとしてるかも。どこか無理してる感はありますが。(笑)
おわりに
実は他にエロブログを運営してるのですが、というかこのブログは運営というほどではないですが(笑)、大規模なせいか質が悪いのか中々インデックスされず、裏ワザ的にこの方法を試すと、すぐにインデックされました。(笑) 多分 Indexing APIは多少の技術と根気が要るので、それで選別してるんですかね。😋まあお疲れさまでした。お役に立てば幸いです。
コメント