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

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

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

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

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

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

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

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

Нужно сделать то же самое, что в предыдущих вариантах, только на уровне кода, делая свои велосипеды. Например, парсить по несколько строчек, после успеха удаляя их из файла.
Ответ написан
@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 может превосходить рамки часов/суток. С таким подходом пока ни разу не сталкивался с проблемами парсинга
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Spice IT Recruitment Москва
До 200 000 руб.
Взахлёб Ульяновск
от 90 000 до 120 000 руб.
IQ Oрtiоn Software Санкт-Петербург
от 140 000 до 170 000 руб.
19 сент. 2019, в 13:18
5000 руб./за проект
19 сент. 2019, в 13:16
20000 руб./за проект