You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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进程。

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版本不兼容

多城市场景下任务执行时间长,版本不兼容问题被延迟掩盖;单任务下初始化速度快,问题直接暴露。

  • 解决步骤:
    1. 执行google-chrome --version查看Chrome版本
    2. 下载对应版本的chromedriver替换/home/airflow/airflow/dags目录下的现有文件
    3. 给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参数,让失败任务自动重试

内容的提问来源于stack exchange,提问作者O. Mortosa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:33:24