Как изменить начальные, последующие и запрещенные 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".
Лучшее решение в моих глазах было бы:
- пометить исключенные URL в индексе status, используя статус "REMOVED" (в данный момент недоступно)
- сделать все компоненты (fetcher, parser...) осведомленными о статусе "УДАЛЕНО", чтобы отменить исключенный URL, который в данный момент обрабатывается
- реализовать процесс очистки, который отправляет все "УДАЛЕННЫЕ" URL-адреса в DeletionBolt, а также удаляет этот URL-адрес из "статуса" при получении
В настоящее время я не вижу способа реализовать это без серьезных изменений основных компонентов StormCrawler, поскольку в настоящее время нет такого состояния, как "УДАЛЕНО".
Что вы думаете об этой проблеме и что может быть возможным решением?
1 ответ
Как вы указали, добавление нового статуса REMOVED не обязательно будет очень простым.
Вместо удаления URL-адресов в ES, как насчет добавления настраиваемого логического поля в поисковый индекс, например, активного со значением по умолчанию, равным true, так что, если все будет добавлено позже, все, что вам нужно будет сделать, это переключить значение в индекс. Очевидно, вам придется сканировать этот индекс, чтобы изменить значения, но это будет сделано за пределами SC.
С точки зрения индекса состояния, вещи будут сохранены, даже если они деактивированы, просто у вас будет фильтр URL в реальном времени + возможно, расширять код индексации ES, чтобы он периодически проверял шаблоны и генерировал правильное значение для активного поля.
Имеет ли это смысл?