AWS EC2 Ubuntu实例上Python-Selenium-Chromedriver报ConnectionResetError求助
我之前在AWS EC2 Ubuntu实例上部署无头Chrome+Selenium时也碰到过几乎一模一样的问题,结合你的环境和症状,大概率是下面几个核心原因导致的,咱们逐个排查:
1. 无头Chrome依赖的系统库缺失
本地机器一般有完整的桌面环境,Chrome运行需要的依赖都默认存在,但Ubuntu 16.04服务器版本是最小化安装,缺少很多图形相关的依赖库,这会导致Chrome启动失败,进而触发ConnectionResetError(因为Selenium连不上刚启动就崩溃的Chrome进程)。
解决方法:
安装Chrome必需的依赖包:
sudo apt-get update && sudo apt-get install -y libxss1 libappindicator1 libindicator7 libgconf-2-4
另外还要确保你已经安装了对应版本的Chrome浏览器(Chromedriver 2.34对应Chrome 61~63版本),可以用以下命令安装Chrome 62:
wget https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_62.0.3202.94-1_amd64.deb sudo dpkg -i google-chrome-stable_62.0.3202.94-1_amd64.deb sudo apt-get -f install # 修复依赖问题
2. Chromedriver与Chrome版本不兼容
你提到用了Chromedriver 2.34,但如果服务器上安装的Chrome版本不在61~63范围内,就会出现驱动和浏览器不匹配的情况,导致Chrome无法正常启动,Selenium连接被重置。
解决方法:
先检查服务器上的Chrome版本:
google-chrome --version
如果版本不匹配,要么安装对应版本的Chrome(参考上面的命令),要么下载和当前Chrome版本匹配的Chromedriver,替换掉现有驱动。
3. 无头模式启动参数不全
服务器环境下,无头Chrome需要显式设置一些关键参数才能稳定运行,本地可能因为有桌面环境默认兼容,但服务器上必须手动添加:
推荐的Selenium配置参数:
from selenium import webdriver chrome_options = webdriver.ChromeOptions() # 启用无头模式 chrome_options.add_argument('--headless') # 禁用沙箱模式(Ubuntu服务器环境下必须,否则Chrome会崩溃) chrome_options.add_argument('--no-sandbox') # 解决/dev/shm空间不足的问题 chrome_options.add_argument('--disable-dev-shm-usage') # 禁用GPU(无头模式不需要) chrome_options.add_argument('--disable-gpu') # 模拟真实浏览器的User-Agent,避免被目标网站反爬拦截 chrome_options.add_argument('--user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36') driver = webdriver.Chrome(chrome_options=chrome_options)
其中--no-sandbox和--disable-dev-shm-usage是服务器环境下的必备参数,很多人会漏掉这两个导致连接重置。
4. 文件权限问题
如果运行Python脚本的用户没有访问Chromedriver或Chrome的权限,也会导致进程启动失败,触发连接重置。
解决方法:
- 确保Chromedriver有可执行权限:
chmod +x /path/to/your/chromedriver
- 检查Chrome的安装路径权限,确保运行脚本的用户能访问
/usr/bin/google-chrome(默认安装路径)。
5. 目标网站的反爬拦截
你提到Robobrowser能正常操作,而Selenium不行,这有可能是目标网站检测到了无头Chrome的特征(比如特定的User-Agent、窗口尺寸、JS特征等),直接拒绝了连接。
解决方法:
除了上面添加的User-Agent参数,还可以增加更多模拟真实浏览器的参数:
# 禁用自动化扩展提示 chrome_options.add_argument('--disable-extensions') # 设置窗口尺寸 chrome_options.add_argument('--window-size=1920,1080') # 禁用浏览器控制条提示 chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option('useAutomationExtension', False)
这些参数可以降低无头Chrome的“自动化特征”,避免被反爬机制识别。
内容的提问来源于stack exchange,提问作者SteveJ




