非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【Python】WordPressから投稿データを取得しCSVに書き出す方法

   

今回は、Pythonを使ってWordPressサイトから投稿データを取得し、カテゴリ情報とともにCSVファイルに書き出す方法を紹介します。APIを活用することで効率的にデータを収集できます。

当初はこれをGoogle Apps Scriptで作ろうと思ったのですが処理時間に制約があり断念しました。割と処理時間がかかります。

ソースコード

import requests
import time
import csv

# WordPressのAPIエンドポイント
wordpress_url = 'http://example.com/wp-json/wp/v2/posts'
category_base_url = 'http://example.com/wp-json/wp/v2/categories/'

# CSVファイルを開く(追記モード)
csv_file = open('wordpress_posts.csv', mode='w', newline='', encoding='utf-8')
csv_writer = csv.writer(csv_file)

# ヘッダー行を追加
csv_writer.writerow(["Title", "URL", "Categories"])

def get_category_name(category_id):
    """カテゴリIDからカテゴリ名を取得する関数"""
    try:
        category_response = requests.get(f'{category_base_url}{category_id}')
        category_data = category_response.json()
        return category_data.get('name', 'Unknown')
    except Exception as e:
        print(f"Error fetching category {category_id}: {e}")
        return 'Unknown'

def get_all_posts():
    """全ての投稿データを取得し、CSVに書き込む関数"""
    page = 1
    while True:
        try:
            response = requests.get(f'{wordpress_url}?page={page}')
            if response.status_code == 404 or not response.json():
                break  # ページが存在しない場合終了
            posts = response.json()

            # 投稿ごとに処理
            for post in posts:
                title = post['title']['rendered']
                url = post['link']
                categories = post['categories']
                
                # カテゴリIDからカテゴリ名を取得
                category_names = [get_category_name(cat_id) for cat_id in categories]
                category_names_str = ', '.join(category_names)

                # CSVに書き込み
                csv_writer.writerow([title, url, category_names_str])

            print(f"Page {page} processed.")
            page += 1
            time.sleep(1)  # サーバーに負荷をかけないように1秒待機

        except Exception as e:
            print(f"Error fetching page {page}: {e}")
            break

    print("Data saved to wordpress_posts.csv")

if __name__ == "__main__":
    get_all_posts()
    csv_file.close()
 

 

解説

CSVファイルへの書き込み:

open(‘wordpress_posts.csv’, mode=’w’, newline=”, encoding=’utf-8′) でCSVファイルを作成・開きます。mode=’w’ で書き込みモードを指定し、newline=” で改行を防止、encoding=’utf-8′ でUTF-8エンコードにします。

csv.writer でCSVファイルに書き込むためのライターオブジェクトを作成します。

ヘッダー行として「Title(タイトル)」「URL」「Categories(カテゴリ)」の3列を追加します。

カテゴリの取得:

投稿に含まれるカテゴリIDをもとに、カテゴリ名をAPIから取得します。複数のカテゴリがある場合は、カンマ区切りでカテゴリ名を連結し、CSVファイルに書き込みます。

ページごとの投稿取得:

投稿データはページ単位で取得し、各ページごとにデータをCSVに追記します。ページのデータが存在しない場合(404エラーや空のデータが返る場合)、ループを終了します。

エラーハンドリング:

カテゴリの取得や投稿データの取得時にエラーが発生した場合は、それぞれのエラーを表示し、処理を続行します。

 

実行結果

CSVに出力した結果が以下の通り。VSCodeの拡張機能「Excel Viewer」で表示させています。

 

この手法を使えば手間なくWordPressの投稿データを整理できデータ分析やバックアップに役立ちます。Pythonの強力なライブラリを駆使し効率的なデータ収集を実現しましょう。

 

スポンサーリンク

 - Python