AsviS
@AsviS
начинающий

Как сделать задержку парсинга на node.js?

Доброго времени суток!
суть вопроса: У меня есть скажем 12 000 страниц одного сайта, при обычном парсинге с помощью request
и cheerio через несколько страниц сайт падает с ошибкой. Как мне при парсинге осуществить задержку и последовательный парсинг контента 12 000 страниц из файла?
Заранее спасибо!
  • Вопрос задан
  • 80 просмотров
Пригласить эксперта
Ответы на вопрос 2
@d-sem
Вариант 1. Положить в базу данных.

Каждой строке добавить статус. По крону делать запрос на получение n страниц для парсинга, у которых нет статуса готов. При успешном парсинге менять статус.

Вариант 2. Очереди.

Положить все в очередь и дергать воркером (воркерами) с задержкой. При неуспехе парсинга возвращать в очередь.

Что-то вроде https://www.rabbitmq.com/tutorials/tutorial-two-ja... Если смущает английский - есть ряд переводов. Если смущает поднятие раббита, то докером он поднимается в одну команду https://hub.docker.com/_/rabbitmq

Вариант 3. Реализовав логику своего хранилища.

Нужно сделать то же самое, что в предыдущих вариантах, только на уровне кода, делая свои велосипеды. Например, парсить по несколько строчек, после успеха удаляя их из файла.
Ответ написан
lazalu68
@lazalu68
Suspended ))
А что значит сайт падает с ошибкой? В смысле перестаёт возвращать адекватный ответ?

Отвечая на вопрос: в своё время чтобы обходить всевозможные механизмы защиты от парсинга разбивал процедуру парсинга на много много частей: парсинг одного конкретного элемента, bunch (парсинг группы элементов), сессия (bunch состоящий из bunch'ей).

В коде банч от сессии отличался только количеством обработанных элементов. То есть алгоритм парсинга получался какой-то такой:
Обрабатываем элемент №i
  Если ошибка, то
    ждём SINGLE_REQUEST_TIMEOUT
    пробуем еще раз
  i++
  Если остаток от деления i на ITEMS_IN_BUNCH равен нулю, то
    ждём BUNCH_TIMEOUT
  Иначе Если остаток от деления i на ITEMS_IN_SESSION равен нулю, то
    ждём SESSION_TIMEOUT
  Иначе 
    ждём SINGLE_REQUEST_TIMEOUT

Надеюсь понятно объяснил. Каждый из таймаутов охватывает временные промежутки разных масштабов - от секунд и минут, до часов и дней. Например, SINGLE_REQUEST_TIMEOUT может быть 1000мс, BUNCH_TIMEOUT - 30000мс, а SESSION_TIMEOUT может превосходить рамки часов/суток. С таким подходом пока ни разу не сталкивался с проблемами парсинга
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы