【Python】BeautifulSoup + Seleniumで静岡県内のケンタッキー店舗を取得

個人的な話ですが、最近はPythonにハマっています。 ライブラリが優秀で、ちょっとアレやりたいなと思うことがすぐにできるからです。 今回は、スクレイピングの学習もかねて地元静岡県のケンタッキーの店舗を公式サイトから取得するスクリプトを作成してみました。

前提条件

  • pythonインストール済(記事ではv3.6.6を使用)

はじめに

今回スクレイピングをするのはケンタッキーの店舗検索ページです。 URLは下記の通りとなっています。

https://www.kfc.co.jp/search/fuken.html?t=attr_con&kencode=22&start=1

パラメータのkencode=22が静岡県、start=1が1ページ目を表しています。 この記事を書いている202年7月1日現在では全25店舗なため、スクレイピングする必要はあまりありませんが、練習のため良しとします。

※スクレイピング前にrobots.txt等を確認して、スクレイピングが許可されたWebサイトかどうかを確認してください。

今回はrobots.txtが確認できなかったためご利用にあたってのページより、スクリプトによる自動解析等に制限がかけられていないことを確認しました。

前準備

ChromeDriverインストール

Seleniumを利用するにあたってChromeDriverのインストールが必要です。 ダウンロードページより自身のChromeのバージョンにあったドライバをダウンロードしてください。

取得したドライバは下記のディレクトリに格納すればOKです。

/usr/local/bin

SeleniumとBeautifulSoup

今回はSeleniumBeautifulSoupを使用します。 それぞれ、ブラウザ操作とHTML解析を行うライブラリです。

pip install selenium
pip install bs4

スクリプト

今回作成したスクリプトは下記の通りとなります。

kfc.py
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

# ChromeDriverオプションを設定
op = Options()
op.add_argument("--disable-gpu")
op.add_argument("--disable-extensions")
op.add_argument("--proxy-server='direct://'")
op.add_argument("--proxy-bypass-list=*")
op.add_argument("--start-maximized")
op.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=op)

try :

    # ページング用パラメータ
    start = 1
    # 次へリンクの有無
    next = True

    # 「次へ」リンクが存在する限り実行
    while next != None:

        # サービス・都道府県から「静岡県」の結果が表示されたページを取得(startでページ数を指定)
        driver.get(f'https://www.kfc.co.jp/search/fuken.html?t=attr_con&kencode=22&start={start}')

        # 描画されるまで5秒程待つ
        time.sleep(5)

        # 描画されたHTMLをBeautifulSoupで解析
        soup = BeautifulSoup(driver.page_source, 'html.parser')

        # 「次へ」のリンクの有無をチェック
        next = soup.find('li', class_='next')

        # id=outShopの<ul>から
        for ul in soup.find_all('ul', id=['outShop']):
            # class=even or oddの<li>を取得し
            for li in ul.find_all('li', class_=['even', 'odd']):
                # <li>配下の<span>から店名と住所だけを抽出
                shop_name = li.find('span', class_ =['scShopName']).text
                address = li.find('span', class_=['scAddress']).text
                # 表示
                print(f'{shop_name} {address}')
        
        # 「次へ」が存在する場合はページ数をインクリメント
        if next != None:
            start+=1

except Exception as e:
    print('Error', e)

finally:
    # ドライバを終了する
    driver.quit()

ほぼコメントに書いてある通りですが、<ul id="outShop">配下の<li>を探索し、<span class="scShopName"><span class="scAddress">のテキストを抜き出しています。

また、ページ中に「次へ」のリンクが存在する限り&start=のパラメータをインクリメントしてページングを行うようにしています。

※複数回のリクエストが発生するスクレイピングの場合は、適切な間隔を開けましょう

実行

python kfc.py

実行結果につきましてはご利用にあたってより、転載が禁止されていますので記載を控えさせていただきます。

実行時の注意点

今回はじめてChromeDriverをダウンロードしてきた場合、スクリプト実行時に下記の警告が出ると思います。

chromedriver1

その場合は【システム環境設定】の【一般】から【このまま許可】を選択してください(下図参照)。

chromedriver2

おまけ

今回のソースをGitに上げました。

まとめ

今回はスクレイピングの学習をかねてpythonSeleniumBeautifulSoupを用いたサンプルを作成しました。 今後、機械学習や統計の学習をするつもりなので、大量のデータを取得する手法として非常に有益な学習ができました。 ただ、取得先のサイトによって規約等が異なるので、ご利用の際はくれぐれもご注意ください。

SNSでシェアする