如何在AWS Lambda中运行ChromeDriver?网页爬虫遇chromedriver意外退出(状态码127)问题求助
这个错误码127我太熟悉了!在Lambda环境里跑ChromeDriver几乎是必踩的坑,大概率是下面这几个原因导致的,一个个排查:
二进制文件不兼容Lambda环境
Lambda默认用的是Amazon Linux 2系统(部分旧函数可能是Amazon Linux),如果你本地是Mac/Windows/x86 Ubuntu,直接把本地的ChromeDriver或者Chrome打包到Layer里肯定不行——系统架构和依赖完全不匹配。你得下载对应Amazon Linux 2版本的Chrome和ChromeDriver,而且要确保两者版本严格对应(比如Chrome 114对应ChromeDriver 114)。缺少Chrome浏览器二进制文件
很多人只把ChromeDriver放到Layer里,忘了Chrome本身!ChromeDriver只是驱动,必须搭配Chrome浏览器才能运行。你需要把Chrome的二进制文件(比如google-chrome-stable)也放到/opt目录下,然后在代码里指定它的路径:options.binary_location = "/opt/google-chrome-stable"系统依赖缺失
Chrome运行需要很多系统库(比如glibc、libX11、libasound这些),Lambda的基础执行环境里没有这些依赖。解决办法有两个:- 手动把这些依赖从Amazon Linux 2系统里拷贝出来,和Chrome、ChromeDriver一起打包到Layer;
- 直接用现成的打包好Chrome+ChromeDriver+所有依赖的Layer,省得自己折腾。
文件权限不足
打包Layer的时候,要确保chromedriver和Chrome二进制文件有可执行权限。在打包前执行chmod +x chromedriver google-chrome-stable,不然Lambda执行时会因为没有权限运行二进制文件而报错127。
最后调整下你的代码,加上必要的参数和Chrome二进制路径指定:
chrome_driver_path = "/opt/chromedriver" options = Options() options.add_argument('--headless') options.add_argument('--no-sandbox') # Lambda环境必须加这个参数 options.add_argument('--disable-dev-shm-usage') # 解决Lambda临时空间不足的问题 options.add_argument("user-agent=Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36") options.binary_location = "/opt/google-chrome-stable" # 新增指定Chrome路径 driver = webdriver.Chrome(executable_path=chrome_driver_path, options=options)
内容的提问来源于stack exchange,提问作者E_K

