求助:使用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
相关产品推荐
相关产品推荐

