90%的服务器爬虫启动失败非代码问题,而是环境配置错误:chromedriver未正确部署、DISPLAY缺失、Python解释器路径混乱或依赖未装入对应环境;需确认运行用户、显式指定driver路径、启用headless必要参数,并验证系统级网络与DNS连通性。

直接说结论:90% 的服务器爬虫启动失败,不是代码问题,而是环境没配对 —— 尤其是 chromedriver 找不到、DISPLAY 缺失、或 Python 解释器路径错乱。
ModuleNotFoundError: No module named 'selenium' 或 'requests'
这不是“没装”,而是“没装对地方”。Linux 服务器上常存在多个 Python 环境(系统自带的 python3.6、手动编译的 python3.11、conda 环境、虚拟环境),而你用 pip install selenium 装的包,很可能不在你运行脚本时实际调用的那个 Python 解释器的 site-packages 目录下。
- 先确认脚本用的是哪个 Python:
which python3或在脚本开头加import sys; print(sys.executable) - 再用这个解释器来装依赖:
/usr/local/bin/python3.11 -m pip install selenium requests(别只敲pip install) - 强烈建议统一用虚拟环境:
python3 -m venv /opt/mycrawler/venv→source /opt/mycrawler/venv/bin/activate→pip install -r requirements.txt - 检查是否被
sudo干扰:用sudo pip install很可能装到 root 用户的 site-packages,但你的服务是以普通用户(如www-data)运行的,根本看不到那些包
WebDriverException: 'chromedriver' executable needs to be in PATH
这是部署 Selenium 爬虫最典型的报错。服务器没有图形界面,chromedriver 不是“装上就行”,它必须满足三个条件同时成立:
-
chromedriver二进制文件存在且可执行(chmod +x /opt/chromedriver) - 该路径已加入
PATH环境变量(对运行服务的用户生效,不是你 ssh 登录时的 PATH) - 或更稳妥的方式:在代码中显式指定路径:
driver = webdriver.Chrome(executable_path='/opt/chromedriver')(注意:新版 Selenium 4.12+ 已弃用executable_path,改用Service类)
正确写法(Selenium ≥ 4.10):
立即学习“Python免费学习笔记(深入)”;
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
service = Service('/opt/chromedriver')
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome(service=service, options=options)
⚠️ 容易踩的坑:--no-sandbox 必须加,否则非 root 用户无法启动;--disable-dev-shm-usage 是为了解决容器或低内存服务器的共享内存问题。
Message: unknown error: Chrome failed to start: exited abnormally
这个错误后面通常跟着一堆日志,真正原因往往藏在 stderr 里。常见组合原因:
- Chrome 浏览器本体没装(
chromedriver≠chrome):Debian/Ubuntu 上要装google-chrome-stable或chromium-browser;CentOS/RHEL 上需配置 Google 源后安装 - 缺少字体或图形依赖(即使 headless):
sudo apt install fonts-liberation libxss1 libappindicator1 libgbm1(Ubuntu) - SELinux 或 AppArmor 拦截(CentOS/RHEL):临时关闭测试:
sudo setenforce 0;若确认是它,需写对应策略而非永久关 SELinux - 服务以 systemd 启动时,
Environment=DISPLAY=:99这类设置无效 —— headless 模式根本不需要 X server,加了反而干扰
requests.get() 在服务器返回 ConnectionError 或 Timeout,本地却正常
不是网络问题,是服务器出网策略限制。很多云服务器(阿里云、腾讯云)默认禁用外网出口,或只允许走代理;有些内网服务器甚至完全不通公网。
- 先验证基础连通性:
curl -I https://httpbin.org/get(不用 Python,排除解释器干扰) - 如果 curl 失败,说明是系统级网络策略:检查安全组、VPC 路由表、NAT 网关、或公司防火墙白名单
- 如果 curl 成功但 Python 报错,大概率是 DNS 解析失败:在
requests.get()中显式指定timeout和proxies,并加verify=False(仅测试用)看是否 SSL 校验失败 - 更隐蔽的问题:某些服务器的
/etc/resolv.conf里 DNS 是 127.0.0.53(systemd-resolved),而 Python 的某些版本对它兼容不佳,可临时改成8.8.8.8测试
部署爬虫最麻烦的从来不是写代码,而是让每一条依赖路径、每一个环境变量、每一次子进程调用,都精确对齐服务运行时的真实上下文 —— 这些细节不会报错,但会让程序静默失败。动手前,先用 su -s /bin/bash -c 'python3 -c "import sys;print(sys.executable)"' www-data 切换到服务用户身份,逐条验证,比反复重启服务快得多。


















