在AWS上用Python运行ChromeDriver遇错求助:Selenium找不到Chrome二进制文件
嘿,我帮你拆解下这个问题——你遇到的unknown error: cannot find Chrome binary,核心是Selenium找不到Chrome浏览器的可执行文件,而不是你指定的chromedriver路径有问题!毕竟本地能正常跑是因为你电脑上预装了Chrome,但AWS EC2实例默认是不带Chrome浏览器的,这大概率就是问题根源。下面一步步帮你搞定:
第一步:先确认EC2上有没有装Chrome
先SSH登录你的EC2实例,敲这个命令检查Chrome是否存在:
which google-chrome
如果啥输出都没有,说明Chrome完全没装,得先安装。根据你的EC2操作系统(一般是Amazon Linux 2或者Ubuntu),选对应的命令执行:
要是用的Amazon Linux 2:
sudo amazon-linux-extras install epel -y sudo yum install google-chrome-stable -y
要是用的Ubuntu:
sudo apt update sudo apt install google-chrome-stable -y
装完再跑一遍which google-chrome,会输出类似/usr/bin/google-chrome的路径,记下来,这就是Chrome的二进制文件位置。
第二步:修改你的Selenium代码,指定Chrome路径
你之前的代码只给了chromedriver的路径,但没告诉Selenium Chrome浏览器在哪。得用ChromeOptions来配置这个路径,顺便加上AWS环境必须的无头模式参数(毕竟EC2没图形界面),修改后的代码如下:
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_path = "/home/ec2-user/chrome/chromedriver" # 配置Chrome选项,指定浏览器二进制文件路径 chrome_options = Options() chrome_options.binary_location = "/usr/bin/google-chrome" # 这里填你刚才查到的路径 # 关键:AWS环境必须开无头模式,加几个参数避免权限/内存问题 chrome_options.add_argument("--headless") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") # 初始化driver时传入配置 driver = webdriver.Chrome(executable_path=chrome_path, options=chrome_options) book_categories_list = [] for i in asin: try: url = u"https://www.amazon.com/dp/" + i # 补全你的完整URL # 这里写你的爬取逻辑... except Exception as e: print(f"处理ASIN {i}时出错: {str(e)}") continue
第三步:务必确保Chrome和chromedriver版本匹配
划重点!这是很多人踩坑的地方——如果chromedriver和Chrome版本不兼容,照样会出问题。你可以用这两个命令查版本:
- 查Chrome版本:
google-chrome --version - 查chromedriver版本:
/home/ec2-user/chrome/chromedriver --version
要是版本不匹配,就下载和Chrome对应的chromedriver,上传到EC2的/home/ec2-user/chrome/目录替换掉旧的即可。
第四步:检查chromedriver的权限
最后别忘了给chromedriver加可执行权限,不然EC2跑不了:
chmod +x /home/ec2-user/chrome/chromedriver
额外提醒几个坑
- EC2默认用户是
ec2-user,确保你放chromedriver的路径和安装的Chrome都是这个用户能访问的 - 无头模式的三个参数一定要加,没图形界面的服务器上Chrome必须这么跑
--no-sandbox和--disable-dev-shm-usage是为了规避Linux环境下的权限限制和临时内存不足问题
按上面的步骤操作完,应该就能解决这个错误了。如果还是不行,把你执行命令的输出和完整的错误日志贴出来,我再帮你排查!
内容的提问来源于stack exchange,提问作者Jake Park

