Python 3.9 AWS Lambda环境中Pyppeteer启动浏览器失败:Browser closed unexpectedly问题求助
Python 3.9 AWS Lambda环境中Pyppeteer启动浏览器失败:Browser closed unexpectedly问题求助
我有一个Python函数,用来爬取网站日程并上传到RDS数据库。在本地机器上(Pyppeteer 2.0.0,Python 3.12)运行完全正常,但迁移到AWS Lambda后,浏览器总是启动失败。
我使用了对应Pyppeteer版本的Chromium可执行文件(从npm i chrome-aws-lambda@~2.0.2的/bin目录提取,上传到了权限配置正确的S3桶),Lambda函数里用pip3 install pyppeteer -t .安装了对应版本的Pyppeteer。我的Python代码会先把Chromium实例下载到/tmp目录,然后尝试用Pyppeteer从这个路径启动浏览器。Lambda运行时只能用Python 3.9,因为这是psycopg2._psycopg支持的最新版本,但我觉得这不是问题所在。
有没有人知道为什么在AWS Lambda运行时里浏览器启动失败?我怀疑可能是launch()函数的参数有问题,但不知道从哪里入手排查。
启动浏览器的代码片段
browser = await launch( headless=True, args=[ '--no-sandbox', '--disable-setuid-sandbox', '--disable-gpu', "--single-process", "--disable-dev-shm-usage", "--no-zygote", ], executablePath="/tmp/headless-chromium", userDataDir="/tmp", )
Lambda控制台的错误信息
Status: Failed Test Event Name: testEvent Response: { "errorMessage": "Browser closed unexpectedly:\n", "errorType": "BrowserError", "requestId": "a6a20222-6082-4618-b388-fbd4c88bda7d", "stackTrace": [ " File \"/var/task/lambda_function.py\", line 369, in lambda_handler\n shows = asyncio.run(scrape_all_schedules())\n", " File \"/var/lang/lib/python3.9/asyncio/runners.py\", line 44, in run\n return loop.run_until_complete(main)\n", " File \"/var/lang/lib/python3.9/asyncio/base_events.py\", line 647, in run_until_complete\n return future.result()\n", " File \"/var/task/lambda_function.py\", line 225, in scrape_all_schedules\n browser = await launch(\n", " File \"/var/task/pyppeteer/launcher.py\", line 307, in launch\n return await Launcher(options, **kwargs).launch()\n", " File \"/var/task/pyppeteer/launcher.py\", line 168, in launch\n self.browserWSEndpoint = get_ws_endpoint(self.url)\n", " File \"/var/task/pyppeteer/launcher.py\", line 227, in get_ws_endpoint\n raise BrowserError('Browser closed unexpectedly:\\n')\n" ] } Function Logs: Request ID: a6a20222-6082-4618-b388-fbd4c88bda7d
完整代码
import asyncio from datetime import datetime from pyppeteer import launch import os import psycopg2 import boto3 async def scrape_all_schedules(): current_day = datetime.now() download_chromium() chromium_path = '/tmp/headless-chromium' if os.path.exists(chromium_path): print("Chromium binary found. Launching browser...") else: print(f"Error: Chromium binary not found at {chromium_path}") browser = await launch( headless=True, args=[ '--no-sandbox', '--disable-setuid-sandbox', '--disable-gpu', "--single-process", "--disable-dev-shm-usage", "--no-zygote", ], executablePath="/tmp/headless-chromium", userDataDir="/tmp", ) page = await browser.newPage() def lambda_handler(event, context): print("Starting scraping process...") shows = asyncio.run(scrape_all_schedules()) return { 'statusCode': 200, 'body': f"Successfully saved {len(shows)} shows to the database." }
备注:内容来源于stack exchange,提问作者John Carraher
相关产品推荐
相关产品推荐

