PythonでWordPressの投稿と固定ページの情報を取得する

自分が投稿した記事の情報をまとめて閲覧したいことってあると思います。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の仕様の一部を引用しておきます。

出典: wordpress.org

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