スクレイピングする際にはサイトによってブラウザの(地理)位置情報を求められる場合があります。この記事は、Selenium+Headless Chrome+Pythonを用いた場合の解決方法についての個人的メモです。
##環境
EC2 (Amazon Linux 2 AMI)
##参考
Setting sensors (location) in headless Chrome
##ツール
・Selenium
・Chrome driver(85.0.4183.87)
・Python3(3.6.2)
##位置情報が必要になった理由
とあるサイトをHeadless Chromeを使ってスクレイピングしようとするとエラーが発生。スクリーンショットを確認すると下記のようなポップアップが表示されて指定のページにアクセスができなかった。
"位置情報が取得できなかったため、処理ができません。位置情報を許可してください。"
色々と調べた結果、どうやらブラウザの位置情報が確認できないことが原因であった。
##Headless Chromeに位置情報を設定する方法
ということでHeadless Chromeに位置情報を設定する方法はないかと調べてみたが、意外と情報が少ない。。。
そもそもChromeブラウザで位置情報を設定する方法があるのかという疑問があったので、調べてみるとデベロッパーツールから設定はできるらしい。
ということは、「headless chromeでもデベロッパーツールの操作ができれば解決するのでは?」と思ったところで、Stack overflowで同じ内容を質問している人がおり、解決策が提示されていた。どうやらexecute_cdp_cmd()というメソッドを利用するらしい。
###execute_cdp_cmd()
selenium.webdriverが持つメソッドで、Google Developperツールの設定ができるらしい。
コードの実装例は以下
from selenium import webdriver
def start_chrome_driver():
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("--disable-gpu")
# executable_pathは各々の環境に合わせて変更してください
driver = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver", chrome_options=options)
return driver
# Headless Chromeを起動
driver = start_chrome_driver()
# 位置情報の設定を許可(許可をしないと位置情報の設定ができない)
driver.execute_cdp_cmd(
"Browser.grantPermissions",
{
"origin": "https://hromssp.obc.jp/",
"permissions": ["geolocation"]
},
)
# 緯度、経度、緯度・経度の誤差(単位:m)を設定する
driver.execute_cdp_cmd(
"Emulation.setGeolocationOverride",
{
"latitude": 35.689487,
"longitude": 139.691706,
"accuracy": 100,
},
)
※ちなみに上記で設定している緯度・経度は東京都庁の場所になります。
##結果
これでHeadless Chromeでも位置情報の設定(偽装?)ができるようになり、スクレイピングしたいページにアクセスできた!