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日 新規作成

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です