AD

2024-12-18

Selenium Chrome WebDriver 進行定位模擬

直接上範例 code:
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/


如果文章有幫助到你可以在 LikeCoin 上幫我拍手喔