如何用Selenium实现Google Maps结果滚动加载?求助获取20所伦敦工程学校
解决Google Maps Selenium滚动加载更多结果的问题
Google Maps的搜索结果采用动态懒加载机制,只有当结果项进入可视区域时才会加载新内容,所以你需要定位结果列表的滚动容器,通过循环滚动触发加载,直到获取到至少20条结果。
修改后的完整代码
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time chrome_options = Options() chrome_options.add_experimental_option("detach", True) driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.google.com/") driver.find_element(By.ID, "L2AGLb").click() driver.get("https://www.google.com/maps") # 等待搜索框加载 time.sleep(3) # 搜索伦敦的工程学校 search_box = driver.find_element(By.ID, "searchboxinput") search_box.send_keys("engineering school in london") search_box.send_keys(Keys.RETURN) # 等待初始结果加载 time.sleep(5) # 定位结果滚动容器(Google Maps的结果列表容器) results_container = driver.find_element(By.XPATH, "//div[@role='feed']") # 循环滚动直到获取至少20条结果 target_count = 20 while True: # 获取当前已加载的结果数量 results = driver.find_elements(By.XPATH, "//a[@class='hfpxzc']") if len(results) >= target_count: break # 滚动到容器底部,触发加载更多 driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", results_container) # 等待新内容加载 time.sleep(2) # 输出前20条结果 for i, result in enumerate(results[:target_count], start=1): print(f"Result {i}: {result.get_attribute('aria-label')}") driver.quit()
关键修改说明
- 定位滚动容器:通过
//div[@role='feed']定位Google Maps的结果列表容器,这是负责滚动加载的核心元素 - 循环滚动逻辑:每次滚动到容器底部后,等待2秒让新内容加载,然后检查结果数量是否达标
- 终止条件:当结果数量达到或超过20时,停止滚动,避免不必要的重复操作
额外提示
- 可以把
time.sleep()替换为Selenium的显式等待(WebDriverWait),让代码更稳定,比如等待新结果元素出现后再继续滚动 - 如果滚动多次后结果数量不再增加,说明已加载完所有结果,此时可以提前终止循环
内容的提问来源于stack exchange,提问作者bouchkira ilias
相关产品推荐
相关产品推荐

