Рубрики
Без рубрики

Бессерверная очистка веб-страниц с помощью Aws Lambda и Java

Бессерверный – это термин, обозначающий выполнение кода внутри эфемерного контейнера… Помеченный java, очистка веб-страниц.

Очистка веб-страниц Java (Серия из 7 частей)

Бессерверный – это термин, обозначающий выполнение кода внутри эфемерных контейнеров (Функция как услуга, или FaaS). Это горячая тема в 2019 году, после шумихи вокруг “микросервиса”, а вот и “наноуслуги”!

Облачные функции могут запускаться различными вещами, такими как:

  • HTTP-вызов API-интерфейса REST
  • Задание в очереди сообщений
  • Бревно
  • Событие Интернета вещей

Облачные функции действительно хорошо подходят для задач очистки веб-страниц по многим причинам. Очистка веб-страниц связана с вводом-выводом, большая часть времени тратится на ожидание HTTP-ответов, поэтому нам не нужны высокопроизводительные процессорные серверы. Облачные функции дешевы (первый 1 млн запросов бесплатный, затем 0,20 доллара за миллион запросов) и просты в настройке. Облачные функции хорошо подходят для параллельной очистки, мы можем создавать сотни или тысячи функций одновременно для крупномасштабной очистки.

В этом введении мы рассмотрим, как развернуть слегка измененную версию скребка Craigslist, которую мы создали в предыдущем посте в блоге на AWS Lambda, используя бессерверную платформу.

Предпосылки

Мы собираемся использовать Бессерверный фреймворк для создания и развертывания нашего проекта в AWS lambda. Бессерверный интерфейс командной строки способен генерировать множество шаблонного кода на разных языках и развертывать код в разных облачных провайдерах, таких как AWS, Google Cloud или Azure.

Архитектура

Мы создадим API с использованием шлюза API с одной конечной точкой /элементы/{запрос} , привязанные к лямбда-функции, которая ответит нам массивом JSON со всеми элементами (на первой странице результатов) для этого запроса.

Вот простая схема для этой архитектуры:

Создайте проект Maven

Бессерверный способен создавать проекты на множестве разных языков: Java, Python, Node JS, Scala… Мы собираемся использовать один из этих шаблонов для создания проекта maven:

serverless create --template aws-java-maven --name items-api -p aws-java-scraper

Теперь вы можете открыть этот проект Maven в своей любимой среде разработки.

Конфигурация

Первое, что нужно сделать, это изменить конфигурацию serverless.yml для реализации маршрутизатора шлюза API и привязать его к методу handleRequest в Handler.java класс.

service: craigslist-scraper-api 
provider:
  name: aws
  runtime: java8
  timeout: 30

package:
  artifact: target/hello-dev.jar

functions:
  getCraigsListItems:
    handler: com.serverless.Handler
    events:
    - http:
        path: /items/{searchQuery}
        method: get

Я также добавил тайм-аут до 30 секунд. Тайм-аут по умолчанию для бессерверной платформы составляет 6 секунд. Поскольку мы запускаем Java-код, холодный запуск лямбды может занять несколько секунд. А затем мы отправим HTTP-запрос на веб-сайт Craigslist, так что 30 секунд кажутся хорошими.

Функциональный код

Теперь мы можем изменить Теперь мы можем изменить . Функциональная логика проста. Сначала мы извлекаем параметр пути, называемый “поисковый запрос”. Затем мы создаем скребок CraigsList и вызываем метод scrape() с этим поисковым запросом. Он вернет Список<Элемент>

Затем мы используем класс Api Gateway Response , созданный бессерверной платформой, для возврата массива JSON, содержащего каждый элемент.

Вы можете найти остальную часть кода в этот репозиторий с шаблоном CraigsList и классом Item .

@Override
public ApiGatewayResponse handleRequest(Map input, Context context) {
    LOG.info("received: {}", input);
    try{
        Map pathParameters = (Map)input.get("pathParameters");
        String query = pathParameters.get("searchQuery");

        CraigsListScraper scraper = new CraigsListScraper();
        List items = scraper.scrape(query);
        return ApiGatewayResponse.builder()
            .setStatusCode(200)
            .setObjectBody(items)
            .setHeaders(Collections.singletonMap("X-Powered-By", "AWS Lambda & serverless"))
            .build();
    }catch(Exception e){
        LOG.error("Error : " + e);
        Response responseBody = new Response("Error while processing URL: ", input);
        return ApiGatewayResponse.builder()
            .setStatusCode(500)
            .setObjectBody(responseBody)
            .setHeaders(Collections.singletonMap("X-Powered-By", "AWS Lambda & Serverless"))
            .build();
    }
}

