WordPress ブログポストタイトルURLを抽出する(feat.Python&WordPress)
WordPressブログを運営していると、今まで作成したポストタイトルのURLを抽出することを一度は悩んだことはありませんか?
私がどのように文章を書いたのかも気になるし、パーマリンクなどのポストを修正すると、Googleサーチコンソールのような場所でurl検査メニューを使用して、ポストアドレスを再登録もしなければならないからです。
今回の記事では、Pythonスクリプトを使って ポストのタイトルとURLを自動的に抽出して エクセルファイルとして保存方法をお伝えしようと思いますので、以下の内容を見ながら、ゆっくりやってみてください。
VS codeのインストールと使用に適応する
まず、Pythonスクリプトを作成して実行するためVS codeをインストールします。 VS CODEのインストール - ウィンドウズ基準 ポストを通して、ぜひ参考にしてみてください。
VS codeを使うのが初めての方は少し慣れるため、下記のポストを読んでみて、一度実行してみてください。
Pythonのソースコードと実行する
Pythonのソースコードの修正
下記のコードをコピーしてVS codeに貼り付けて実行するだけです。 ただし、すぐ下の部分のアドレス(太字)だけを自分のものに変更すればOKです。
# 使用例 (secondlife.lol)
api_endpoint = 'https://secondlife.lol/wp-json/wp/v2′。
インポートリクエスト
json のインポート
from openpyxl インポートワークブック
インポート時間
def get_all_wordpress_posts(api_endpoint, auth=None):
headers = {'Accept': 'application/json'}。
if auth:
headers['Authorization'] = auth
posts = [].
page = 1
per_page = 10
であり、Trueである間
try:
response = requests.get(f"{api_endpoint}/posts?page={page}&per_page={per_page}", headers=headers)
response.raise_for_status()
page_posts = json.loads(response.content)
if not page_posts:
print(f"全てのページを処理しました。合計{len(posts)}個のポストを取得しました。")
break
posts.extend(page_posts)
page += 1
print(f"ページ{page-1}の処理完了。合計{len(posts)}個のポストを取得しました。")
time.sleep(1) # 各リクエストの間に1秒間待つ
except requests.exceptions.HTTPError as e:
if response.status_code == 400 and "rest_post_invalid_page_number" in response.text:
print(f"ページ{page}は無効です。 合計{len(posts)}個のポストを取得しました。")
else:
print(f"HTTPエラーが発生しました:{e}")
print(f"応答内容: {response.text}")
break
except Exception as e:
print(f"例外発生: {e}")
break
return posts
def save_to_excel(posts, filename="post_info.xlsx"):
wb = ワークブック()
ws = wb.active
ws.append(["Title", "URL"]) # ヘッダーを追加します。
for post in posts:
ws.append([post['title']['rendered'], post['link']])
wb.save(filename)
print(f"{filename}ファイルに{len(posts)}個のポスト情報を保存しました。")
#の例題を使う(secondlife.lol)
api_endpoint = 'https://secondlife.lol/wp-json/wp/v2'
auth = 'Basic '
print("ポストの取得開始...")
posts = get_all_wordpress_posts(api_endpoint, auth)
print(f"合計{len(posts)}個のポストを取得しました。")
if posts:
save_to_excel(posts)
else:
print("取り込んだポストがありません。")
WordPress ブログポストタイトルURL抽出実行結果
上のコードでは、実行するとページネーションで区切られたページを基準に繰り返しながら全てのポスト情報を取得します。 そして、下記のように順次進行された内容を表示します。 そして、最後にpost_info.xlsxファイルが生成されます。



