Python+Selenium爬取Google Maps遇结果重复、无法滚动加载及翻页问题求助
Google Maps商户爬取问题修复方案
问题1:商户名称重复修复
核心原因
- 你当前定位的
widget-pane-content-holder是整个搜索结果侧边栏的全局唯一容器,entries列表本质上只有1个元素,并非单个商户条目 - 提取名称的Xpath使用了全局匹配符
//,无论基于哪个父元素查询,都会返回整个文档第一个匹配的节点,导致每次循环拿到的都是同一个商户名,重复次数和当前页条目数完全一致
修复逻辑
- 先定位单个商户条目对应的节点,Google Maps搜索结果的单个商户条目通用类名为
Nv2PK - 提取子元素的Xpath要使用相对路径,开头加
.,表示基于当前条目节点向下匹配
问题2:自动滚动加载+自动翻页修复
实现逻辑
- Google Maps结果为懒加载模式,需要滚动侧边结果面板(不是浏览器主窗口)触发加载,直到滚动前后条目数量不再变化,说明当前页所有条目加载完成
- 翻页需要检测底部「下一页」按钮状态,按钮可点击时触发点击,等待新页加载完成后重复滚动+提取流程,直到按钮置灰不可点击为止
完整修复代码
import time import openpyxl from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException, NoSuchElementException # 初始化驱动,你原有的Chrome配置保持不变即可 driver = webdriver.Chrome() driver.get("替换为你的Google Maps搜索链接") time.sleep(3) # 准备Excel文件 path = r'E:\excel\companies.xlsx' wb = openpyxl.load_workbook(path) sheet = wb.worksheets[0] # 定位结果滚动容器 scroll_container = driver.find_element(By.CSS_SELECTOR, 'div[role="main"] div.m6QErb.DxyBCb.kA9KIf.dS8AEf') def scroll_to_load_all(): """滚动加载当前页所有条目""" last_height = driver.execute_script("return arguments[0].scrollHeight", scroll_container) while True: # 滚动到容器底部 driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", scroll_container) time.sleep(2) new_height = driver.execute_script("return arguments[0].scrollHeight", scroll_container) # 滚动后高度无变化说明当前页已加载完成 if new_height == last_height: break last_height = new_height # 循环翻页提取所有结果 while True: # 先加载当前页全部条目 scroll_to_load_all() # 获取当前页所有商户条目 entries = driver.find_elements(By.CLASS_NAME, 'Nv2PK') for entry in entries: try: # 相对路径提取名称,可根据你的页面实际结构调整Xpath name = entry.find_element(By.XPATH, './/div[contains(@class,"qBF1Pd")]').text print(name) sheet.append([name]) except (IndexError, NoSuchElementException): continue # 尝试点击下一页 try: next_btn = WebDriverWait(driver, 3).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[aria-label="下一页"]')) ) next_btn.click() time.sleep(3) except TimeoutException: # 下一页按钮不可点击,说明已经到最后一页 break # 保存Excel并关闭驱动 wb.save(path) driver.quit()
页面参考截图


内容的提问来源于stack exchange,提问作者fast2021
相关产品推荐
相关产品推荐

