browser - Puppeteer + AWS Lambda - 找不到浏览器修订版
问题描述
我一直试图让 puppeteer 在 AWS Lambda 上工作,但遇到了错误。我收到的消息是:
“错误”:“找不到浏览器修订版 782078。运行“PUPPETEER_PRODUCT=firefox npm install”或“PUPPETEER_PRODUCT=firefox yarn install”以下载支持的 Firefox 浏览器二进制文件。”
我有足够的内存分配给这个特定的 lambda 以在 11 秒左右运行该函数。
该错误仅在冷启动时显示
该功能离线运行良好,100% 成功。LOCAL=true 是离线运行的时候设置的,所以这里有代码可以区分这两者。
这是我的代码中关于这个 lambda 的重要部分。
import chromium from "chrome-aws-lambda";
import { inflate } from "lambdafs";
import path from "path";
const isLocal = !!process.env.LOCAL;
process.env.HOME = "/tmp";
if (process.env.FONTCONFIG_PATH === undefined) {
process.env.FONTCONFIG_PATH = "/tmp/aws";
}
if (process.env.LD_LIBRARY_PATH === undefined) {
process.env.LD_LIBRARY_PATH = "/tmp/aws/lib";
} else if (process.env.LD_LIBRARY_PATH.startsWith("/tmp/aws/lib") !== true) {
process.env.LD_LIBRARY_PATH = [...new Set(["/tmp/aws/lib", ...process.env.LD_LIBRARY_PATH.split(":")])].join(":");
}
let input;
if (!isLocal) {
input = "/opt/nodejs/node_modules/chrome-aws-lambda/bin";
} else {
input = path.resolve(__dirname, "../node_modules/chrome-aws-lambda/bin");
}
const blockedResourceTypes = ["image", "media", "font", "texttrack", "object", "beacon", "csp_report", "imageset"];
const skippedResources = [
"quantserve",
"adzerk",
"doubleclick",
"adition",
"exelator",
"sharethrough",
"cdn.api.twitter",
"google-analytics",
"googletagmanager",
"fontawesome",
"facebook",
"analytics",
"optimizely",
"clicktale",
"mixpanel",
"zedo",
"clicksor",
"tiqcdn",
];
export async function handler(event) {
const credentials = {
userName: event.userName,
password: event.password,
site_login_id: event.site_login_id,
user_id: event.juice_userid,
};
let chrome, aws, shader;
(async () => {
chrome = await inflate(`${input}/chromium.br`);
shader = await inflate(`${input}/swiftshader.tar.br`);
aws = await inflate(`${input}/aws.tar.br`);
})();
const chromePath = isLocal ? undefined : chrome;
const puppeteer = chromium.puppeteer;
const browser = await puppeteer.launch({
args: chromium.args,
defaultViewport: chromium.defaultViewport,
executablePath: chromePath,
ignoreDefaultArgs: ["--disable-extensions"],
headless: true,
});
}
解决方案
您似乎自己正在对铬文件进行放气,这不是chrome-aws-lambda
应有的使用方式。
这是一个非常简单的片段,展示了如何在 lambda 环境中启动 puppeteer:
const chromium = require('chrome-aws-lambda');
const handler = async () => {
let result = null;
let browser = null;
try {
browser = await chromium.puppeteer.launch({
args: chromium.args,
defaultViewport: chromium.defaultViewport,
executablePath: await chromium.executablePath,
headless: chromium.headless,
ignoreHTTPSErrors: true,
});
let page = await browser.newPage();
await page.goto(event.url || 'https://example.com');
result = await page.title();
} catch (error) {
// handle error
} finally {
if (browser !== null) {
await browser.close();
}
}
};
module.exports = { handler };
chrome-aws-lambda
处理必要资源的放气时await chromium.executablePath
,您可以在源代码中看到这一点。
推荐阅读
- arcore - 如何使用 SceneForm 从 ViewRenderable / Node 创建位图?
- html - 带有文本的 Jquery load() 方法
- javascript - 调用 API 后,我无法检测到 innerHTML 中的 api 数据
- scala - 依赖类型的类型类实例
- python - 使用嵌套字典中列出的条件创建和填充新列
- google-cloud-dataflow - Google 对数据流生成的数据流作业日志收费
- vb.net - 将Datagidview值传递给Vb.net MS Access中的Cystal Report Sub-Report
- c# - 如何在覆盖函数中调用异步 api
- pixi.js - 仅在交互时更新 pixi.js 中的帧
- jsf - 展开的 SelectOneMenu 在滚动 DataTable 时保持位置