【Python】スタバの店舗情報を検索して取得する

CODE,Python

Pythonでスタバの店情報を検索して取得するスクリプトです。

処理内容 ①検索の実行
②検索結果の表示
③表示された情報から店舗詳細を取得
④取得した情報を都道府県ごとに外部ファイルへ出力

スターバックスの店舗検索機能

スターバックスのWebサイト(https://store.starbucks.co.jp/)では全国の店舗情報が検索できます。

例えば"東京都"で検索した場合、以下のような検索結果が表示されます。

この検索作業と店舗情報の取得、加えて情報の出力をPythonで実行してみましょう。

PythonによるWebスクレイピングツールの作成

店舗情報を取得するPythonのコードです。
ブラウザ(Chrome)から都道府県名で検索を実行し、情報の取得と出力を繰り返します。

環境に合わせて以下を修正してください。

  • ChromeDriverのパス
  • ブラウザの動作を確認したい場合は20行目のヘッドレスモードのオプションをコメントアウト
  • for todofuken_id in range(1, 48): だと全国が対象になり時間がかかりますので範囲を絞っています
# ----------------------------------------
# モジュールのインポート
# ----------------------------------------
from selenium import webdriver
import time
import math
import tkinter as tk
from tkinter import messagebox

# メッセージボックス用の設定
root = tk.Tk()
root.withdraw()


# ----------------------------------------
# ChromeDriverの設定
# ----------------------------------------
cd_path = 'C:\\ChromeDriver\\chromedriver.exe'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation', 'enable-logging'])


# ----------------------------------------
# 処理開始
# ----------------------------------------
print('>>>処理開始')
driver = webdriver.Chrome(cd_path, options=chrome_options)
driver.maximize_window()
driver.implicitly_wait(10)
driver.get('https://store.starbucks.co.jp/')

for todofuken_id in range(1, 2):    # ここでは北海道のみが対象となる設定
    todofuken_xpath = '//*[@id="search_section"]/div[2]/div[1]/div[2]/ul/li[' + str(todofuken_id) + ']/a'

    # 画面遷移
    todofuken_name = driver.find_element_by_xpath(todofuken_xpath).text
    print(' >>処理対象:' + todofuken_name)
    todofuken_chars = len(todofuken_name)
    driver.find_element_by_xpath(todofuken_xpath).click()
    time.sleep(3)   # 後続処理を安定させるためのウェイト

    # 遷移先での情報取得前処理
    result_xpath = '//*[@id="result_title"]'
    result_text = driver.find_element_by_xpath(result_xpath).text
    result_cnt = int(result_text[13 + todofuken_chars:-3])

    # 「もっと見る」ボタンを押せるだけ押す
    if result_cnt > 10:
        push_cnt = math.ceil((result_cnt - 10) / 10)
        more_xpath = '//*[@id="moreList"]'

        for i in range(push_cnt):
            driver.find_element_by_xpath(more_xpath).click()
            time.sleep(1)

    # 店舗情報の取得と出力処理
    print('  >書込処理開始:' + todofuken_name)
    with open(todofuken_name + '.txt', 'w', encoding='utf8') as f:
        i = 0
        for i in range(result_cnt):
            # 要素が画面外にあるとクリックできないのでスクリプト実行で対応する
            driver.execute_script('arguments[0].click();', driver.find_elements_by_class_name('item')[i])
            time.sleep(0.5)
            output_text = driver.find_elements_by_class_name('item')[i].text
            f.write('--------------------\n')
            f.write(output_text[:-2])
    print('  <書込処理終了:' + todofuken_name)

    driver.get('https://store.starbucks.co.jp/')
    time.sleep(3)


# ----------------------------------------
# 処理終了
# ----------------------------------------
print('<<<処理終了')
messagebox.showinfo('処理終了', '処理が終了しました')
driver.quit()

実行結果

実行すると、都道府県ごとに以下のようなテキストファイルを出力します。

参考書

より多彩な処理をするなら。

CODE,Python

Posted by junichi