こんにちは、ミナピピン(@python_mllover)です。今回はGoogleMAPのAPIをpythonで使って施設情報をスクレイピングしてみたので、使い方をメモしておこうと思います。
関連記事:【Python】Youtubeの動画コメントをAPI経由で全件取得する
関連記事:【Python】Youtubeの再生数・コメント数・高評価数をスクレイピングで取得する
Contents
事前準備
・API鍵の作成とサービスの有効化
まず以下の記事の参考にAPI鍵を作成した後、GoogleMapのAPIのうちplaces APIとGeocoding APIを有効化してください。
参考記事:【GCP】GoogleCloudPlatformでプロジェクトを作成してAPI鍵の作成&有効化する


・クライアントライブラリのインストール
Googleの提供しているAPIはPythonで使用するためにラッピングしたものをライブラリとしてGoogle公式が作ってくれているのでこれをインストールしてそのまま使います。
# ライブラリのインストール $ pip install googlemaps
Gitのソース:https://github.com/googlemaps/google-maps-services-python
Googlemapに表示されている施設情報を取得
これで前準備は完了したので実際にPythonでAPIを叩いてみます。施設情報を取得はplaces_nearby()で行います。locの位置情報を基準として半径〇㎞いないのキーワードに当てはまる施設名を検索してくれます
import googlemaps
import pprint
key = 'api鍵'
client = googlemaps.Client(key)
# 基準になる位置情報を検索
geocode_result = client.geocode('埼玉駅 メッキ工場')
# 軽度・緯度の情報のみ取り出す
loc = geocode_result[0]['geometry']['location']
#半径100㎞以内の工場情報を取得
place_results = client.places_nearby(location=loc, radius=1000000, keyword='埼玉 メッキ',language='ja')
pprint.pprint(place_results)
<実行結果>
'results': [{'geometry': {'location': {'lat': 35.633795, 'lng': 139.6608681},
'viewport': {'northeast': {'lat': 35.63512747989272,
'lng': 139.6621710298927},
'southwest': {'lat': 35.63242782010728,
'lng': 139.6594713701073}}},
'icon': 'https://maps.gstatic.com/mapfiles/place_api/icons/cafe-71.png',
'id': '458005d7b299cb781bb3ea89f697a8e440a9638d',
'name': 'rice cafe',
'photos': [{'height': 4618,
'html_attributions': ['<a '
'href="https://maps.google.com/maps/contrib/109845876179671154841/photos">石川智子'],
'photo_reference': 'CmRaAAAAhfmVkWgNOtv6jcKhFDi97cGGMSmpnc_ojnHFkQBjwwZTwk7hur-ylWbGTRCY6CS3CWDQbYvldUySha-ZqMU-T9_Hd5ZGR7Anoq1_R4D2oX0IaJNOTYznWwbpqGDMkjfBEhCybXtyozfgV_q_FKfz__tiGhSXQ_TYyKkWfQfoKz_tVsJCT1iHfQ',
'width': 3464}],
'place_id': 'ChIJF3G_G5D0GGARwHen_P84lKw',
'plus_code': {'compound_code': 'JMM6+G8 Tokyo, 東京都 Japan',
'global_code': '8Q7XJMM6+G8'},
'rating': 4.2,
'reference': 'ChIJF3G_G5D0GGARwHen_P84lKw',
'scope': 'GOOGLE',
'types': ['cafe', 'food', 'point_of_interest', 'establishment'],
'user_ratings_total': 54,
'vicinity': '4 Chome-5-5 Kamiuma, Setagaya City'},
{'geometry': {'location': {'lat': 35.6332433, 'lng': 139.6617063},
'viewport': {'northeast': {'lat': 35.63459312989272,
'lng': 139.6630561298927},
'southwest': {'lat': 35.63189347010728,
'lng': 139.6603564701072}}},
'icon': 'https://maps.gstatic.com/mapfiles/place_api/icons/cafe-71.png',
'id': 'b99fb5f85ed8c6893b51829ecefb2dfe55de93cd',
'name': 'TOKYO People’s Cafe Komazawa',
'opening_hours': {'open_now': False},
'photos': [{'height': 3024,
Googleマップに登録されている場所や建物にはplace_idというものがそれぞれに付与されているので詳細情報を返すAPIをplace_idを引数に乗せて叩くと営業時間とかwebサイトのURLとか検索したときに、画面の右側にナレッジパネルで出てくる情報に関しては取得できるみたいです。
次はこのplace_idを使用して施設のより詳細な情報(Google検索でナレッジパネルに表示されている内容)を取得します。
ナレッジパネル自体にもAPIは提供されていますが有名人や世界遺産みたいな有名どころの情報はAPIレスポンスとして返ってきますが、レストランや工場といった中小施設の情報は返ってこないのでこの方法でしか取得することはできないと思います。
place_idから施設の公式サイトURLなどの詳細情報を取得する
place_idによる詳細情報を取得はplace()で行えます。
res = client.place(place_id='ChIJt79nsgWRGGARUJXQmghtCxg', language='ja')['result']
<実行結果例>
{'html_attributions': [],
'result': {'address_components': [{'long_name': '13',
'short_name': '13',
'types': ['premise']},
{'long_name': '3',
'short_name': '3',
'types': ['sublocality_level_4', 'sublocality', 'political']},
{'long_name': '5-chōme',
'short_name': '5-chōme',
'types': ['sublocality_level_3', 'sublocality', 'political']},
{'long_name': 'Asahi',
'short_name': 'Asahi',
'types': ['sublocality_level_2', 'sublocality', 'political']},
{'long_name': 'Kawaguchi',
'short_name': 'Kawaguchi',
'types': ['locality', 'political']},
{'long_name': 'Saitama',
'short_name': 'Saitama',
'types': ['administrative_area_level_1', 'political']},
{'long_name': 'Japan',
'short_name': 'JP',
'types': ['country', 'political']},
{'long_name': '332-0001',
'short_name': '332-0001',
'types': ['postal_code']}],
'adr_address': '5-chōme-3-13 Asahi, Kawaguchi, Saitama 332-0001, Japan',
'business_status': 'OPERATIONAL',
'formatted_address': '5-chōme-3-13 Asahi, Kawaguchi, Saitama 332-0001, Japan',
'formatted_phone_number': '048-229-4611',
'geometry': {'location': {'lat': 35.8099011, 'lng': 139.746483},
'viewport': {'northeast': {'lat': 35.81125763029149,
'lng': 139.7479165802915},
'southwest': {'lat': 35.8085596697085, 'lng': 139.7452186197085}}},
'icon': 'https://maps.gstatic.com/mapfiles/place_api/icons/v1/png_71/generic_business-71.png',
'icon_background_color': '#7B9EB0',
'icon_mask_base_uri': 'https://maps.gstatic.com/mapfiles/place_api/icons/v1/png_71/generic_pinlet',
'international_phone_number': '+81 48-229-4611',
'name': '常木鍍金工業(株) 技術研究所',
'place_id': 'ChIJjWFwlpaTGGARKTzmRfZCLRU',
'plus_code': {'compound_code': 'RP5W+XH Kawaguchi, Saitama, Japan',
'global_code': '8Q7XRP5W+XH'},
'reference': 'ChIJjWFwlpaTGGARKTzmRfZCLRU',
'types': ['point_of_interest', 'establishment'],
'url': 'https://maps.google.com/?cid=1525949474250570793',
'utc_offset': 540,
'vicinity': '5-chōme-3-13 Asahi, Kawaguchi',
'website': 'http://www.tsuneki-mf.co.jp/'},
'status': 'OK'}
こんな感じでサイトのURLや電話番号などナレッジパネルに表示されている内容が取得できます。
APIドキュメント:
https://developers.google.com/maps/documentation/places/web-service/place-id
これらを一連の処理をスクリプトにすると以下のようになります。
import googlemaps
import pprint
key = 'api鍵'
client = googlemaps.Client(key)
# 基準になる位置情報を検索
geocode_result = client.geocode('埼玉駅 メッキ工場')
# 軽度・緯度の情報のみ取り出す
loc = geocode_result[0]['geometry']['location']
#半径100㎞以内の工場情報を取得
place_results = client.places_nearby(location=loc, radius=1000000, keyword='埼玉 メッキ',language='ja')
pprint.pprint(place_results)
# 検索結果から工場名と建物コードを取得してコードからナレッジパネルの詳細情報
に公式サイトのurlが登録されている場合はURLを取得
for i in place_results['results']:
print(i['name'], i['place_id'])
place_detail = client.place(place_id=i['place_id'])
try:
print(place_detail['result']['website'])
except:
print('サイトがありません')
pass
<実行結果>
埼玉県鍍金工業組合 ChIJVQ4sy9nFGGAR3YJAuz2LnY4(株)大宮鍍金工業 本社 ChIJRTSVoxHEGGARfb6Cd2OYHJw 埼玉県鍍金工業組合日本電鍍工業(株) ChIJ_Sn8Iw7EGGARe4GVZmB1T-0 亜鉛めっき加工なら株式会社大宮鍍金工業株式会社大宮鍍金工業は、亜鉛めっきを主体に大量生産から多種少量ロットまで柔軟に対応する金属表面処理メーカーです。難易度が高い、鋳物・ステンレス上へのメッキにも対応。3価クロム化成皮膜にも対応。本社工場(埼玉県さいたま市)・川越工場の2拠点を有し、エコアクション21取得、障害者雇用も積極的に行っております。(株)大宮鍍金工業 川越工場 ChIJ_zYefHTQGGAR4WhlBNYawAw 金・銀・プラチナめっきなど表面処理なら【日本電鍍工業㈱】金めっき、銀めっき、プラチナめっきなどの貴金属めっきをはじめ、ニッケルめっきや銅めっき、陽極酸化など表面処理をしている会社です。時計、医療、楽器、電子部品、宝飾など幅広い分野に対応しております。島田工業所 ChIJq6oO_gLrGGARhrj3z9jvy6c 302 Found湯沢メッキ(株)八潮工場 ChIJB7r8K1SQGGAR1uJrKVkw8xs 鍍金剥離・電解研磨の島田工業所(株)東工業 ChIJH2hLq7HGGGAR9kEG4W4GiVg http://www.yuzawa-aen.jp/有限会社渡辺鍍金工業所 ChIJv7b3kq_rGGARr-5gowVvhuA https://www.adumakougyou-plating.jp/新光メッキ工業(株) ChIJSQaCeHbqGGARyIG3upn9nX4 サイトがありません 常木鍍金工業(株) ChIJGQKdIJSTGGARb9QiLWzoBl0 最新情報 - 有限会社渡辺鍍金工業所(有)板橋鍍金工業所 ChIJV25Si4KaGGARavOwDFqrY14 サイトがありません (有)平野メッキ工場 ChIJd6SaYoKaGGARw6JOqgb6ih4 常木鍍金工業株式会社三共鍍金(株) ChIJyTl5sFnfGGARw9YaioP_X6Q サイトがありません クロム・ニッケル・金など装飾メッキ加工!ステンレスやバイク等へ対応可能!|平野メッキ工場平野メッキ工場では、クロム・ニッケル・金など装飾メッキ加工を提供しています。また、大型のステンレスやバイクなどへのメッキ加工にも対応していますので、お気軽にご相談ください。
参考:https://www.for-engineer.life/entry/python-google-api/
2020/10/15追記
ただこれだとAPIの制限で最大60件までしか取得できないので60件以上取得する場合は少し工夫する必要があります。
⇒関連記事:【Python】Google Places APIで20件以上の検索結果を取得する方法



コメント