自分が投稿した記事の情報をまとめて閲覧したいことってあると思います。PythonでAPIを使って情報を取得してみます。この記事では、投稿記事と固定ページの取得方法をご紹介します。
投稿の取得
API仕様
投稿情報取得のAPI名は posts です。
APIの仕様を見てみます。
https://developer.wordpress.org/rest-api/reference/posts/#list-posts
投稿の情報は多くなってくるとページネーションで分割されるので、page番号を引数にして取得します。per_pageはデフォルトは10ですが、1~100まで設定できます。
https://developer.wordpress.org/rest-api/using-the-rest-api/pagination/
APIの仕様の一部を引用しておきます。
APIで投稿情報を取得する
コードを書いてみると長くなったので、APIを呼ぶ部分は関数化しました。pageを引数にして、投稿情報とエラーを戻り値としています。
import requests from urllib.parse import urljoin def wp_get_posts(page=1): url_base = 'https://kamiki.blog/' url = urljoin(url_base, 'wp-json/wp/v2/posts/') params = { 'page': page, } time.sleep(1) res = requests.get(url, params=params) err = res.status_code print(res) posts = res.json() return posts, err
では、実際にAPIを使って投稿情報を取得してみましょう。引数のpageをインクリメントしながら作成した関数をコールし、全部取得できたら無限ループを抜けるようにしています。
import pandas as pd import json # 取得した情報を入れる箱。 df = pd.DataFrame() # pageは1スタート。 page = 1 while True: # 投稿情報を取得する。 posts, err = wp_get_posts(page) if err != 200: # 投稿を取得できないpageになると、エラー(400 Bad Request)が返る。 # エラーでない場合は、err=200となる。 # エラーが発生したら、投稿を全て取得できているので、抜ける。 print(json.dumps(posts, indent=4)) break for data in posts: info = {} info.update({'id_post': data['id']}) info.update({'title': data['title']['rendered']}) info.update({'url': data['link']}) info.update({'date_post': data['date']}) info.update({'date_modified': data['modified']}) # 投稿を保存する。 df_add = pd.DataFrame(data=info, index=[0]) df = pd.concat([df, df_add], axis='index') # 重複するデータを削除する。 df = df.drop_duplicates(subset='id_post', keep='first') # 投稿日でソートする。 df = df.sort_values(by=['date_post'], ascending=False) # Indexの通し番号をリセットする。 df = df.reset_index(drop=True) print(f'page:{page} len(posts):{len(posts)}') # pageをインクリメントして、次の投稿情報を取得する。 page += 1 print(df['title'])
上のコードを実行すると、ターミナルに以下のように出力されます。この時点では82記事ほど投稿できているようです。
0 pandas.Timestampの時刻の切り捨て・切り上げ 1 Pythonでlist型やdict型のデータをDataFrameに変換する 2 WordPressのブロックエディタで画像ブロックのスタイルを登録して呼び出して使う 3 WordPressのブロックエディタでリストの中にリストを入れる方法と装飾のやり方 4 WordPressの前の記事と次の記事のリンクを現在の記事と同じカテゴリーにする ... 77 WordPress自動投稿テスト(アイキャッチ付き) 78 PythonでWordPressにアイキャッチ付きの記事を自動投稿する 79 PythonでWordPressのメディアライブラリに画像を自動アップロードする 80 WordPress自動投稿テスト 81 PythonでWordPressに記事を自動投稿する Name: title, Length: 82, dtype: object
固定ページの取得
API仕様
固定ページ取得のAPI名は pages です。
API仕様はこちらです。
https://developer.wordpress.org/rest-api/reference/pages/#list-pages
仕様はpostsとほぼ同じなので、実際にコードを書いてみます。ただ、上のコードとほぼ同じコードになっています。変更点はpostをpageに変えているぐらいです。
APIで固定ページの情報を取得する
固定ページの情報を取得するコードは関数化しました。
import requests from urllib.parse import urljoin import time def wp_get_pages(page=1): url_base = 'https://kamiki.blog/' url = urljoin(url_base, 'wp-json/wp/v2/pages/') params = { 'page': page, } time.sleep(1) res = requests.get(url, params=params) err = res.status_code print(res) pages = res.json() return pages, err
固定ページ情報を取得し、情報として保存するコードです。
import pandas as pd import json # 取得した情報を入れる箱。 df = pd.DataFrame() # pageは1スタート。 page = 1 while True: # 固定ページの情報を取得する。 pages, err = wp_get_pages(page) if err != 200: # 情報を取得できないpageになると、エラー(400 Bad Request)が返る。 # エラーでない場合は、err=200となる。 # エラーが発生したら、情報を全て取得できているので、抜ける。 print(json.dumps(pages, indent=4)) break for data in pages: info = {} info.update({'id_page': data['id']}) info.update({'title': data['title']['rendered']}) info.update({'url': data['link']}) info.update({'date_open': data['date']}) info.update({'date_modified': data['modified']}) # 取得した情報を保存する。 df_add = pd.DataFrame(data=info, index=[0]) df = pd.concat([df, df_add], axis='index') # 重複するデータを削除する。 df = df.drop_duplicates(subset='id_page', keep='first') # 公開日でソートする。 df = df.sort_values(by=['date_open'], ascending=False) # Indexの通し番号をリセットする。 df = df.reset_index(drop=True) print(f'page:{page} len(pages):{len(pages)}') # pageをインクリメントして、次の情報を取得する。 page += 1 print(df['title'])
上のコードを実行すると、固定ページのタイトルが表示されます。
0 WordPress固定ページ自動投稿テスト(改) 1 運営者情報 2 お問い合わせ 3 プライバシーポリシー Name: title, dtype: object