EC2 Amazon Linux环境下Selenium出现SessionNotCreatedException本地正常
解决Amazon Linux EC2上Root用户运行Selenium Chrome爬虫的启动失败问题
问题重现
在Amazon Linux EC2实例上以root用户运行Selenium爬虫时,Chrome启动失败,报错DevToolsActivePort file doesn't exist或超时退出,即使Chrome和ChromeDriver版本匹配(均为121.0.6167.85),本地运行正常,此前EC2上也能正常运行。
关键修复步骤
问题核心在于root用户运行Chrome无头模式的权限限制,以及部分参数缺失/拼写错误,以下是针对性修复:
- 修正参数拼写错误:原代码中
--no-sand box存在空格,改为--no-sandbox - 添加root运行允许参数:
--allow-root,Chrome默认禁止root用户启动 - 禁用/dev/shm限制:添加
--disable-dev-shm-usage,避免EC2实例上/dev/shm空间不足导致崩溃 - 使用新版无头模式:将
--headless改为--headless=new,新版无头模式兼容性更好 - 指定临时用户数据目录:添加
--user-data-dir=/tmp/chrome-user-data,避免权限问题导致无法创建用户数据目录
修改后的完整初始化代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.options import Options options = Options() options.add_argument('--disable-application-cache') # 新版无头模式 options.add_argument('--headless=new') # 修正拼写错误的沙箱参数 options.add_argument('--no-sandbox') # 允许root用户运行 options.add_argument('--allow-root') # 禁用/dev/shm限制 options.add_argument('--disable-dev-shm-usage') # 指定临时用户数据目录 options.add_argument('--user-data-dir=/tmp/chrome-user-data') options.add_argument("--window-size=1920,1080") # 固定指定对应版本的ChromeDriver service = Service(ChromeDriverManager(driver_version="121.0.6167.85").install()) driver = webdriver.Chrome(service=service, options=options) ... scraping code ... driver.quit()
额外验证步骤
- 确认Chrome和ChromeDriver权限:执行
chmod +x /usr/bin/chromedriver和chmod +x /usr/bin/google-chrome,确保文件可执行 - 手动测试Chrome启动:在EC2终端执行
google-chrome --headless=new --no-sandbox --allow-root --disable-dev-shm-usage --user-data-dir=/tmp/chrome-user-data --window-size=1920,1080 --dump-dom https://www.google.com,验证Chrome能否正常启动并获取页面内容
内容的提问来源于stack exchange,提问作者user406139
相关产品推荐
相关产品推荐

