python + seleniumを用いて,google mapを自動でスクショする
概要
最近画像解析のために航空写真が欲しく,それらをgoogle mapから自動で集められないかと思い,
selenium
を用いた自動スクリーンショットを実装してみました.
開発環境
selenium
とは
webブラウジングを自動化するためのライブラリです.
java
やpython
, C#
など多くの言語に対応しています.
事前準備
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にアクセスし,スクリーンショットを取る.
ここから本題です.以下が自動的にスクリーンショットを取るコードになります.
流れとしては,
- ドライバインスタンスを作成し,画面の大きさを最大に設定.
- 検索ワードを
q
パラメータで指定したgoogle mapを作成.その際にt
パラメータで航空写真を指定する.t
パラメータの値は以下の通り.
- m ...地図
- k ...航空写真
- h ... 航空写真 + ラベル
- p ... 地形図
- スクリーンショットを撮影するのに,不要なものを削除する.ディベロッパーツールを用いて,各要素のクラス名を取得し,それらをクリックすることで不要なものを消しております.(なぜか検索バーだけは,
element not interactable
と言われてしまい,削除することができませんでした...) - 縮小してからスクリーンショットを撮影.
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()
結果
こんな感じで自動でスクリーンショットを取得することができました!
検索バーなどが削除できなかったのですが,画像中央部のみを使うようにすればなんとか使えそうです.