Python で WordPress の記事タイトルを取得 #BeautifulSoup
Python で WordPress の記事タイトルを取得するプログラムを作成しました。
プログラムでは,BeautifulSoup,requests,pandas,time のライブラリを利用しています。
以前,Hatena Blog の記事 URL を使って,記事タイトルを Web スクレイピングで取得しましたが,今回は WordPress の記事を対象としています。
WordPress の記事タイトルを確認
WordPress の記事タイトルが記載された HTML を確認します。
WordPress の記事タイトルは,クラスが entry-title の h1 タグに記載されています(実際には,h1 タグの中に改行やタブが含まれています)。
<h1 class="entry-title">Python で Hatena Blog のタイトル取得</h1>
Python プログラム
ライブラリ読み込み
プログラムで利用するライブラリを読み込みます。
from bs4 import BeautifulSoup
import requests # HTTP 通信
import pandas as pd
import time
データ読み込みと前処理
データを読み込みます。今回用いるデータは,Google Search Console よりダウンロードしたページ.csv です。ページ.csv には,1) 上位のページの URL,2) クリック数,3) 表示回数,4) CTR,5) 掲載順位が含まれています。
CTR は,単位 % を含む文字列として読み込まれているので,% を削除し,数値に変換しています。
# データの読み込みと前処理
df = pd.read_csv('./csv/ページ.csv', usecols=['上位のページ','クリック数','表示回数','CTR','掲載順位'], encoding='utf-8')
# CTR の単位 "%" を削除し,数値に変換
df['CTR'] = df['CTR'].str.replace('%', '').astype(float)
HTML要素内のテキストをクリーニングするヘルパー関数
WordPress のタイトル要素には,改行やタブが含まれるため,クリーニングする関数を用意します。
def clean_text(text):
return text.replace('\n','').replace('\t','')
指定された URL からページタイトルを取得する関数
指定された URL からページタイトルを取得する関数を用意します。
def get_page_title(url):
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
title = soup.find("h1", class_="entry-title")
return clean_text(title.contents[0]) if title else "タイトル不明"
クリック数トップ n のページタイトルを表示
クリック数トップ n のページタイトルを表示します。
サーバへの負荷を減らすため,1 秒ごとに実行しています (time.sleep(1))。
n = 10 # トップ n のページを表示する
c_url = df['上位のページ'].head(n)
print(f"クリック数トップ {n}")
for i, url in enumerate(c_url, 1):
title = get_page_title(url)
print(f"<li>第{i}位:<a href=\"{url}\">{title}</a> : {df['クリック数'].values[i-1]}/{df['表示回数'].values[i-1]} ({df['CTR'].values[i-1]}%,掲載順位{df['掲載順位'].values[i-1]}位)</li>")
time.sleep(1)
出力結果
上記の Python プログラムを実行した結果を示します。クリック数トップ 10 のページのタイトルが取得できました。
WordPress へ掲載することを考慮し,HTML で出力しています。
<li>第1位:<a href="https://masassiah.xyz/archives/1295">令和5年度 秋期 プロジェクトマネージャ試験に合格しました</a> : 267/3466 (7.7%,掲載順 位9.78位)</li>
<li>第2位:<a href="https://masassiah.xyz/archives/542">応用情報技術者試験の難易度</a> : 173/7926 (2.18%,掲載順位24.27位)</li>
<li>第3位:<a href="https://masassiah.xyz/archives/355">システム開発におけるモデル化</a> : 130/4645 (2.8%,掲載順位10.76位)</li>
<li>第4位:<a href="https://masassiah.xyz/archives/370">モジュールの独立性</a> : 109/4416 (2.47%,掲載順位9.37位)</li>
<li>第5位:<a href="https://masassiah.xyz/archives/319">システムアーキテクト試験 午後Ⅱ 問題</a> : 82/1671 (4.91%,掲載順位17.02位)</li>
<li>第6位:<a href="https://masassiah.xyz/archives/1413">【Python】FDTD 法で z 方向を進む 1 次元の電磁波解析</a> : 58/665 (8.72%,掲載順位8.22位)</li>
<li>第7位:<a href="https://masassiah.xyz/archives/120">プロジェクト憲章</a> : 53/4734 (1.12%,掲載順位23.96位)</li>
<li>第8位:<a href="https://masassiah.xyz/archives/668">Python で時系列データのグラフ化</a> : 51/1038 (4.91%,掲載順位12.34位)</li>
<li>第9位:<a href="https://masassiah.xyz/archives/1657">システム監査技術者試験 午後Ⅱ 問題の対策</a> : 47/867 (5.42%,掲載順位31.17位)</li>
<li>第10位:<a href="https://masassiah.xyz/archives/866">アムダールの法則</a> : 45/2460 (1.83%,掲載順位9.61位)</li>
更新履歴
- 2025年1月11日 新規作成