【PowerShell】スタバの全店舗名と住所を検索して取得する

2020年12月22日CODE,PowerShell

PowerShellでスタバの全店舗名と住所を検索して取得するスクリプトです。

※2020年12月時点では対象のWebサイトがIEで動作しなかったためPythonで作り直しました。

処理内容 ①検索の実行
②検索結果の表示
③表示された情報から店舗名と住所を取得
④取得した情報を外部ファイルへ出力

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

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

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

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

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

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

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

  • 11行目の出力ファイルパス
  • ブラウザの動作を確認したい場合は26行目をコメントイン
# --------------------------------------------------
# スターバックスのWebサイトから店舗名と住所を抽出してテキストで出力する
# --------------------------------------------------

# --------------------------------------------------
# スクリプトの初期処理
# --------------------------------------------------
Add-Type -AssemblyName System.Windows.Forms

# 出力ファイルパスを設定する
$fileName = "D:\shoplist.txt"

# 出力ファイルを初期化する
Write-Output "" > $fileName

# URLを設定する
$url = "https://store.starbucks.co.jp/"

# --------------------------------------------------
# IEの初期処理
# --------------------------------------------------
# 初期設定URLへ移動する
$ie = New-Object -ComObject InternetExplorer.Application

# 画面の動きを確認したい場合は下記をコメントインする
# $ie.Visible = $true
$ie.Navigate($url)

# ページが切り替わるまで待つ
while($ie.Busy) { Start-Sleep -seconds 1 }

# ドキュメントオブジェクトを取得する
$doc = $ie.document

# リンクボタン要素番号の開始値と終了値を設定する
# 一意に特定できる情報がないため固定値を設定している
$startLink = 131
$endLink   = 177

while($startLink -le $endLink) {

    # --------------------------------------------------
    # 都道府県の検索処理
    # --------------------------------------------------
    # 都道府県のリンクボタンをクリックして結果画面へ移動する
    $doc.getElementsByTagName("a")[$startLink].click()
    while($ie.Busy) { Start-Sleep -seconds 3 }

    # --------------------------------------------------
    # 店舗情報の取得処理
    # --------------------------------------------------
    # 検索結果画面で「もっと見る」ボタンが表示されていたら押せるだけ押す
    while($doc.getElementById("moreList").offsetLeft -ne 0) {
        $doc.getElementById("moreList").click()
        Start-Sleep -seconds 1
    }

    # 店舗情報要素番号の開始値と終了値を設定する
    # こちらも一意に特定できる情報がないため固定値
    $tmp = ""
    $i = 41
    $maxLength = $doc.getElementsByTagName("P").length -14

    # --------------------------------------------------
    # 取得情報の出力処理
    # --------------------------------------------------
    while ($i -le $maxLength) {
        $tmp = $doc.getElementsByTagName("P")[$i].outerText + "`t" + $doc.getElementsByTagName("P")[$i + 1].outerText
        # Write-Output $tmp
        Write-Output $tmp >> $fileName

        $i += 5
    }

    # 初期設定URLへ戻る
    $ie.Navigate($url)
    while($ie.Busy) { Start-Sleep -seconds 3 }

    $startLink += 1
}
[System.Windows.Forms.Messagebox]::Show("処理が完了しました","完了")

実行結果

実行すると、店舗名と店舗住所をタブ区切りでテキストファイルに出力します。

参考書

PowerShellの開発にずっと使っている参考書で、深く勉強したい人にもおすすめできます。
ページ数が多いため紙の本の方が使いやすいです。