Теперь мы можем создать проект:

mvn clean install

И разверните его в AWS:

serverless deploy
Serverless: Packaging service...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
.....
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (13.35 MB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
.................................
Serverless: Stack update finished...
Service Information
service: items-api
stage: dev
region: us-east-1
stack: items-api-dev
api keys:
  None
endpoints:
  GET - https://tmulioizdf.execute-api.us-east-1.amazonaws.com/dev/items/{searchQuery}
functions:
  getCraigsListItems: items-api-dev-getCraigsListItems

Затем вы можете протестировать свою функцию с помощью curl или вашего веб-браузера по URL-адресу, указанному в журналах развертывания ( информация о бессерверных также покажет эту информацию.)

Вот запрос для поиска “MacBook pro”.:

curl https://tmulioizdf.execute-api.us-east-1.amazonaws.com/dev/items/macBook%20pro | json_reformat                                                            1 ↵
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 19834  100 19834    0     0   7623      0  0:00:02  0:00:02 --:--:--  7622
[
    {
        "title": "2010 15\" Macbook pro 3.06ghz 8gb 320gb osx maverick",
        "price": 325,
        "url": "https://sfbay.craigslist.org/eby/sys/d/macbook-pro-306ghz-8gb-320gb/6680853189.html"
    },
    {
        "title": "Apple MacBook Pro A1502 13.3\" Late 2013 2.6GHz i5 8 GB 500GB + Extras",
        "price": 875,
        "url": "https://sfbay.craigslist.org/pen/sys/d/apple-macbook-pro-alateghz-i5/6688755497.html"
    },
    {
        "title": "Apple MacBook Pro Charger USB-C (Latest Model) w/ Box - Like New!",
        "price": 50,
        "url": "https://sfbay.craigslist.org/pen/sys/d/apple-macbook-pro-charger-usb/6686902986.html"
    },
    {
        "title": "MacBook Pro 13\" C2D 4GB memory 500GB HDD",
        "price": 250,
        "url": "https://sfbay.craigslist.org/eby/sys/d/macbook-pro-13-c2d-4gb-memory/6688682499.html"
    },
    {
        "title": "Macbook Pro 2011 13\"",
        "price": 475,
        "url": "https://sfbay.craigslist.org/eby/sys/d/macbook-pro/6675556875.html"
    },
    {
        "title": "Trackpad Touchpad Mouse with Cable and Screws for Apple MacBook Pro",
        "price": 39,
        "url": "https://sfbay.craigslist.org/pen/sys/d/trackpad-touchpad-mouse-with/6682812027.html"
    },
    {
        "title": "Macbook Pro 13\" i5 very clean, excellent shape! 4GB RAM, 500GB HDD",
        "price": 359,
        "url": "https://sfbay.craigslist.org/sfc/sys/d/macbook-pro-13-i5-very-clean/6686879047.html"
    },
...

Обратите внимание, что первый вызов будет медленным, у меня это заняло 7 секунд. Следующие призывы будут намного быстрее.

Идите дальше

Это был всего лишь небольшой пример, вот несколько идей по улучшению этого:

  • Улучшенная обработка ошибок
  • Защитите API с помощью ключа API (действительно легко реализовать с помощью API Gateway)
  • Сохраните элементы в базе данных DynamoDB
  • Отправьте поисковый запрос в очередь SQS и запустите выполнение лямбды с помощью очереди вместо HTTP-запроса
  • Отправьте уведомление с помощью SNS, если товар стоит меньше определенной цены.

Если вам нравится очистка веб-страниц и вы устали заботиться о прокси, рендеринге JS и капчах, вы можете проверить наш новый API очистки веб-страниц , первые 1000 вызовов API на нас.

Это конец этого урока. Надеюсь, вам понравился этот пост. Не стесняйтесь экспериментировать с Lambda и другими облачными провайдерами, это действительно весело, легко и может значительно снизить затраты на инфраструктуру, особенно для веб-очистки или асинхронных задач, связанных.

Очистка веб-страниц Java (Серия из 7 частей)

Оригинал: “https://dev.to/scrapingbee/serverless-web-scraping-with-aws-lambda-and-java-48lc”