Selenium Chrome驱动循环爬取时多类报错原因及修复方法咨询
Chrome WebDriver循环爬取报错原因及修复方案
1. 各报错原因分析
- Debian第一类报错(Connection refused/Max retries exceeded)
原因:Chrome进程异常崩溃导致WebDriver和浏览器的连接中断,长时间循环爬取时内存溢出、共享内存不足、Chrome进程没有正确销毁重复启动都会触发该问题。你当前配置中的--disable-dev-sh-usage为拼写错误,参数未生效,Debian默认/dev/shm容量很小,内存不足时Chrome直接崩溃,就会拒绝WebDriver的连接请求。 - Debian第二类报错(无法定位XPath元素)
原因:要么是页面未加载完成就执行了元素查找逻辑,要么是页面触发反爬机制返回了和预期不符的结构,另外headless模式的页面渲染和正常模式存在差异,元素加载逻辑不同也会导致查找失败。 - MacOS报错(DevToolsActivePort file doesn't exist)
原因:MacOS下Chrome启动时权限不足、未指定正确的调试端口、headless模式参数冲突。当前启动配置缺少--remote-debugging-port参数,Chrome启动时无法生成DevTools的端口文件,WebDriver检测不到Chrome进程就会判定为崩溃。
2. 具体修复方案
2.1 修正Chrome启动配置
先修复原有配置的拼写错误,新增适配双系统的必要参数:
options.add_argument('--no-sandbox') options.add_argument('--headless') options.add_argument('--disable-blink-features=AutomationControlled') options.add_experimental_option("excludeSwitches", ['enable-automation']) options.add_experimental_option('useAutomationExtension', False) options.add_argument('--disable-notifications') options.add_argument('--disable-extensions') options.add_argument("--disable-plugins-discovery") # 修正原拼写错误的参数 options.add_argument('--disable-dev-shm-usage') options.add_argument(f'window-size={resol}') # 新增通用适配参数 options.add_argument('--remote-debugging-port=9222') options.add_argument('--disable-gpu') options.add_argument('--no-zygote') options.add_argument('--disable-setuid-sandbox')
2.2 各报错针对性修复
- 针对Debian Connection refused报错
- 每次循环结束后手动调用
driver.quit()销毁进程,不要仅使用driver.close(),避免残留僵尸进程占用端口和内存 - 每次启动新Driver前执行
pkill -f chrome命令杀掉残留Chrome进程 - 按需调高Debian系统
/dev/shm分区容量,避免内存不足触发Chrome崩溃
- 每次循环结束后手动调用
- 针对无法定位元素报错
- 替换强制等待为显式等待,示例逻辑:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 最多等待10秒直到目标元素加载完成 element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//input[@name='name']")) )- 查找元素前先校验当前页面的标题或特征元素是否符合预期,排除反爬返回异常页面的情况
- 针对MacOS DevToolsActivePort报错
- 确认Chrome和ChromeDriver的大版本号完全匹配,版本不一致会大概率触发启动异常
- 若使用root用户运行脚本,必须保留
--no-sandbox参数,MacOS下root用户默认无法无沙箱启动Chrome - 启动前杀掉残留的Chrome进程,避免调试端口被占用
内容的提问来源于stack exchange,提问作者Inksis
相关产品推荐
相关产品推荐

