Как изменить начальные, последующие и запрещенные URL-адреса для StormCrawler на лету

Я довольно новичок в StormCrawler, делаю свою первую реализацию веб-сканера, и я до сих пор очень доволен этим продуктом!

Я использую StormCrawler v1.5.1 с Elastic 5.5.1 и настраиваю свою топологию на основе предоставленного "ESCrawlTopology.java".

Я хотел бы иметь возможность изменять начальные URL-адреса (начальные значения) и последующие-нет-следующие-URL-адреса во время работы топологии. То, что я получил до сих пор, - это redis-DB, которая содержит эту конфигурацию, и URL-фильтр, который использует redis для считывания своих шаблонов follow-no-follow-pattern. Также я реализовал выпускной носитель start-url, который считывает данные с Redis, обнаруживает изменения и публикует вновь найденные стартовые URL-адреса с помощью средства обновления статуса до эластичного. Пока что эта установка прекрасно работает.

Для правил follow- / no-follow я также реализовал spout, который обнаруживает изменения и удаляет все недопустимые URL-адреса из индекса "index"- и "status" в Elastic с помощью действия "DeleteByQuery"-Elastic-action. Я не использую Status-Updater или DeletionBolt для этого.

Хотя это работает, это не правильно, и я вижу потенциальные проблемы. Прежде всего, я не могу использовать кэширование средства обновления состояния, поскольку удаление не выполняется с помощью этого компонента, и, следовательно, кэш не обновляется, что не позволяет средству обновления состояния добавлять URL-адреса, которые были когда-то добавлены, удалены и добавлены снова. Во-вторых, когда один или несколько URL-адресов извлекаются или анализируются, когда они исключаются и удаляются из "статуса" и "индекса", я не уверен в результате. Я ожидаю, что URL-адреса в процессе индексируются, несмотря на то, что они были исключены ранее.

Я также экспериментировал с установкой, в которой я отправлял все исключенные URL-адреса в модуль обновления состояния со статусом ОШИБКА. В сочетании с DeletionBolt это приводит к удалению URL-адресов из индекса index. Это кажется более чистым решением - однако URL-адреса, которые исключены один раз, никогда не могут быть повторно проиндексированы, потому что они находятся в индексе "status" как "ERROR".

Лучшее решение в моих глазах было бы:

  1. пометить исключенные URL в индексе status, используя статус "REMOVED" (в данный момент недоступно)
  2. сделать все компоненты (fetcher, parser...) осведомленными о статусе "УДАЛЕНО", чтобы отменить исключенный URL, который в данный момент обрабатывается
  3. реализовать процесс очистки, который отправляет все "УДАЛЕННЫЕ" URL-адреса в DeletionBolt, а также удаляет этот URL-адрес из "статуса" при получении

В настоящее время я не вижу способа реализовать это без серьезных изменений основных компонентов StormCrawler, поскольку в настоящее время нет такого состояния, как "УДАЛЕНО".

Что вы думаете об этой проблеме и что может быть возможным решением?

1 ответ

Как вы указали, добавление нового статуса REMOVED не обязательно будет очень простым.

Вместо удаления URL-адресов в ES, как насчет добавления настраиваемого логического поля в поисковый индекс, например, активного со значением по умолчанию, равным true, так что, если все будет добавлено позже, все, что вам нужно будет сделать, это переключить значение в индекс. Очевидно, вам придется сканировать этот индекс, чтобы изменить значения, но это будет сделано за пределами SC.

С точки зрения индекса состояния, вещи будут сохранены, даже если они деактивированы, просто у вас будет фильтр URL в реальном времени + возможно, расширять код индексации ES, чтобы он периодически проверял шаблоны и генерировал правильное значение для активного поля.

Имеет ли это смысл?

Другие вопросы по тегам