GoToEatひょうごが使える店をgoogle mapにしてみた(python/beautifulsoupでwebスクレイピング)

目的!

  1. go to eatひょうごキャンペーンの食事券が使える店を地図で見たい! gotoeat-hyogo.com

  2. webスクレイピングをやってみたい

どっちかというと2番目の目的が先で、何かないかなと思った時に1が出てきた感じです。 python(JupyterNotebook)を使って作ってみました。

出来たこと

go to eatひょうごキャンペーンの食事券が使える店の情報を読み込んで、google mapに読み込むcsvファイルを作成!

作ったgoogleマップがこちら↓ www.google.com

出来なかったこと

googleマップに自動で読み込みは出来ず、手動読み込みに・・・
自動操作はgoogleに禁止されているようです。

準備

使った環境などを雑に並べる

  • mac catalina : 10.15.7
  • chrome : 86
  • python : 3.9.0
  • JupyterNotebook : 6.1.4
  • requests:データ取得ライブラリ
  • BeautifulSoup:データ抽出ライブラリ

※なんとなくAnacondaは使わず、適当にpip3でインストール

ざっくり処理の抜粋&説明

requestsで、キーワード(兵庫県の市町村ごとに)から食事券が使える店を検索

import requests
from bs4 import BeautifulSoup as bs4

…

#検索ページのURL、検索ワード、ページ数から結果のページ情報を取得
url ="(検索ページのURL)"
param = {"keyword" : (検索ワード), "page" : (検索ページ数)} 
res = requests.get(url, param)

主にbeautifulsoupのselectを使って 検索結果&詳細ページから店の情報(店名、住所、電話番号、webサイト、営業時間)を抽出

#ページ解析 
search_result = bs4( res.text, "html.parser")

#店舗情報のエリアを取得(1ページで10件ぐらいあったので、リストで取得して順番に処理)
store_list = search_result.select("div.search-results-list-box")

for store in store_list:
  #店名
  store_name = store.select("p.search-results-list-name")[0].text
  #住所
  store_address = store.select("p.search-results-list-p01")[0].text.replace(" ", "").replace("\n", "").replace("住所:", "")
  ...

あとは各店舗の情報を1行にしてcsvに出力

import csv

csv_filename = "goto_eat_" + search_word + ".csv"
f = open(csv_filename, mode = 'w', encoding='utf-8', errors = 'ignore')
writer = csv.writer(f, lineterminator = '\n')

csv_list = []
csv_list.append(store_name)
csv_list.append(store_address)
…
writer.writerow(csv_list)

詳細コードは↓ https://github.com/kyamada23/goto_eat_hyogo

詰まったところなど

JupyterNotebookがでなんか起動しない問題

jupyter notebookコマンドを実行すると、自動でchromeのページが開いて↓のページが表示されるんですが、 「click here to go to Jupyter.」をクリックしても全然反応してくれない・・・ f:id:potyfl:20201111084858p:plain ターミナルにこれをコピーしろみたいなのがあったのでとりあえずそれ(↓の一番下だけ)をコピペして表示されました。

    To access the notebook, open this file in a browser:
        file:///Users/…
    Or copy and paste one of these URLs:
        http://localhost:8888/?token=…
     or http://127.0.0.1:8888/?token=…

隣の要素取得がしっくりこない

<th>定休日</th>
<td>毎週火曜日</td>

上記で定休日の要素を見つけて、その隣の情報を取得しようとするときに

(定休日の要素).next_sibling だと取得できず(改行が取得されるから?)
(定休日の要素).next_sibling.next_sibling と2回繰り返すと取得できた。

go to eatひょうごの食事券アクセス殺到問題

食事券を購入する時にアクセスが殺到して、全然ページが開かずに買うまでにめちゃめちゃ時間がかかりました。 11/10分からは抽選になっているみたいです。

JupyterNotebook

気軽に実行するには便利なんですが、ファイル形式が独自のものになるので、git管理すると分かりづらい感じがしました。 終わったらpython形式に出力したらいいのかも?

感想

覚えたwebスクレイピングを試してみるにはいい素材だったかなと思います。
他の都道府県のもやってみると面白いかも
ちなみに企業が作った地図検索サービスもあります!(あるかなと思っていたけど、作るまではあえて調べなかった)

go-to-eat-map.com