Python × Selenium で食べログを全ページ自動スクレイピング|ページネーション対応の実践方法

動的なWebサイトから情報を取得する際、1ページ目だけでなく「2ページ目以降」を含めて自動で巡回・収集したいケースは多々あります。
この記事では、PythonとSeleniumを使って、食べログのような複数ページにまたがるデータを全件取得する方法を解説します。


今回のゴール

  • 食べログ 東村山市の店舗一覧(https://tabelog.com/tokyo/C13213/rstLst/)を対象に
  • 店名と詳細ページURLを全ページから自動取得
  • CSV形式で保存
  • 「次へ」リンク(ページネーション)に対応
  • タイムアウトや読み込み失敗に強い構成を実現

1. 前提条件:Selenium の環境構築

事前に以下がインストールされている必要があります(macOS環境):

pip3 install selenium pandas
brew install --cask google-chrome
brew install chromedriver

詳しい環境構築手順は、別記事「Python × Seleniumで始めるスクレイピング|macOSでの環境構築から動作確認まで」を参照してください。


2. ページネーションの構造を理解する

食べログのページャーは以下のようなHTMLで構成されています:

<a href="https://tabelog.com/tokyo/C13213/rstLst/2/" rel="next">次の20件</a>

ポイント:

  • 「次へ」ボタンは rel="next" 属性付きの <a> タグ
  • この属性をCSSセレクタで指定すれば、安定してリンクを取得できる

3. ページネーションに対応した完全スクリプト

以下のコードでは、全ページを巡回しながら「店名」と「店舗詳細ページURL」をCSVとして保存します。

スクリプト:tabelog_scrape_paginate.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, TimeoutException
import time
import pandas as pd

# --- Selenium設定 ---
options = Options()
options.add_argument("start-maximized")
options.add_argument("user-agent=Mozilla/5.0")
options.page_load_strategy = "eager"  # ページ描画完了前に処理を進める

service = Service("/usr/local/bin/chromedriver")  # パスは環境に応じて調整
driver = webdriver.Chrome(service=service, options=options)
driver.set_page_load_timeout(30)

# --- 対象URL ---
url = "https://tabelog.com/tokyo/C13213/rstLst/"
driver.get(url)
time.sleep(3)

results = []
page = 1

while True:
    print(f"ページ {page} を処理中...")

    # 店舗リンクの取得
    shops = driver.find_elements(By.CSS_SELECTOR, "a.list-rst__rst-name-target")
    for shop in shops:
        name = shop.text.strip()
        link = shop.get_attribute("href")
        results.append({"店名": name, "URL": link})

    # 「次へ」リンクを取得して遷移
    try:
        next_link = driver.find_element(By.CSS_SELECTOR, 'a[rel="next"]')
        next_url = next_link.get_attribute("href")
        print(f"次のページへ: {next_url}")
        try:
            driver.get(next_url)
            page += 1
            time.sleep(3)
        except Exception as e:
            print(f"次ページの読み込みに失敗しました: {e}")
            break
    except NoSuchElementException:
        print("最終ページに到達しました")
        break

# --- CSV保存 ---
df = pd.DataFrame(results)
df.to_csv("tabelog_higashimurayama_all.csv", index=False, encoding="utf-8-sig")

print(f"{len(results)} 件の店舗を取得しました")
driver.quit()

4. 実行結果と出力ファイル

コマンド実行:

python3 tabelog_scrape_paginate.py

出力例(抜粋):

ページ 1 を処理中...
次のページへ: https://tabelog.com/tokyo/C13213/rstLst/2/
...
最終ページに到達しました
615 件の店舗を取得しました

生成されるファイル:

tabelog_higashimurayama_all.csv

内容(例):

店名URL
串かつ でんがな 秋津店https://tabelog.com/tokyo/A1328/A132806/13155695/
和風地酒居酒屋 蔵馬https://tabelog.com/tokyo/A1328/A132806/13196446/

ポイントまとめ

工夫ポイント解説
rel="next"「次のページ」ボタンを安定取得できるセレクタ
"eager"戦略ページ内の画像や広告の読み込みを待たずに処理継続
例外処理付き driver.get()タイムアウト時にスクリプトを安全終了
CSV出力形式UTF-8(BOM付き)でExcelでも文字化けしにくい

まとめ

このページネーション対応版スクリプトを使えば、動的なリストページを持つWebサイトでも全件の情報を自動取得する実践的なスクレイピングが可能になります。
定期的な情報収集やデータ活用、業務の自動化にもぜひお役立てください。

コメント

タイトルとURLをコピーしました