Selenium爬取商品详情报错:no such window: target window already closed
问题解决思路
核心问题分析
- XPath路径错误:
- 你在
all_products.find_elements里用了//开头的XPath,这会从整个文档根节点查找元素,而非限定在all_products容器内,虽表面获取到48个元素,但实际可能包含无效或重复的元素引用。 - 循环内查找品牌元素时同样用了全局XPath,每次都会返回页面第一个匹配的元素,同时可能因意外触发页面跳转(比如误点到商品链接)导致窗口关闭。
- 你在
- 静态等待不可靠:
time.sleep(1)不足以确保页面完全加载完成,后续元素操作可能因元素未就绪引发异常。 - 元素引用失效:页面动态渲染过程中,部分商品元素可能因滚动、加载等操作变为过时引用,触发窗口或元素找不到的错误。
修正后的代码
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time DRIVER_PATH = '/home/svc/Downloads/chromedriver_linux64/chromedriver' options = Options() options.headless = False options.add_argument("--window-size=1920,1200") # 禁用可能导致窗口异常的特性 options.add_argument("--disable-popup-blocking") options.add_argument("--disable-extensions") driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH) driver.get("https://www.douglas.at/de/c/koerper/koerperreinigung/duschgel/130101") # 显式等待商品列表容器加载完成 wait = WebDriverWait(driver, 10) all_products = wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'product-grid__listing-content')]"))) # 使用相对路径查找容器内的所有商品元素 products = all_products.find_elements(By.XPATH, ".//div[contains(concat(' ', @class, ' '), ' product-grid-column ')]") print("length of the list: ", len(products)) for index, product in enumerate(products): print("------------------ new product ----------------------------") # 滚动到当前商品元素位置,避免元素不可见或引用失效 driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", product) time.sleep(0.5) try: # 相对路径查找当前商品内的元素 product_name = product.text.strip() brand_element = product.find_element(By.XPATH, ".//div[contains(@class, 'text top-brand')]") brand = brand_element.text.strip() print("商品名称:", product_name) print("品牌:", brand) except Exception as e: print(f"第{index+1}个商品获取失败: {str(e)}") continue driver.quit()
关键修改点
- XPath改为相对路径:所有基于父元素的查找都用
.//开头,限定查找范围在当前元素内部,避免全局查找引发的错误。 - 替换静态等待为显式等待:用
WebDriverWait确保商品容器加载完成,提升代码稳定性。 - 添加滚动操作:每次处理商品前滚动到元素位置,避免因元素在视窗外导致的引用失效或操作异常。
- 增加异常捕获:单个商品获取失败时不中断整个循环,便于排查问题。
- 额外配置Chrome选项:禁用弹窗和扩展,减少窗口异常关闭的可能性。
另外,确保你的chromedriver版本与Chrome浏览器版本(110.0.5481.177)完全匹配,版本不一致也可能引发各类窗口驱动错误。
内容的提问来源于stack exchange,提问作者SVC
相关产品推荐
相关产品推荐

