Python スクレイピング

GoogleMapのAPIで地図上施設の詳細情報を取得する

この記事は約15分で読めます。

 

こんにちは、ミナピピン(@python_mllover)です。今回はGoogleMAPのAPIをpythonで使って施設情報をスクレイピングしてみたので、使い方をメモしておこうと思います。

 

 

関連記事:【Python】Youtubeの動画コメントをAPI経由で全件取得する

関連記事:【Python】Youtubeの再生数・コメント数・高評価数をスクレイピングで取得する

 

 

事前準備

 

・API鍵の作成とサービスの有効化

 

まず以下の記事の参考にAPI鍵を作成した後、GoogleMapのAPIのうちplaces APIGeocoding 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
亜鉛めっき加工なら株式会社大宮鍍金工業
株式会社大宮鍍金工業は、亜鉛めっきを主体に大量生産から多種少量ロットまで柔軟に対応する金属表面処理メーカーです。難易度が高い、鋳物・ステンレス上へのメッキにも対応。3価クロム化成皮膜にも対応。本社工場(埼玉県さいたま市)・川越工場の2拠点を有し、エコアクション21取得、障害者雇用も積極的に行っております。
日本電鍍工業(株) ChIJ_Sn8Iw7EGGARe4GVZmB1T-0
金・銀・プラチナめっきなど表面処理なら【日本電鍍工業㈱】
金めっき、銀めっき、プラチナめっきなどの貴金属めっきをはじめ、ニッケルめっきや銅めっき、陽極酸化など表面処理をしている会社です。時計、医療、楽器、電子部品、宝飾など幅広い分野に対応しております。
(株)大宮鍍金工業 川越工場 ChIJ_zYefHTQGGAR4WhlBNYawAw
302 Found
島田工業所 ChIJq6oO_gLrGGARhrj3z9jvy6c
鍍金剥離・電解研磨の島田工業所
湯沢メッキ(株)八潮工場 ChIJB7r8K1SQGGAR1uJrKVkw8xs
http://www.yuzawa-aen.jp/
(株)東工業 ChIJH2hLq7HGGGAR9kEG4W4GiVg
埼玉県・東京等でメッキ・鍍金なら 株式会社東工業 - 埼玉県・東京等でメッキ・鍍金なら 株式会社東工業
埼玉県・東京等でメッキ・めっき・鍍金・金属表面処理のことなら株式会社東工業。一般メッキ(銅・ニッケル・クロム・亜鉛・錫めっき等)、無電解メッキ(無電解ニッケルめ・テフロンめっき等)、貴金属メッキ(銀・金めっき等)を提供。
有限会社渡辺鍍金工業所 ChIJv7b3kq_rGGARr-5gowVvhuA
最新情報 - 有限会社渡辺鍍金工業所
新光メッキ工業(株) 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件以上の検索結果を取得する方法

 

 

 


プログラミング・スクレイピングツール作成の相談を受け付けています!

クラウドワークス・ココナラ・MENTAなどでPython・SQL・GASなどのプログラミングに関する相談やツール作成などを承っております!

過去の案件事例:

  • Twitter・インスタグラムの自動化ツール作成
  • ウェブサイトのスクレイピングサポート
  • ダッシュボード・サイト作成
  • データエンジニア転職相談

これまでの案件例を見る

キャリア相談もお気軽に!文系学部卒からエンジニア・データサイエンティストへの転職経験をもとに、未経験者がどう進むべきかのアドバイスを提供します。


スポンサーリンク
/* プログラミング速報関連記事一覧表示 */
ミナピピンの研究室

コメント

タイトルとURLをコピーしました