1
1

More than 1 year has passed since last update.

ほっかいどう認証店応援クーポンの郵便局在庫状況を Google Map で可視化する

Posted at

コロナで落ち込んだ外食産業への需要を回復するために、GO TO EAT キャンペーンを始め、各地域で色々なクーポンを発行して、頑張っていらっしゃいますよね。

そんな中のひとつに、ほっかいどう認証店応援キャンペーンがあるわけで。

参加店リストの画面なんか、非常に、ひっじょ〜に GO TO EAT と似ているのだが、まぁこれは触れてはいけないのだろう。

で、やっぱりお得なので、みんな争ってクーポンを買っているのでしょう(想像)。

今回のほっかいどう認証店応援クーポンの良い所は、どうやら紙のクーポンは道内の郵便局だけで販売しているらしいのだが、その在庫数が公表されているのだ。

これで、せっかく郵便局に言っても売り切れてた・・・なんてことが無くなるのだよ!!!

PDF で、だけどな!!!

なんで PDF にした。わかりづらいわ。非常にわかりづらいわ。しかもちゃんと郵便局が辞書順に並んでいるわけでもなく、なんか独自のルールで並んでいる。地域とかを考慮している?

わからん。おっちゃん、わからんよ。

だから作ったよ。Google Map で可視化するやつを作ったよ。

作ったもの

README にも書いたけどね、こんなことやってる。

  • スクレイピングするスクリプト: scrape.py
    • ほっかいどう認証店応援キャンペーンのサイトから在庫一覧のPDFをダウンロードする
      • zaiko.pdf という PDF ファイルが生成される
    • ダウンロードしたPDFを読み込んで、郵便局名・住所・在庫数の一覧を得る
    • 得られた住所から Google Maps API を用いて緯度経度を得る
    • 上記のデータを JSONL ファイルにして出力する
      • output.jsonl という JSONL ファイルが生成される
  • HTTPサーバのスクリプト: app.py
    • Google Map の画面を用意する
    • JSONL ファイルを読み込んで、Google Map 上のマーカーを生成する
    • 上記を表示する HTTP サーバ(FastAPI)を立ち上げる
  • 後はローカルホストにアクセスするだけ

可視化の結果

  • 青いマーカー:在庫部数 100 部以上
  • 黄色いマーカー:在庫部数 100 部未満
  • 赤いマーカー:在庫切れ

stock_hokkaido.png

デフォルトの画面。北海道全体でみるとまだまだ在庫は余っているように見える。

stock_sapporo.png

札幌市を拡大すると、中央区はかなり売り切れちゃってることが分かる。ヤバイよ!

stock_centre.png

中央区を拡大する。札幌駅の周辺は売り切れちゃっている。
でもサッポロビール博物館の近くの中央郵便局にはまだまだありそうだ。

こんなことがビシッと分かるわけで。分かりやすいよ。

今回のポイント

  • PDF は requests でダウンロード
  • PDF の表を camelot を使って pandas.DataFrame の形でデータ読み込み
    • キレイに読み込める保証は全然なく、今回も結局は手で整形している
    • でも、何にも無く読み込むよりは 100 倍マシに読み込める
  • googlemaps パッケージで、住所から緯度経度の変換
    • Google Maps API は有料!(無料の範囲はあるけど)
    • 連続で API を出すと quota 制限に引っかかりがちなので、sleep 入れたり retry 入れたりしてる
  • FastAPI + Jinja2 でお手軽 Web サーバ
    • Jinja テンプレートは簡単便利で良いなぁ
    • なんちゃって JQuery
  • Google Map の Marker と InfoWindow を出すのに、ちょっとした工夫

まとめ

まぁ、みんな紙クーポンじゃなくて電子クーポンを買うだろうけどね!!!

学んだこと:

  • 思いついたら即座に作ってしまえ
  • やっぱり可視化は重要!
1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1