You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用Selenium获取谷歌地图动态加载的经纬度坐标

求助:使用Selenium获取谷歌地图动态加载的经纬度坐标

各位大佬好!我最近在爬取房产网站的房源坐标,遇到了个棘手的问题:点击房源页面的位置按钮后会打开谷歌地图,地图里明明显示了经纬度,但因为元素是动态加载的,我试了定位role="main"的div标签也拿不到数据。目前只能靠解析谷歌地图的URL来提取坐标,但还是想搞懂怎么直接从谷歌地图的页面元素里获取,有没有人能帮我看看?

补充下场景:点击按钮后打开的谷歌地图标签里,坐标是明确显示出来的,但就是定位不到对应的动态元素,试了好几种方法都不行。

可行的解决方案

谷歌地图的页面元素确实是动态渲染的,固定class名经常会变,得用显式等待配合更灵活的定位方式,或者直接从页面的JS变量里拿坐标,下面给你两种靠谱的方法:


方法一:等待坐标元素加载后提取文本

谷歌地图里的经纬度一般会显示在搜索框下方的信息栏里,我们可以用显式等待定位到包含坐标的元素,再拆分文本:

修改后的代码片段:

# 打开房源页面并点击位置按钮
browser.get(link)
browser.maximize_window()
location_button = browser.find_element(By.CSS_SELECTOR, '.sc-ldbotn-0.hdNuPA.sc-yzpzu-3.eLCRYW.hA.bt2.bt1')
sleep(0.5)
browser.execute_script("arguments[0].click();", location_button)

# 切换到新打开的谷歌地图标签页
sleep(1)  # 给标签页加载留一点时间
browser.switch_to.window(browser.window_handles[-1])

# 显式等待坐标元素加载,这里用XPath匹配包含逗号的坐标文本元素
wait = WebDriverWait(browser, 10)
coordinate_element = wait.until(
    EC.presence_of_element_located((By.XPATH, '//div[contains(text(), ", ") and contains(@class, "widget-reveal-card-lat-lng")]'))
)

# 拆分经纬度
coordinate_text = coordinate_element.text.strip()
latitude, longitude = coordinate_text.split(', ')
print(f"提取到的坐标:纬度 {latitude},经度 {longitude}")

方法二:从页面JS变量直接获取坐标

谷歌地图会把坐标存在全局变量里,我们可以直接执行JS脚本读取,这种方法比定位元素更稳定:

# 切换到谷歌地图标签页后,等待地图加载完成
wait = WebDriverWait(browser, 10)
wait.until(EC.presence_of_element_located((By.TAG_NAME, 'iframe')))

# 执行JS获取地图中心坐标
coordinate_obj = browser.execute_script("""
    return new Promise(resolve => {
        google.maps.event.addListenerOnce(map, 'idle', function() {
            resolve(map.getCenter());
        });
    });
""")

latitude = coordinate_obj.lat()
longitude = coordinate_obj.lng()
print(f"提取到的坐标:纬度 {latitude},经度 {longitude}")

几个重要的注意点

  • 一定要切换标签页:点击位置按钮后会打开新的谷歌地图标签,必须用browser.switch_to.window(browser.window_handles[-1])切换过去,不然代码还是在原房源页面瞎忙活。
  • 优先用显式等待代替sleep:sleep()太死板,页面加载慢一点就会报错,显式等待能等元素加载完成再操作,可靠性高很多。
  • 页面结构可能会变:谷歌地图的界面偶尔会更新,如果XPath或者JS脚本失效了,记得重新检查页面元素。

另外,你之前用URL正则提取的方法其实也挺稳定的,可以优化下正则表达式让匹配更精准:

match = re.search(r"@([-+]?\d+\.\d+),([-+]?\d+\.\d+)", current_url)

这样能更好地匹配正负坐标值。

备注:内容来源于stack exchange,提问作者DEEPENDRA SINGH RAO 2348316

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:48:00