yiskw note

機械学習やプログラミングについて気まぐれで書きます

python + seleniumを用いて,google mapを自動でスクショする


概要

最近画像解析のために航空写真が欲しく,それらをgoogle mapから自動で集められないかと思い,
seleniumを用いた自動スクリーンショットを実装してみました.

開発環境

seleniumとは

webブラウジングを自動化するためのライブラリです.
javapython, C#など多くの言語に対応しています.

github.com

事前準備

seleniumは,pipでインストールできます.

pip install selenium

また,webブラウザーのドライバーが必要になります.
今回はchromeを使用するので,chromeのドライバをインストールします.
homebrewからインストール,もしくは下記サイトからインストールしてください.

brew install chromedriver

Downloads - ChromeDriver - WebDriver for Chrome

seleniumの使い方

試しにgoogleにアクセスしてみます.
CRHOMEDRIVER_PATHにインストールされたドライバのパスを設定して,
下記を実行してみると,googleにアクセスできると思います.

from selenium import webdriver


driver = webdriver.Chrome(CRHOMEDRIVER_PATH)
driver.get("https://www.google.com/")

こんな感じでプログラム上から簡単にwebサイトにアクセスすることができました.

seleniumを用いてgoogle mapにアクセスし,スクリーンショットを取る.

ここから本題です.以下が自動的にスクリーンショットを取るコードになります.
流れとしては,

  1. ドライバインスタンスを作成し,画面の大きさを最大に設定.
  2. 検索ワードをqパラメータで指定したgoogle mapを作成.その際にtパラメータで航空写真を指定する.tパラメータの値は以下の通り.
    • m ...地図
    • k ...航空写真
    • h ... 航空写真 + ラベル
    • p ... 地形図
  3. スクリーンショットを撮影するのに,不要なものを削除する.ディベロッパーツールを用いて,各要素のクラス名を取得し,それらをクリックすることで不要なものを消しております.(なぜか検索バーだけは,element not interactableと言われてしまい,削除することができませんでした...)
  4. 縮小してからスクリーンショットを撮影.
import time

from selenium import webdriver


driver = webdriver.Chrome(CRHOMEDRIVER_PATH)

# 画面を最大化
driver.maximize_window()

# google mapのURLを作成
query = "富士山"
url = f"https://www.google.co.jp/maps/?q={query}"
url += "&t=k"  # 航空写真

# google mapにアクセス
driver.get(url)
time.sleep(3)

#ラベルや不要なものを削除
driver.find_element_by_class_name("searchbox-button").click()
time.sleep(3)
driver.find_element_by_class_name("widget-settings-sub-button-label").click()
time.sleep(3)
driver.find_element_by_class_name("gsst_a").click()
time.sleep(3)
driver.find_element_by_class_name("section-promo-card-close").click()
time.sleep(3)

# 縮小
driver.find_element_by_class_name("widget-zoom-out").click()
time.sleep(7)

# スクリーンショットの撮影
driver.save_screenshot("result.png")
driver.quit()

結果

こんな感じで自動でスクリーンショットを取得することができました!
検索バーなどが削除できなかったのですが,画像中央部のみを使うようにすればなんとか使えそうです.

f:id:yiskw713:20210220151929j:plain

参考