Undetected Chrome Driver随机停止(闲置问题)求助
问题解决方案
以下是针对Undetected Chrome Driver随机停滞问题的具体修复方案:
1. 修复无效命令行参数
你的代码中----disable-javascript多了一个短横线,无效参数会导致Chrome启动或运行异常,应改为:
options.add_argument('--disable-javascript')
2. 优化Headless模式与稳定参数
添加更适合Headless运行的参数,避免渲染或检测问题:
options.add_argument('--headless=new') # 使用新版Headless模式,兼容性更好 options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--window-size=1920x1080')
3. 调整页面加载策略
默认加载策略会等待所有资源加载完成,容易引发超时或停滞,改为仅等待DOM加载完成:
options.page_load_strategy = 'eager'
4. 增加重试机制与异常捕获
针对偶然的网络或加载问题,添加重试逻辑,同时捕获更多异常类型:
max_retries = 3 for link in url[:166]: retries = 0 success = False while retries < max_retries and not success: try: driver.get(link) success = True except TimeoutException: retries += 1 print(f"Timeout, retrying {retries}/{max_retries} for {link}") except Exception as e: print(f"Error loading {link}: {str(e)}") retries += 1
5. 定期清理状态与重启Driver
长时间运行Driver易积累缓存或内存泄漏,每处理一定数量链接后重启Driver,并清理浏览器状态:
batch_size = 20 # 每20个链接重启一次 for idx, link in enumerate(url[:166], 1): if idx % batch_size == 0: driver.quit() driver = uc.Chrome(use_subprocess=True, options=options, service=Service(ChromeDriverManager().install())) driver.set_page_load_timeout(10) # 执行加载逻辑后清理状态 driver.delete_all_cookies() driver.execute_script("window.localStorage.clear();")
完整优化代码
from selenium.common.exceptions import TimeoutException import undetected_chromedriver as uc from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager # 初始化浏览器配置 options = uc.ChromeOptions() options.add_argument('--disable-extensions') options.add_argument('--disable-javascript') options.add_argument('--headless=new') options.add_argument('--disable-backgrounding-occluded-windows') options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--window-size=1920x1080') options.page_load_strategy = 'eager' # 设置DOM加载完成即停止等待 def init_driver(): """封装Driver初始化逻辑,方便重启调用""" return uc.Chrome(use_subprocess=True, options=options, service=Service(ChromeDriverManager().install())) driver = init_driver() driver.set_page_load_timeout(10) # 读取链接并过滤空行 with open('PlayerLinks.txt', 'r') as file: url = [line.strip() for line in file if line.strip()] batch_size = 20 max_retries = 3 for idx, link in enumerate(url[:166], 1): # 定期重启Driver if idx % batch_size == 0: driver.quit() driver = init_driver() driver.set_page_load_timeout(10) # 重试加载逻辑 retries = 0 success = False while retries < max_retries and not success: try: driver.get(link) success = True # 清理浏览器状态 driver.delete_all_cookies() driver.execute_script("window.localStorage.clear();") except TimeoutException: retries += 1 print(f"Timeout, retrying {retries}/{max_retries} for {link}") except Exception as e: print(f"Error loading {link}: {str(e)}") retries += 1 print(f"Processed {idx}/166: {link}") # 最后关闭Driver driver.quit()
内容的提问来源于stack exchange,提问作者Abdelrhman Elsherif
相关产品推荐
相关产品推荐

