【Python】スタバの店舗情報をスクレイピングしてcsvで出力する

PCのローカル環境にディレクトリを作成するところから、csvファイルを出力するというoutputするところまで、pythonを使ったスクレイピングの方法をステップ・バイ・ステップで丁寧に説明しています。

スクレイピングの対象はスタバの店舗情報です!

使用するライブラリはBeautifulSoupとSeleniumです。

BeautifulSoupのみで取得しようとしましたが、WebサイトがJavaScriptで作られているため、Seleniumの使用が必要でした。

前提

  • 使用環境:macOS
  • Python 3.x

実装

ステップ1: ディレクトリ(フォルダ)作成

自身のPCの好きな場所にプロジェクト用の新しいディレクトリ(フォルダ)を作成します。

mkdir cafe_scraping

作成したディレクトリに移動します。

cd cafe_scraping

このディレクトリで作業を行っていきます。

ステップ2: 仮想環境の設定(オプション)

プロジェクトごとに依存関係を管理するためPythonの仮想環境を作成します。

python3 -m venv cafescrapingenv

Pythonの標準ライブラリに含まれる venv モジュールを使って、名前が cafescrapingenv の仮想環境(virtual environment)を作成します。

コマンドの各部分説明
  • python3: Python 3.x のインタプリタを指定します。
  • -m: 次に指定されるモジュール名のスクリプトを実行するオプションです。
  • venv: 仮想環境を作成するためのPythonモジュールです。

仮想環境をアクティブにします。

source cafescrapingenv/bin/activate

which python(もしくはwhich python3)というコマンドにより、現在アクティブなPythonインタープリタがどれか確認できます。

ステップ3: 必要なライブラリのインストール

requestsbeautifulsoup4をインストールします。

pip install requests beautifulsoup4 selenium

ステップ4: Chrome WebDriverのインストール

自分が使用しているchromeのversionを確認しそれとversionが一致するdriverをダウンロードします。

ダウンロード先はこちら

ChromeDriver - WebDriver for Chrome - Downloads
Current Releases If you are using Chrome version 115 or newer, please consult the Chrome for Testing availability dashboard. This page provides convenient JSON ...

このインストールしたdriverは、後ほどコード内でpathを指定するので、わかりやすいところに保存しましょう。

例えば、’/Users/<user_name>/workspace/chromedriver’など。

ステップ5: Pythonスクリプトの作成

  1. VScodeなどのテキストエディタを開き、ステップ1で作成したディレクトリの中にPythonファイル main.py を作成します。
  2. 以下のサンプルコードをコピー&ペーストします。
from selenium import webdriver
from selenium.webdriver.chrome import service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import csv
import time

# chromedriverのパスを指定。ここはご自身のパスに合わせてください。
driver_path = '/Users/<user_name>/workspace/chromedriver'

# Chrome WebDriverの起動
chrome_service = service.Service(executable_path=driver_path)
driver = webdriver.Chrome(service=chrome_service)

# WebDriverが要素を見つけられるまでの待ち時間を指定(最大2秒)
driver.implicitly_wait(2)

# 対象のURLにブラウザで移動
print("URLにアクセス中...")
# 以下のURLは東京の店舗の場合です。
url = "https://store.starbucks.co.jp/pref/tokyo/"
driver.get(url)

# JavaScriptによる動的なコンテンツが読み込まれるのを待つ(5秒)
print("ページの読み込み中...")
time.sleep(5)

# クリックする「もっと見る」ボタンのXPATH
more_button_xpath = '//*[@id="vue-search"]/div[3]/div[1]/div/div[2]/div[1]/div[3]/div[2]/div[2]/button'

# 「もっと見る」ボタンがなくなるまでクリック
print("「もっと見る」ボタンをクリック中...")
while True:
    try:
        wait = WebDriverWait(driver, 10)
        more_button = wait.until(EC.element_to_be_clickable((By.XPATH, more_button_xpath)))
        driver.execute_script("arguments[0].scrollIntoView();", more_button)  # スクロールして要素を見える位置に持ってくる
        more_button.click()
        print("ボタンをクリックしました。次のボタンを待ちます...")
    except Exception as e:
        print(f"Stopped because of error: {e}")
        break



# ページの内容を取得して解析
print("ページの内容を取得中...")
page_source = driver.page_source

# BeautifulSoupオブジェクトを作成
soup = BeautifulSoup(page_source, 'html.parser')

# CSVファイルを作成(または上書き)
print("CSVファイルに書き込み中...")
with open('output.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    # ヘッダーを書き込む
    writer.writerow(['店舗名', '住所'])

    # 店舗名と住所を取得
    store_names = soup.find_all('p', class_='result__item__info__title')
    store_addresses = soup.find_all('p', class_='result__item__info__desc')

    # 店舗名と住所をCSVファイルに書き込む
    for name, address in zip(store_names, store_addresses):
        writer.writerow([name.text, address.text])

print("CSVへの書き込みが完了しました。")

# ブラウザを閉じる
driver.quit()

コードの説明

  • SeleniumとWebDriver: Seleniumはウェブブラウザの自動操作を可能にするライブラリです。WebDriverは、それを実際に動かすドライバーです。
  • WebDriverWaitとexpected_conditions: これらはSeleniumが提供する待機処理のためのクラスとモジュールです。特定の条件が満たされるまで(例えば、ボタンがクリック可能になるまで)プログラムの実行を一時停止することができます。
  • BeautifulSoup: HTMLやXMLを解析するためのPythonライブラリです。ページから特定の要素を簡単に取り出すことができます。
  • CSV: Comma-Separated Valuesの略で、テキストデータを表形式で保存するためのフォーマットです。Excelなどで簡単に読み込むことができます。
プログラムの流れ
  1. Chrome WebDriverを起動して、指定のURLに移動します。
  2. 「もっと見る」ボタンが表示されなくなるまでクリックを続けます。
  3. 最後に、ページのHTMLをBeautifulSoupで解析して店舗情報を取得し、CSVファイルに保存します。
エラーハンドリング

コード内でtry-exceptブロックを使用しています。これは、エラーが発生した場合でもプログラムがクラッシュすることなく、エラーメッセージを出力して終了するようにするためです。

その他
  • time.sleep()関数は、プログラムの実行を一時停止します。これは、ページの読み込みを待つためや、連続的なリクエストによるサーバーへの負荷を防ぐために使用されます。ただし、待ち時間を長くすると、全体の処理時間も長くなってしまうので注意が必要です。
  • driver.quit()は、すべてのウィンドウを閉じてWebDriverセッションを終了します。これがないと、プログラムが終了してもブラウザのウィンドウが開いたままになってしまいます。

ステップ6: スクリプトの実行

  1. Terminal(ターミナル)で先ほど作成したPythonファイルがあるディレクトリに移動します。
  2. 以下コマンドを実行します。
python main.py

するとURLで指定した画面が立ち上がり、動き出します。

この動作が終わるとoutput.csvというCSVファイルが生成され、抽出したデータが保存されます。

上記コマンド実行時に、以下のような警告文が出た場合は、PCの設定で許可してあげる必要があります。

macOS cannot verify that this app is free from malware.

注意:Webスクレイピングを行う際は、対象のWebサイトの利用規約やロボット排除プロトコル(robots.txt)を確認して、違反しないように注意してください。

コメント