Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ご当地グルメマップを作ろう
Search
Hiroshi Sano
October 28, 2023
Programming
2
1.1k
ご当地グルメマップを作ろう
PyCon APAC 2023 Day2 2023/10/28
Hiroshi Sano
October 28, 2023
Tweet
Share
More Decks by Hiroshi Sano
See All by Hiroshi Sano
調整さんの調整結果をカレンダーへ登録するGPTsを作った話
hrsano645
1
480
Gmail APIでメールを扱おうとしたら結構辛かった話
hrsano645
0
380
非同期タスクキューを使って業務効率化した話
hrsano645
1
1.2k
非同期タスクキューを使って業務を自動化しまくった話
hrsano645
0
530
Python駿河 #28 富士宮焼きそばを食べ歩きしたいのでマップを作った話
hrsano645
0
91
Python駿河 #1 MicroPythonを使ってみよう!
hrsano645
0
1k
IoTLT vol.51 お風呂IoT Mk2作りました
hrsano645
1
1.7k
IoTLT vol.46 蛇口IoTに挑戦した記録
hrsano645
1
830
PWA入門してみた話(iPad Proで!)
hrsano645
1
950
Other Decks in Programming
See All in Programming
テストケースの名前はどうつけるべきか?
orgachem
PRO
0
130
Mermaid x AST x 生成AI = コードとドキュメントの完全同期への道
shibuyamizuho
0
160
From Translations to Multi Dimension Entities
alexanderschranz
2
130
ブラウザ単体でmp4書き出すまで - muddy-web - 2024-12
yue4u
2
460
Haze - Real time background blurring
chrisbanes
1
500
これでLambdaが不要に?!Step FunctionsのJSONata対応について
iwatatomoya
2
3.6k
StarlingMonkeyを触ってみた話 - 2024冬
syumai
3
270
Symfony Mapper Component
soyuka
2
730
テストコード文化を0から作り、変化し続けた組織
kazatohiei
2
1.5k
CSC305 Lecture 26
javiergs
PRO
0
140
HTTP compression in PHP and Symfony apps
dunglas
2
1.7k
DevFest Tokyo 2025 - Flutter のアプリアーキテクチャ現在地点
wasabeef
5
890
Featured
See All Featured
Automating Front-end Workflow
addyosmani
1366
200k
GraphQLとの向き合い方2022年版
quramy
44
13k
Designing Experiences People Love
moore
138
23k
The Cost Of JavaScript in 2023
addyosmani
45
7k
The Cult of Friendly URLs
andyhume
78
6.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
44
9.3k
Designing on Purpose - Digital PM Summit 2013
jponch
116
7k
YesSQL, Process and Tooling at Scale
rocio
169
14k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
247
1.3M
Art, The Web, and Tiny UX
lynnandtonic
298
20k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
Transcript
ご当地グルメマップを作ろう Let's make! Local Food Map PyCon APAC 2023 Day2
Hiroshi Sano / 佐野浩士 1
Today's Document 本日の資料は公開されています スライド: Speaker Deck https://speakerdeck.com/hrsano645/godang-di-gurumematupuwozuo-rou GitHubリポジトリ: コードとスライド https://github.com/hrsano645/pyconapac2023-local-food-map
GitHubのStarくれー !! このセッションでカンファレンスも終わるのでゆったりと眺めてもらえたらと思います 2
Self Infroduction Hiroshi Sano(佐野浩士)@hrs_sano645 : Shizuoka, Eastern part : 株式会社佐野設計事務所
CEO : PyCon mini Shizuoka Stuff / Shizuoka.py / Unagi.py / Python駿河 CivicTech, Startup Weekend Organizer Hobby: Camp ,DIY ,IoT 3
4
Agenda トークのモチベーション 今回のトークでできること 1. お店情報をデータにする: WEBスクレイピング 2. データを整形をする: CSVファイルにする 3.
データを使ってみる: Googleマイマップで呼び出す まとめ 5
トークのモチベーション ご当地グルメの情報収集してマップを作りましょう! ご当地グルメ=B級グルメのこと とあるご当地グルメを例にしています PyCampを終えた人に: データを集める、作る、利用するを元にプログラムの 実装プロセスを学べます 話すこと: トークお題をPythonで実装する過程 話さないこと:
Pythonの基礎や文法の解説 6
PyCamp:Python Boot Campとは 日本全国で開催されているPythonのチュートリアルイベント 一般社団法人PyCon JP Associationが主催 半日でPythonの基礎を学び、簡単なプログラムを作る 専用テキストを元に講師、TAがサポート PyCampを終えた方の次にチャレンジできるコンテンツを目指して作りました
写真は静岡県3回目の様子 7
今回のお題: ご当地グルメはこちら しんかわな, CC BY 3.0 https://creativecommons.org/licenses/by/3.0, ウィキメディア・コモンズ経由 8
富士宮焼きそば 主に静岡県富士宮市周辺で食べられる焼きそば B-1グランプリ殿堂入り、NYで開催されたコナモングランプリで優勝 地元の人は、多分週一ぐらいで食べてる 9
ところで、みなさん、 もう食べたくなりましたね? このあとはパーティ ですし、お腹空きましたね 10
富士宮焼きそばマップを作りましょう 11
今回のトークでできること 1. お店情報をデータにする: WEBスクレイピング 2. データを整形をする: CSVファイルにする 3. データを使ってみる: Googleマイマップで呼び出す
12
今回のトークでできること 1. お店情報をデータにする: WEBスクレイピング 2. データを整形をする: CSVファイルにする 3. データを使ってみる: Googleマイマップ
抽象的に言い直すと... ⬇️ 1. どこから データを取り出すか 2. どんな データを作るか 3. どこへ データを渡すか 13
1. どこからデータを取り出すか WEBスクレイピングで収集する [付録] 画像識別で収集する 14
WEBスクレイピングで利用するライブラリ requests: HTTPアクセス→情報取得(今回はHTML) BeautifulSoup4: HTML(マークアップ言語)解析と抽出 pip install requests pip install
beautifulesoup4 ※ PyCampの終盤で利用するライブラリです。今回は詳細解説は省きます ※ スライドのコードは説明向けです。そのままだと動かないこともあります ※ 資料のリポジトリから動作するスクリプトをDL可能です 15
ご当地グルメの情報はどこにあるか 観光情報を探ってみると 市役所、観光協会のWEBサイトで紹介されていたり ご当地グルメの公式サイト(よく〇〇学会とも言われる) ポイント 地域情報を収集してみる その情報は機械可読ができるか? 大体が紙ベースが多い パンフレットとか (画像識別の手段は使える)
グルメ情報サイトを見たらそこで試合終了ですよ 16
今回は、富士宮焼きそば学会の公式サイトを例にしています (左: お店一覧、右: お店の詳細) 富士宮焼きそば学会公式サイトのお店一覧:https://umya-yakisoba.com/shop/ 17
お店一覧をざっくり収集します import requests from bs4 import BeautifulSoup url = "https://umya-yakisoba.com/shop/"
res = requests.get(url) soup = BeautifulSoup(res.text, 'html.parser') # ここではdiv.p-shopList > a にURL がある # その中にお店情報がまとまっているので、a タグから取り出す shopinfo_tags = soup.find( 'div', class_='p-shopList' ).find_all("a") 18
aタグのURLと内部のタグから必要な情報を取得する # お店情報をまとめるリスト shopinfo_list = [] for shopinfo_tag in shopinfo_tags:
shopdata = {} # div タグの並びは上から店名、住所、電話番号、定休日 # ここではurl と店名だけまとめたリストを作る shopdata['specurl'] = shopinfo_tag.get('href') shopdata[' 店名'] = shopinfo_tag.find_all("div")[1].text shopinfo_list.append(shopdata) 19
お店の詳細URL, 店名が集まりました >>> shopinfo_list [{'specurl': 'https://umya-yakisoba.com/shop/3776/', ' 店名': ' お好焼
あき'}, {'specurl': 'https://umya-yakisoba.com/shop/3777/', ' 店名': ' あさ家'}, {'specurl': 'https://umya-yakisoba.com/shop/3774/', ' 店名': ' あるばとろす'}, {'specurl': 'https://umya-yakisoba.com/shop/3616/', ' 店名': ' いっぷく亭'}, ... ] ※ この例では店名に \u3000 (全角スペースの意味) が入ることがあり、半角スペースへ置き換え処理をした結果になります 20
詳細URLへアクセスして、各お店の詳細情報を収集します for shopinfo in shopinfo_list: # URL から店舗情報を取得 res =
requests.get(shopinfo['specurl']) soup = BeautifulSoup(res.text, 'html.parser') # dl.p-shopDetails > dt/dd 構造 # dt が項目名、dd が項目の値になっている。 # zip 関数で両者組み合わせて同時に取り出す shopspecs = {} for dt, dd in zip( soup.find('dl', class_='p-shopDetails').find_all('dt'), soup.find('dl', class_='p-shopDetails').find_all('dd') ): # 辞書形式にする # 値に 改行や空白文字があるので取り除く shopspecs[dt.text] = dd.text # 店舗情報をマップ情報に追加 shopinfo.update(shopspecs) # INFO: ここにランダム待機時間があるとよさそう dt と dd タグは記述リスト、説明リストと呼ばれるHTMLタグ 21
最終的にできるデータ >>> from pprint import pprint >>> pprint(shopinfo_list) [{'TEL': '0544-27-0004',
'specurl': 'https://umya-yakisoba.com/shop/3776/', ' お店名ふりがな': ' あき', ' エリア': ' まちなか', ' 住所': ' 富士宮市野中東町112-1', ' 受入人数': '12', ' 営業時間': '10:00 -21:00', ' 地図': 'B6', ' 定休日': ' 火曜日', ' 店名': ' お好焼 あき', ' 料金目安': '350 ~600 円', ' 業種': ' 飲食店', ' 焼き方': ' お店', ' 調査員おすすめメニュー': ' キムチとチーズ入り', ' 調査員が見た特徴': ' キャベツとネギが多めに入っている', ' 駐車場': '4'}, # 以下お店情報の辞書が続いて入る... ] ※ この例では各項目に \n (改行コード) が入ることがあり、空白へ置き換え処理をした結果になります 22
上記コードの注意点 ※ WEBスクレイピングは注意が必要です 短時間で多数アクセスはしないように注意 → ランダムな時間待機を入れる 規約やポリシーを守りましょう ※ サイト上に見えない文字があることがあります →
文字列置換をしましょう ※ この例ではサイトのページネーションに対応していません ページネーションについては資料のコードで対応しています 23
WEBスクレイピングでランダム時間を待機する関数の例 import random from time import sleep def random_sleep(a: int,b:
int) -> None: """ a からb までのランダムな秒数を待つ """ time.sleep(random.randint(a,b)) # 例: 2~5 秒の間でランダムに待つ # 複数回アクセスする時、ループの最後に差し込むと良い random_sleep(2, 5) 24
2. どんなデータを作るか 1で作成したデータを、3.で利用するために ファイルを作成します 情報を整理して表形式ファイルで書き出す [付録] 地理情報を集める 25
情報を整理 どのフォーマットで書き出すか? よくある地理データ向けファイルフォーマットの中から選びます CSV(カンマ区切り表形式、汎用性高) GeoJSON(WEB APIで広く流通しているJSON形式の地理情報向け) KML(XML形式) ※ 今回は3.で使うサービスの都合もあり、CSVを選択しました 26
Python標準のCSVライブラリを使って書き出します csv.DictWriter を使うとリスト>辞書構造のデータをCSVファイルにしやすいです import csv with open('mapdata.csv', 'w', newline='') as
csvfile: # ※: お店の詳細情報の各項目: 辞書のキー が部分的に異なるため、 # 全ての項目名: 辞書のキーを集めて重複を取り除いたリストを作成しています csv_fieldnames = list(set().union(*shopinfo_list) writer = csv.DictWriter(csvfile, fieldnames=csv_fieldnames) # 最初の行に項目名→ 列名を書き出す writer.writeheader() # 辞書のキーをもとに行として書き出す for shopinfo in shopinfo_list: writer.writerow(shopinfo) 27
出力できたCSVファイル 28
3. どこへデータを渡すか 旅行中に使うためのツールとして 巨人の肩に乗る: Googleマイマップで使おう [付録] ポータブルに扱う: 印刷をする [付録] 専用のWEBアプリを作ろう
Googleマイマップとは Googleマップ上でオリジナルマップを作成できる スマホ版Googleマップでも表示可能 29
扱い方 https://www.google.com/maps/d/ へアクセスして利用します 「新しい地図を作成」ボタンを押す 30
新規レイヤーへCSVファイルをインポートします 31
マップへのポイントは住所を使います 32
ポイントした部分への簡易説明(マーカー)を入れる 今回は店名にしました 33
マッピングされました 34
スマホで見ることもできます! 35
そのほか選択肢 データを作るといろんなサービスと連携できます ※ 今回はGoogleマイマップを利用する例を紹介しました オリジナルのマップを作るサービスの一例です それぞれ特徴や無料有料とあるので、使いやすいものを探してみましょう OpenStreetMap uMap: https://umap.openstreetmap.fr/ja/ proxi:
https://www.proxi.co/ [日本向け]国土地理院: https://maps.gsi.go.jp/ etc... 36
トークのまとめ 37
今回のトークでできること 1. お店情報をデータにする: WEBスクレイピング 2. データを整形をする: CSVファイルにする 3. データを使ってみる: Googleマイマップ
抽象的に言い直すと... ⬇️ 1. どこから データを取り出すか 2. どんな データを作るか 3. どこへ データを渡すか 38
プログラミングでもっとも行われる行為 どこから データを取り出すか どんな データを作るか どこへ データを渡すか プログラミングはデータの流れを意識しよう 39
どこから データを取り出すか データベースから取り出す データベース接続、API 現実の統計データを使う データセット、オープンデータ センサーデータで現実環境を扱う ハードウェア操作 どんな データを作るか
データを加工して新しいデータを作る 前処理、後処理 データを整形する ファイル形式、データ構造 どこへ データを渡すか データの可視化をして分析 グラフ、ダッシュボード データを使って業務工程改善 オートメーション、システム連携 データを使ってAIで予測 機械学習、ディープラーニング データの流れを意識すると、作りたいプログラムの流れも理解しやすい 40
最後に伝えたいこと PyCampやPythonの基礎を学んだ方の一歩先として。オススメです! 自分が使いたい、利用したい、ものやことがあればチャレンジしましょう! できたら、とても楽しいし、感動します 41
Happy Hacking!! and, Have a nice trip!! 42