CoderCastrov logo
CoderCastrov
Парсер

Как использовать функции AWS Lambda с Chromium/Puppeteer

Как использовать функции AWS Lambda с Chromium/Puppeteer
просмотров
2 мин чтение
#Парсер
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, чтобы обновить зависимости.

    1. Давайте напишем код для парсинга веб-сайта

    В этом простом примере давайте возьмем веб-сайт 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 в вашей операционной системе.

    1. Настройки функции 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.

    1. Давайте развернем и протестируем

    Выполните npm run sendToLambda в командной строке вашей операционной системы.

    В вашей консоли AWS вы увидите следующее.

    AWS Console

    Вы можете перейти на вкладку Test и выполнить ваш код.

    AWS Test

    Примечания: Функции Lambda могут использовать события, просто нужно внести некоторые изменения в функции, см. примеры ниже.

    export const handler = async (params);
    await run(params);
    export async function run(params);
    1. Особая благодарность

    Cobalt Intelligence: https://youtu.be/upbxQek0H1Q

    Sparticuz: https://github.com/Sparticuz/chromium

    Я надеюсь, что этот учебник будет полезен кому-то. :)