注意事項があるなら、ソースコードファイル(post_list_url_r1.2.py)があるフォルダにポスト情報ファイル(post_info.xlsx)が生成されます。 だから、ウェブで資料をダウンロードするように慣性的にダウンロードフォルダのようなところで生成された結果ファイルを探してはいけません。
整理する
今回の記事では、Pythonを使用してWordPress APIと相互作用して、WordPressブログポストタイトル抽出、URL抽出を通じてExcelファイルに保存する方法を説明しました。
以上の過程を通じて、皆さんはブログを運営する際に管理次元の小さなツールを確保したと思います。
このポストに基づいて次のポストでは、Googleサーチコンソールのようなところに自動的にブログポストURLを登録する方法を共有してみます(本ポストに内容を盛り込もうとトライしてみましたが、簡単な作業ではないようです)。
secondlife.lolと一緒に、よりスマートなブログを作成してください。
参考までに、 すべてのURLをエクスポートというプラグインがあるのでこれを使っても良さそうです。
#ソースコード解析
ソースコードと主なコメント
インポートリクエスト
json のインポート
from openpyxl インポートワークブック
インポート時間
def get_all_wordpress_posts(api_endpoint, auth=None):
"""ページネーションを処理して全てのワードプレスポストを取得する関数""""
# APIリクエスト時に必要なヘッダーの設定
headers = {'Accept': 'application/json'}。
if auth:
headers['Authorization'] = auth
posts = [] # すべてのポストを保存するリスト
page = 1 #初期ページ番号
per_page = 10 # 一度にインポートするポスト数を10に設定する
while True:
try:
# APIエンドポイントにリクエストを送ってページ毎のポストを取得します。
response = requests.get(f"{api_endpoint}/posts?page={page}&per_page={per_page}", headers=headers)
response.raise_for_status() # リクエストが成功しなかった場合、例外を発生します。
# レスポンスデータをJSON形式に変換します。
page_posts = json.loads(response.content)
if not page_posts:
break # これ以上ポストがない場合は反復文を終了します。
# 読み込んだポストをリストに追加する
posts.extend(page_posts)
page += 1 # 次のページに移動する
print(f"ページ{page-1}の処理完了。合計{len(posts)}個のポストを取得しました。")
time.sleep(1) # 各リクエストの間に1秒待機 (サーバーの負担を減らすため)
except requests.exceptions.HTTPError as e:
# HTTPエラーが発生した時の処理
print(f"HTTPエラー発生: {e}")
print(f"応答内容: {response.text}")
break
except Exception as e:
# その他の例外発生時の処理
print(f"例外発生: {e}")
break
return posts # 全てのポストを返す
def save_to_excel(posts, filename="post_info.xlsx"):
"""ポストタイトルとURLをエクセルファイルに保存する関数""""
wb = Workbook() # 新しいエクセルワークブックを作成します。
ws = wb.active # アクティブなワークシートの選択
ws.append(["Title", "URL"]) # 最初の行にヘッダーを追加する
for post in posts:
# 各ポストのタイトルとURLをエクセルファイルに追加します。
ws.append([post['title']['rendered'], post['link']])
wb.save(filename) # エクセルファイルを保存します。
print(f"{filename}ファイルに{len(posts)}個のポスト情報保存完了。")
# 例題を使う(secondlife.lol)
api_endpoint = 'https://secondlife.lol/wp-json/wp/v2' # WordPress APIエンドポイント
auth = 'Basic ' # 必要な場合、認証情報を追加(Base64でエンコードされたユーザー名:パスワード)
print("ポスト取得開始...")
posts = get_all_wordpress_posts(api_endpoint, auth) # ポストのインポート関数を呼び出します。
print(f"合計{len(posts)}個のポストを取得しました。")
if posts:
save_to_excel(posts) #ポストがあったらエクセルファイルに保存します。
else:
print("インポートされたポストがありません。") # ポストがない場合はメッセージ出力詳細注釈説明
- モジュールインポート
リクエスト: HTTP リクエストを送信するためのモジュール。json: JSONデータを処理するためのモジュール。openpyxl.excelファイルを扱うためのモジュール:Excelファイルを扱うためのモジュール。時間: 時間関連機能を使用するためのモジュール。
- get_all_wordpress_posts 関数
api_endpointとauthを引数で受けてWordPress APIを使って全てのポストを取得する関数です。
- ヘッダー設定
headers = {'Accept': 'application/json'}。: JSON形式で応答を受け取るためのヘッダ設定。if auth:認証情報があればヘッダーに追加します。
- ポストデータを保存するリストとページの設定
posts = [].: ポストを保存する空のリスト。page = 1初期ページ番号。per_page = 10一度に取り込むポスト数。
- 反復文によるAPIリクエスト
をTrueにしながら:: 無限ループでページごとにポストを取り込む。response = requests.get(...): APIエンドポイントにリクエストを送信します。response.raise_for_status(): リクエストが失敗した場合、例外を発生させる。page_posts = json.loads(response.content)応答データをJSON形式に変換します。page_postsでない場合:これ以上ポストがない場合は、繰り返し文を終了します。posts.extend(page_posts): インポートしたポストをリストに追加。page += 1次のページへ移動します。time.sleep(1)各リクエストの間に1秒間待機します。
- 例外処理
except requests.exceptions.HTTPError as e:HTTPエラーが発生したときの処理。ただし、eとして例外を除く:その他例外発生時の処理。
- ポストデータを返す
リターンポスト: すべてのポストデータを返します。
- save_to_excel 関数
ポストとファイル名を引数として受け取り、ポストデータをエクセルファイルとして保存する関数。
- エクセルファイルの作成とデータ保存
wb = ワークブック(): 新しいエクセルワークブックの作成。ws = wb.active:アクティブなワークシートの選択。ws.append(["Title", "URL"])最初の行にヘッダーを追加します。を使用してポストに投稿します:: 各ポストのタイトルとURLをエクセルファイルに追加。wb.save(filename).excelファイル:エクセルファイル保存。
- メインコード
api_endpoint = 'https://secondlife.lol/wp-json/wp/v2': WordPress APIエンドポイントの設定。auth = '基本'必要に応じて認証情報を追加します。print("ポスト取得開始...")開始メッセージ出力。posts = get_all_wordpress_posts(api_endpoint, auth):ポストインポート関数呼び出し。print(f"合計{len(posts)}個のポストを取得しました。")ポスト数出力。if posts: save_to_excel(posts)ポストがあればエクセルファイルに保存。else: print("取得したポストがありません。")ポストがない場合はメッセージ出力。






