Парсинг с помощью NodeJS
Добрый день, Всем спецам по NodeJS!
Не могу понять, подходит ли под мою задачу NodeJS.
У меня есть задача одновременного парсинга нескольких тысяч WEB страниц, контент на которых формируется динамически. Грубо говоря — представьте 5 000 открытых страниц браузера. Контент на них меняется раз в несколько секунд. И раз в секунду с каждой страницы нужно присылать обновления. Задача скажем так — нетривиальная)
Я могу это делать с помощью запуска JS-скриптов парсинга на каждой из страниц. JS-скрипт пробегает по нужным элементам, формирует JSON скрипт, выводит его в консоль, где я уже забираю его, обрабатываю, и загружаю в базу.
Но это все ТАААК ресурсоемко) Я экспериментирую на 20 открытых страницах — и моя виртуалка уже на половину загружена) А мне нужно это делать в пике с несколькими тысячами страниц.
Я ищу средства, которые бы не были такими ресурсоемкими как обычный браузер.
И конечно я абсолютно понимаю, что в любом случае такая задача потребует ресурсов. Но хотелось бы ограничиться несколькими серверами. А лучше делать все это в облаке и ресурсы брать по мере необходимости.
Как Вы считаете — поможет ли описанная связка NodeJS + headless браузер (например Puppeteer) в выполнении такой задачи? И будет ли это более красивым и элегантным решением, чем просто открытые окна браузера?)
И еще: Я пока не углублялся в nodeJS. Может ли он держать много страниц открытыми, выполнять на них JS-скрипты, распарсивать JSON, и SQL запросами загружать результаты в базу?
P.S. У многих возникнет резонный вопрос - зачем парсить браузером и JS, когда можно просто посылать GET запросы, и парсить JSON - ответы? Отвечаю: речь идет о ~50 разных сайтов. У каждого своя схема работы, свой JSON, где то это вообще не JSON - а что то другое. И разбираться во всем этом не хочется. Кроме того - в JSON-е от этих сайтов приходит инфа, которая становится понятна только тогда, когда сама страница её распарсит и подставит в нужные поля.
Вообщем парсинг JS-скриптами - это универсальное решение, которое подойдет к любому сайту. Но за эту универсальность нужно будет заплатить ресурсоемкостью.
Спасибо.
|