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

在Docker中运行Python Selenium爬虫应用遇问题求解决方案

问题分析与修复方案

现有配置与代码中的错误

  • 变量名错误:代码中driver = webdriver.Chrome(executable_path=driverPath,options=option)里的option未定义,应该是chrome_options
  • 驱动管理工具冲突:Docker中已手动下载chromedriver,同时又依赖webdriver-manager/chromedriver-py,极易引发版本不匹配问题
  • Chrome与Chromedriver版本不兼容:Docker安装的是最新版google-chrome-stable,但requirements.txt指定chromedriver-py==103.0.5060.53,版本差异会直接导致驱动启动失败
  • Chrome启动参数不全:仅添加--no-sandbox不足以适配Docker环境,缺少无头模式、共享内存优化等关键参数
  • 显示服务配置混乱:run.sh注释了Xvfb启动,同时代码中调用pyvirtualdisplay,两者重复且未正确关联,导致显示环境异常
  • Tkinter错误根源:代码中可能隐含调用了Tkinter(如导出/可视化逻辑),在无显示环境下触发该错误

修复步骤

1. 修正爬虫代码

统一Chrome配置,移除冗余驱动工具,正确处理显示环境:

import platform
import os
from selenium import webdriver

# 处理Linux环境下的显示变量
if platform.system() == 'Linux':
    os.environ['DISPLAY'] = ':99'
    # 禁用Tkinter GUI(若爬虫无需相关功能)
    os.environ['PYTHONUNBUFFERED'] = '1'

# 配置Chrome核心参数
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--headless=new')  # 新版Chrome推荐的无头模式
chrome_options.add_argument('--disable-dev-shm-usage')  # 解决Docker共享内存不足问题
chrome_options.add_argument('--window-size=1920,1080')
chrome_options.add_argument('--disable-gpu')

# 启动虚拟显示(二选一:代码内启动pyvirtualdisplay,或通过run.sh启动Xvfb)
if platform.system() == 'Linux':
    from pyvirtualdisplay import Display
    display = Display(visible=0, size=(1920, 1080))
    display.start()

# 使用Docker中预安装的chromedriver
driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver', options=chrome_options)

# 你的爬虫业务逻辑...

# 清理资源
driver.quit()
if platform.system() == 'Linux':
    display.stop()

2. 调整Dockerfile,保证版本匹配

精简镜像体积,确保Chrome与Chromedriver版本完全一致:

FROM python:3.10-slim

# 安装依赖与Chrome
RUN apt-get update && apt-get install -y --no-install-recommends \
    wget curl unzip xvfb libglib2.0-0 libnss3 libgconf-2-4 libfontconfig1 \
    && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
    && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list \
    && apt-get update && apt-get install -y google-chrome-stable \
    # 下载与当前Chrome匹配的chromedriver
    && CHROME_VERSION=$(google-chrome --version | grep -oP '\d+\.\d+\.\d+\.\d+') \
    && wget -O /tmp/chromedriver.zip https://chromedriver.storage.googleapis.com/$(curl -sS https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_VERSION%.*})/chromedriver_linux64.zip \
    && unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/ \
    && chmod +x /usr/local/bin/chromedriver \
    # 清理缓存减小镜像体积
    && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/*

ENV DISPLAY=:99

# 创建工作目录并复制文件
RUN mkdir -p /app/csv
COPY requirements.txt /app/
COPY sample.py /app/
COPY run.sh /app/
WORKDIR /app

# 安装Python依赖
RUN pip install --no-cache-dir -r requirements.txt

CMD ./run.sh

3. 修改run.sh,正确启动显示服务

推荐使用系统级Xvfb(比pyvirtualdisplay更稳定):

#!/bin/sh
# 启动Xvfb虚拟显示服务
Xvfb :99 -screen 0 1920x1080x24 -nolisten tcp &
# 启动爬虫脚本
python3 ./sample.py

4. 更新requirements.txt,移除冗余依赖

selenium==4.3.0
pyvirtualdisplay==3.0
# 移除webdriver-manager和chromedriver-py,避免版本冲突

关键注意事项

  • 版本一致性:Chrome与Chromedriver的主版本必须完全匹配,否则驱动会直接启动失败
  • 无头模式选型:新版Chrome优先使用--headless=new,避免旧无头模式的兼容性问题
  • 镜像优化:Docker中清理apt缓存可大幅减小镜像体积
  • 权限配置:--no-sandbox是Docker环境下运行Chrome的必填参数

内容的提问来源于stack exchange,提问作者Chitraveer Akhil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:54:51