Как использовать функции AWS Lambda с Chromium/Puppeteer
Table Of Content
Привет всем, перейдем к следующему посту? Я пишу это, потому что несколько дней назад я пытался создать скрипт для парсинга с использованием функции AWS Lambda... я столкнулся с множеством проблем... так что давайте начнем.
Создайте папку и выполните команду
npm init
Отредактируйте package.json и вставьте следующий код.
{
"name": "aws-lambda-code",
"version": "1.0.0",
"description": "",
"main": "index.ts",
"scripts": {
"zip": "tsc && 7z a -r function_my_scrapper.zip ./dist/* node_modules/",
"sendToLambda": "npm run zip && aws s3 cp function_my_scrapper.zip s3://YOUR_BUCKET_NAME && aws lambda update-function-code --function-name lambdaFunctionWithChromium --s3-bucket YOUR_BUCKET_NAME --s3-key function_my_scrapper.zip && rm function_my_scrapper.zip"
},
"author": "",
"license": "ISC",
"dependencies": {
"@sparticuz/chromium": "^106.0.2",
"aws-sdk": "^2.1163.0",
"puppeteer-core": "^18.0.5"
},
"devDependencies": {
"@types/node": "^14.14.13",
"@types/puppeteer": "^5.4.6",
"typescript": "^4.1.3"
}
}
Выполните npm i, чтобы обновить зависимости.
- Давайте напишем код для парсинга веб-сайта
В этом простом примере давайте возьмем веб-сайт W3School, чтобы спарсить два заголовка.
Создайте файл index.ts.
const puppeteer = require("puppeteer-core");
const chromium = require("@sparticuz/chromium");
import aws from 'aws-sdk';
const lambda = new aws.Lambda();
const fixedUrl = 'https://www.w3schools.com/';
export const handler = async () => {
await run();
await lambda.updateFunctionConfiguration({
FunctionName: 'lambdaFunctionWithChromium',
Environment: {
Variables: {}
}
}).promise();
}
export async function run() {
const browser = await puppeteer.launch({
args: chromium.args,
defaultViewport: chromium.defaultViewport,
executablePath: await chromium.executablePath,
headless: chromium.headless,
ignoreHTTPSErrors: true,
});
const page = await browser.newPage()
await page.goto(fixedUrl)
try {
const firstElement = await page.$("h1[class='learntocodeh1']");
const firstElementText = await page.evaluate(firstElement => firstElement.textContent, firstElement);
const secondElement = await page.$("h3[class='learntocodeh3']");
const secondElementText = await page.evaluate(secondElement => secondElement.textContent, secondElement);
var payload = {
'firstElement': firstElementText,
'secondElement': secondElementText
};
console.log(payload);
} catch (error) {
console.log(error);
}
browser.close()
};
Создайте tsconfig.json
{
"compilerOptions": {
"target": "es2018",
"module": "commonjs",
"outDir": "dist",
"noImplicitAny": false,
"strictNullChecks": false,
"esModuleInterop": true,
"sourceMap": true,
},
"exclude": [
"/**/*.spec.ts"
]
}
Создайте placeholder.ts
export {};
Не забудьте настроить AWS CLI в вашей операционной системе.
- Настройки функции Amazon Lambda
Перейдите к вашей функции и нажмите Configuration -> General Configuration -> Edit Memory, установите значение 1600 МБ и Timeout на 3 мин (просто чтобы предотвратить прерывание функции, вы можете проверить и изменить его позже, чтобы адаптировать его к вашему проекту).
Теперь перейдите к Configuration -> General Configuration -> Permissions и нажмите Execution Role -> Role Name (ссылка), затем нажмите Add Permission -> Attach Policies и добавьте AWSLambda_FullAccess Role.
- Давайте развернем и протестируем
Выполните npm run sendToLambda в командной строке вашей операционной системы.
В вашей консоли AWS вы увидите следующее.
Вы можете перейти на вкладку Test и выполнить ваш код.
Примечания: Функции Lambda могут использовать события, просто нужно внести некоторые изменения в функции, см. примеры ниже.
export const handler = async (params);
await run(params);
export async function run(params);
- Особая благодарность
Cobalt Intelligence: https://youtu.be/upbxQek0H1Q
Sparticuz: https://github.com/Sparticuz/chromium
Я надеюсь, что этот учебник будет полезен кому-то. :)