如何使用Python Selenium实现谷歌地图页面向下滚动
核心问题
- 选择器失效:代码中使用的
div[jstcache="211"]无法稳定定位到可滚动容器。谷歌地图的jstcache属性是前端动态生成的,页面刷新、版本迭代后属性值都会变化,大概率匹配到非滚动区域的普通div元素。 - 滚动判断逻辑错误:初始滚动高度取的是全局
document.body的高度,后续取的是指定div的滚动高度,二者对比基准不一致,高度变化判断完全失效。 - 缺少前置聚焦步骤:谷歌地图的搜索结果面板需要先获得焦点,滚动操作才会触发内容加载,直接对未聚焦的元素调用滚动API不会产生效果。
- 如果你使用Selenium 4及以上版本,旧的
find_element_by_css_selector接口已经被废弃,调用会直接抛错,需要使用新的定位写法。
可直接运行的修正代码
定位可滚动容器时不要使用动态的jstcache属性,谷歌地图搜索结果面板有固定的role="feed"属性,跨版本稳定不会变化。
import time from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def scroll(self): SCROLL_PAUSE_TIME = 2 MAX_SCROLL_LIMIT = 20 # 防止无限循环,可根据实际需求调整 scroll_count = 0 # 等待可滚动面板加载完成,使用固定属性定位 scroll_container = WebDriverWait(self, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'div[role="feed"]')) ) # 点击容器获取焦点 scroll_container.click() time.sleep(0.5) # 统一取容器自身的初始滚动高度,不要取body高度 last_height = self.execute_script("return arguments[0].scrollHeight", scroll_container) while scroll_count < MAX_SCROLL_LIMIT: scroll_count += 1 # 直接滚动到容器当前底部,触发新内容加载 self.execute_script("arguments[0].scrollTo(0, arguments[0].scrollHeight);", scroll_container) # 等待新结果加载 time.sleep(SCROLL_PAUSE_TIME) # 计算新的滚动高度 new_height = self.execute_script("return arguments[0].scrollHeight", scroll_container) # 高度无变化说明已经滚动到最底部,直接退出循环 if new_height == last_height: break last_height = new_height
兼容方案
如果上述JS滚动方式在你的场景下依然不生效,可以替换为模拟键盘翻页的方式,兼容性更强:
# 替换掉JS滚动的代码,聚焦容器后发送翻页按键即可 scroll_container.send_keys(Keys.PAGE_DOWN)
注意事项
- 不要使用任何带
jstcache属性的选择器定位谷歌地图元素,这类属性值均为动态生成,稳定性为0。 - 滚动暂停时间设置为2-3秒即可,谷歌地图的列表结果加载速度很快,设置5秒会大幅降低操作效率。
- 如果需要滚动的是地图主界面而非侧边搜索结果列表,定位的容器改为匹配
div[role="application"]的地图画布元素即可,滚动逻辑完全一致。
内容的提问来源于stack exchange,提问作者glitch_123
相关产品推荐
相关产品推荐

