Airflow DAG单城市爬取时chromedriver异常退出(状态码-15)求助
解决Airflow中单个城市爬取时ChromeDriver异常退出(状态码-15)的问题
问题描述
在Airflow中运行一个基于城市数组爬取天气信息的DAG:当城市数量≥2时任务执行完全正常;但仅爬取单个城市时,Selenium抛出错误:Service chromedriver unexpectedly exited. Status code was: -15。查不到该状态码的官方解释,代码逻辑未发现明显问题。
启动driver的函数代码:
def start_driver(): localdir = os.path.dirname(os.path.realpath(__file__)) options = webdriver.ChromeOptions() prefs = {'download.default_directory': localdir} os.system('sudo chmod 777 {}'.format(localdir)) options.add_experimental_option('prefs', { "plugins.plugins_list": [{"enabled":False,"name":"Chrome PDF Viewer"}], "download": { "prompt_for_download": False, "default_directory" : localdir } }) options.add_argument('--headless') options.add_argument('--ignore-certificate-errors') # add acceptInsecureCerts capabilities = options.to_capabilities() capabilities['acceptInsecureCerts'] = True root_path = '/home/airflow/airflow/dags' exe_path = os.path.join(root_path, 'chromedriver') driver = webdriver.Chrome(exe_path, chrome_options=options, desired_capabilities=capabilities) return driver
完整报错栈:
Traceback (most recent call last): File "/home/airflow/airflow/dags/scripts/extract.py", line 625, in execute_extraction_task start_crawler(city_list, cursor) File "/home/airflow/airflow/dags/scripts/extract.py", line 231, in start_crawler driver = start_driver() File "/home/airflow/airflow/dags/scripts/extract.py", line 155, in start_driver driver = webdriver.Chrome(exe_path, chrome_options=options, desired_capabilities=capabilities) File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/chrome/webdriver.py", line 73, in __init__ self.service.start() File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/common/service.py", line 98, in start self.assert_process_still_running() File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/common/service.py", line 109, in assert_process_still_running raise WebDriverException( selenium.common.exceptions.WebDriverException: Message: Service chromedriver unexpectedly exited. Status code was: -15
可能的原因及解决方法
1. 单任务执行过快导致资源初始化不充分
单个城市爬取任务执行周期远短于多城市场景,ChromeDriver进程可能还未完成初始化就被后续逻辑触发终止,或是Airflow Worker在短任务调度下出现资源清理异常。
- 解决步骤:
- 在启动driver后添加短时间延迟,保证初始化完成:
import time # 在return driver前添加 time.sleep(2) - 爬取完成后必须调用
driver.quit()(而非driver.close()),确保彻底终止ChromeDriver进程。
- 在启动driver后添加短时间延迟,保证初始化完成:
2. Headless模式下的资源限制或渲染异常
单任务场景下Airflow分配的CPU/内存资源可能不足以支撑ChromeHeadless启动,多任务时则因资源池调度获得了更多资源。
- 解决步骤:
给Chrome添加资源优化相关的启动参数,在options.add_argument('--headless')后追加:options.add_argument('--no-sandbox') # 禁用沙箱,解决部分环境权限问题 options.add_argument('--disable-dev-shm-usage') # 避免/dev/shm空间不足导致崩溃 options.add_argument('--disable-gpu') # 无头模式下无需GPU加速 options.add_argument('--window-size=1920x1080') # 指定窗口大小,避免渲染异常
3. Chromedriver与Chrome版本不兼容
多城市场景下任务执行时间长,版本不兼容问题被延迟掩盖;单任务下初始化速度快,问题直接暴露。
- 解决步骤:
- 执行
google-chrome --version查看Chrome版本 - 下载对应版本的chromedriver替换
/home/airflow/airflow/dags目录下的现有文件 - 给chromedriver添加执行权限:
chmod +x /home/airflow/airflow/dags/chromedriver
- 执行
4. 目录权限设置时机错误
当前代码中os.system('sudo chmod 777 {}'.format(localdir))在设置下载路径prefs之后执行,单任务下可能因权限未及时生效,导致Chrome写入下载目录失败,进而引发driver崩溃。
- 解决步骤:
调整权限设置顺序,先修改目录权限再配置prefs:def start_driver(): localdir = os.path.dirname(os.path.realpath(__file__)) # 先设置目录权限 os.system('sudo chmod 777 {}'.format(localdir)) options = webdriver.ChromeOptions() # 再配置下载偏好 options.add_experimental_option('prefs', { "plugins.plugins_list": [{"enabled":False,"name":"Chrome PDF Viewer"}], "download": { "prompt_for_download": False, "default_directory" : localdir } }) # 其余代码保持不变
5. Airflow Worker调度限制
单城市任务可能触发了Airflow的单任务资源限制,或是Worker进程在短任务后未正确清理环境。
- 解决步骤:
- 检查Airflow配置文件中的
core.parallelism、core.dag_concurrency参数,确保单任务能获得足够资源 - 在DAG定义中给爬取任务添加
retries=2参数,让失败任务自动重试
- 检查Airflow配置文件中的
内容的提问来源于stack exchange,提问作者O. Mortosa
相关产品推荐
相关产品推荐

