【Python】スタバの店舗情報をテキストファイルに書き出す

2024年2月17日Python,Selenium

処理概要

スターバックスの店舗情報をテキストファイルに書き出す


処理内容

  1. スターバックスのWebサイトを開く
  2. 各都道府県を選択する
  3. 検索結果に表示される店舗情報を取得する
  4. 取得した情報をテキストファイルに出力する

対象URL

出力ファイル

  • ファイル名:都道府県名.txt
  • 実行ディレクトリに出力される
  • ファイルは都道府県ごとに出力される

対象都道府県の設定内容

  • todofuken_id に設定した数値の範囲で指定する
  • 北から順に 1:北海道 ~ 47:沖縄 が設定されている
  • range(1, 48) で全都道府県が対象になる

コード

import re
import time
import tkinter.messagebox

import chromedriver_binary_sync
from selenium import webdriver
from selenium.webdriver.chrome import service as fs
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select

# ========================================
# 初期処理
# ========================================
# メッセージボックス用の設定
root = tkinter.Tk()
root.withdraw()

# ChromeDriverをダウンロードしてパスを定数に格納する
CHROMEDRIVER = chromedriver_binary_sync.download(download_dir='chromedriver')
chrome_service = fs.Service(executable_path=CHROMEDRIVER)

# オプションの設定
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')   # 画面非表示推奨
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation', 'enable-logging'])

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

# 画面遷移後に都道府県セレクトボックスの要素を取得
time.sleep(3)
selectbox = driver.find_element(By.ID, 'selectbox')

for todofuken_id in range(1, 2):    # ここでは北海道のみが対象となる設定
    Select(selectbox).select_by_value(str(todofuken_id))
    time.sleep(3)

    # 都道府県選択後の情報取得前処理
    todofuken_id += 1
    target = driver.find_element(By.XPATH, f'//*[@id="selectbox"]/option[{todofuken_id}]').text
    print('>>処理対象:' + target)

    todofuken_name = re.sub('( \(+[0-9]+\))', '', target)
    result_text = driver.find_element(By.XPATH, '//*[@id="vue-search"]/div[3]/div[1]/div/div[2]/div[1]/div[3]/div[1]').text
    result_cnt = int(result_text.replace('件', ''))

    # 「もっと見る」ボタンを押せるだけ押しておく
    more_xpath = '//*[@id="vue-search"]/div[3]/div[1]/div/div[2]/div[1]/div[3]/div[2]/div[2]/button'
    try:
        more_button_cnt = len(driver.find_elements(By.XPATH, more_xpath))
    except:
        more_button_cnt = 0

    while more_button_cnt > 0:
        driver.find_element(By.XPATH, more_xpath).click()
        time.sleep(1)
        try:
            more_button_cnt = len(driver.find_elements(By.XPATH, more_xpath))
        except:
            more_button_cnt = 0

    # ------------------------------
    # 店舗情報の取得と出力処理
    # ------------------------------
    print('>>>書込処理開始')
    with open(todofuken_name + '.txt', mode='w', encoding='utf-8') as f:
        i = 1
        for i in range(1, result_cnt + 1):
            output_text = driver.find_element(By.XPATH, f'//*[@id="store-list"]/li[{i}]/div').text
            f.write(f'<{i}>\n')
            f.write(output_text + '\n')
    print('<<<書込処理終了')

    time.sleep(1)

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