【Python】スタバの店舗情報をテキストファイルに書き出す
処理概要
スターバックスの店舗情報をテキストファイルに書き出す
処理内容
- スターバックスのWebサイトを開く
- 各都道府県を選択する
- 検索結果に表示される店舗情報を取得する
- 取得した情報をテキストファイルに出力する
対象URL
- スターバックスのWebサイト
- https://store.starbucks.co.jp/
出力ファイル
- ファイル名:都道府県名.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()