使用Selenium爬取谷歌地图搜索结果网址时遇超时问题求助
问题
我尝试用Python结合Selenium通过谷歌地图搜索,获取搜索结果里的网站网址,操作步骤如下:
- 打开谷歌页面
- 接受Cookie
- 搜索目标内容(示例:“阿尔高州儿科医生”)
- 切换到谷歌地图标签页
但遇到超时错误,明明窗口里结果已经加载完成,延长等待时间也没用,应该是元素定位的问题,求修改代码实现提取网站网址的需求。
当前代码:
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 # Start the browser driver = webdriver.Chrome() # Open google.de and accept cookies driver.get("https://www.google.de/") wait = WebDriverWait(driver, 25) wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#L2AGLb > div"))).click() # Search for "Kinderarzt Kanton Aargau" search_box = driver.find_element(By.NAME, "q") search_box.send_keys("Kinderarzt Kanton Aargau") search_box.submit() # Switch to Maps tab wait.until(EC.element_to_be_clickable((By.XPATH, "//a[contains(text(), 'Maps')]"))).click() # Wait for links and extract results = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div[aria-label^='Results for'] > div > div > a"))) for result in results: link = result.get_attribute("href") print(link) # Close the browser driver.quit()
解决方案
核心问题是元素定位器不匹配谷歌地图的实际DOM结构,且切换标签页后未切换窗口句柄,导致在旧页面等待不存在的元素。
关键修改点
- 切换窗口句柄:点击Maps标签会打开新标签页,必须切换到新窗口才能定位地图内的元素
- 更换结果元素定位器:谷歌地图侧边栏结果项用
div[data-id]标识,网站链接可通过a[data-item-id='authority']精准定位
修改后的代码
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 # 启动浏览器并最大化窗口 driver = webdriver.Chrome() driver.maximize_window() # 打开谷歌并接受Cookie driver.get("https://www.google.de/") wait = WebDriverWait(driver, 25) wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#L2AGLb > div"))).click() # 搜索目标内容 search_box = wait.until(EC.visibility_of_element_located((By.NAME, "q"))) search_box.send_keys("Kinderarzt Kanton Aargau") search_box.submit() # 切换到Maps标签页并切换窗口句柄 maps_tab = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[contains(text(), 'Maps')]"))) maps_tab.click() driver.switch_to.window(driver.window_handles[-1]) # 等待结果加载并提取网站链接 wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div[data-id]"))) result_items = driver.find_elements(By.CSS_SELECTOR, "div[data-id]") for item in result_items: try: website_link = item.find_element(By.CSS_SELECTOR, "a[data-item-id='authority']") print(website_link.get_attribute("href")) except: # 跳过无网站的结果项 continue # 关闭浏览器 driver.quit()
额外说明
- 加入
driver.maximize_window()避免因窗口过小导致元素被遮挡 - 搜索框改用
visibility_of_element_located等待,稳定性更高 - 增加异常捕获,避免因部分结果无网站导致程序中断
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

