from selenium import webdriver import time # 設定位置的經緯度,以大慶夜市為例 latitude = 24.122629 longitude = 120.655638 accuracy = 10 driver = webdriver.Chrome() # 用 CDP command 設定座標經緯度 driver.execute_cdp_cmd( "Emulation.setGeolocationOverride", { "latitude": latitude, "longitude": longitude, "accuracy": accuracy } ) # 打開頁面試試看定位,這裡以 OpenStreetMap 為例 driver.get("https://www.openstreetmap.org/") driver.find_element("css selector", "span.geolocate").click() # 給你看個10秒 time.sleep(10) driver.quit()
Emulation.setGeolocationOverride 中的 latitude、longitude、accuracy 對於定位來說都是「必要」參數,雖然官方文件寫 optional,但也特別說缺少任一個,定位就不會作用XD
latitude、longitude 分別是緯度和經度,沒什麼問題。比較需要解釋的是 accuracy 定位精確度,通常帶1或以上即可。accuracy 的單位是公尺,「越小越準確」。但最好不要為0,0是不準確時回傳的(有些網站可以接受,也有些不接受)。
因為定位通常由系統回傳,我找到了Android 取得 accuracy 的文件,解釋了定位精確度。簡單來說,從經緯度的點為中心,畫一個半徑等於此精準度的圓,實際位置有 68% 的機率落在該圓內。(iOS 似乎不是這樣定義,不過總體來說也是越小越精確。)
直接以 OpenStreetMap 為例,當 accuracy 是10的時候,我還知道我在大慶夜市的哪個攤位:
當 accuracy 是100,定位超級飄,在這個圈圈裡都可能是實際定位,我可能根本不在大慶夜市裡了:
同場加映,accuracy 是 0,OSM 可以定位:
沒有 accuracy,提示:Geolocation error: position unavailable.
另外補充:
- 模擬定位在 headless (無頭)模式也可以正確定位,之前看到一些資訊說不行,那很可能是其他問題。
- web driver 如果禁用定位,例如 options 時禁用:
options.add_experimental_option( "prefs", {"profile.default_content_setting_values.geolocation": 2} )
模擬定位就不能使用。 - 可以先用 CDP command 加上權限:
driver.execute_cdp_cmd(
再設定定位。
"Browser.grantPermissions",
{
"permissions": ["geolocation"],
} ) - Google Maps 也可以使用這樣來定位。有些資訊說 Google Maps 以 IP 定位,但實際上是剛載入時抓 IP 位置的國家(OSM也會這樣),而當要精確定位目前位置時,會使用裝置位置,也就是 Emulation.setGeolocationOverride 模擬的座標。
-
目前 Chrome 的許多開發者工具都可以透過 CDP(Chrome DevTools Protocol) 指令來完成。具體有哪些功能可以看看官方文件:https://chromedevtools.github.io/devtools-protocol/