Очистка веб-страниц Java (Серия из 7 частей)
Бессерверный – это термин, обозначающий выполнение кода внутри эфемерных контейнеров (Функция как услуга, или FaaS). Это горячая тема в 2019 году, после шумихи вокруг “микросервиса”, а вот и “наноуслуги”!
Облачные функции могут запускаться различными вещами, такими как:
- HTTP-вызов API-интерфейса REST
- Задание в очереди сообщений
- Бревно
- Событие Интернета вещей
Облачные функции действительно хорошо подходят для задач очистки веб-страниц по многим причинам. Очистка веб-страниц связана с вводом-выводом, большая часть времени тратится на ожидание HTTP-ответов, поэтому нам не нужны высокопроизводительные процессорные серверы. Облачные функции дешевы (первый 1 млн запросов бесплатный, затем 0,20 доллара за миллион запросов) и просты в настройке. Облачные функции хорошо подходят для параллельной очистки, мы можем создавать сотни или тысячи функций одновременно для крупномасштабной очистки.
В этом введении мы рассмотрим, как развернуть слегка измененную версию скребка Craigslist, которую мы создали в предыдущем посте в блоге на AWS Lambda, используя бессерверную платформу.
Предпосылки
Мы собираемся использовать Бессерверный фреймворк для создания и развертывания нашего проекта в AWS lambda. Бессерверный интерфейс командной строки способен генерировать множество шаблонного кода на разных языках и развертывать код в разных облачных провайдерах, таких как AWS, Google Cloud или Azure.
- Учетная запись AWS
- Узел и npm-сервер
- Бессерверный интерфейс командной строки и настройка ваши учетные данные AWS
- Java 8
- Знаток
Архитектура
Мы создадим 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(Mapinput, 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”