Найти в Дзене
Oracle APEX

Самонаводящийся спайдер к проблеме автоматического скачивания файла с переменным Web адресом

Продолжение заметки "Проблема автоматического скачивания файла с переменным Web адресом" - возможность запуска первой части робота (спайдера) с неточного/просроченного адреса. Кратко напомним проблему. Некий сайт - или сайты - публикует в виде файла для скачивания некую нужную нам и периодически обновляемую информацию. Мы хотели бы создать робот, который периодически доставлял бы этот файл в нашу информационную систему для дальнейшего использования. Но адрес файла также периодически меняется. Для решения этой проблемы мы создали робот, который состоит из двух частей: После срабатывания скаута выполняется смысловая загрузка интересующего файла, парсинг его в систему и все дальнейшие смысловые действия. В предыдущей статье мы описали спайдер, который запускается в предположении, что адрес интересующего файла в момент запуска спайдера известен точно, т.е. еще не изменился. На практике оказалось, что это условие является достаточно рискованным: Соответственно, было принято решение создать

Продолжение заметки "Проблема автоматического скачивания файла с переменным Web адресом" - возможность запуска первой части робота (спайдера) с неточного/просроченного адреса.

Кратко напомним проблему. Некий сайт - или сайты - публикует в виде файла для скачивания некую нужную нам и периодически обновляемую информацию. Мы хотели бы создать робот, который периодически доставлял бы этот файл в нашу информационную систему для дальнейшего использования. Но адрес файла также периодически меняется. Для решения этой проблемы мы создали робот, который состоит из двух частей:

  1. Спайдер, запускаемый однократно в момент получения задания на слежение, который сканирует сайт и находит родительскую страницу интересующего нас файла;
  2. Скаут, запускаемый ежедневно, который получает от спайдера адрес родительской страницы, сканирует ее и находит на ней возможно изменившуюся ссылку на интересующий нас файл.

После срабатывания скаута выполняется смысловая загрузка интересующего файла, парсинг его в систему и все дальнейшие смысловые действия.

В предыдущей статье мы описали спайдер, который запускается в предположении, что адрес интересующего файла в момент запуска спайдера известен точно, т.е. еще не изменился. На практике оказалось, что это условие является достаточно рискованным:

  • При наличии значительного количества наблюдаемых сайтов/файлов необходимо вручную проверить актуальность адресов всех наблюдаемых файлов;
  • Ошибка хотя бы в одном адресе приведет к полному сканированию сайта (лог покажет администратору, что сайт сканируют насквозь) без смыслового результата для нас.

Соответственно, было принято решение создать "самонаводящийся" спайдер, способный осуществить "захват цели" в условиях "неточной начальной уставки". Термины взяты из области головок самонаведения ракет воздух-воздух.

Действительно, как действует самонаводящаяся ракета? Пилот истребителя захватывает цель в достаточно широкую рамку прицела и отдает ракете, еще висящей под крылом истребителя, команду на захват цели. Головка самонаведения ракеты сканирует область пространства, соответствующую рамке прицела пилота, и находит источник ИК излучения - двигатель цели. На дисплее пилота отображается решение ракеты - захваченный двигатель цели, пилот решение ракеты подтверждает и ракета переходит из режима захвата цели в режим сопровождения цели - "глаз" ее головки самонаведения непрерывно следит за маневрирующей целью, отдавая команды на органы управления ракеты. Ракета висит под крылом, зыркает за целью своим глазом и поводит плавниками. В случае команды пилота на пуск ракета сходит с пилона и... Дальше понятно.

Мы решили сделать нечто подобное для нашего спайдера: пусть он попытается захватить ссылку на интересующий нас файл даже в том случае, если она уже успела измениться.

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

Еще раз: скаут имеет полное множество ссылок-кандидатов и выбирает наиболее похожую методом ранжирования по полному множеству. Спайдер такой возможности лишен и должен выполнить пороговое принятие решения без возможности анализа полного множества.

Что мы знаем про адрес файла в момент его передачи пользователем спайдеру?

  • Мы знаем расширение файла;
  • Мы знаем путь к файлу от корня сайта - он не имеет никакого отношения к пути по дереву ссылок сайта;
  • Мы знаем имя файла, но оно может поменяться;
  • Мы можем предположить наличие в имени файла даты;
  • При работе спайдера в большинстве случаев мы можем получить текст ссылки и работать с ним.

Соответственно, для спайдера мы записываем функцию, которая определяет близость каждой обнаруженной в процессе сканирования сайта ссылки к данному пользователем адресу по целому ряду критериев:

  • Текст ссылки - словарь с положительной и обратной логикой;
  • Дата - наличие или отсутствие в данном пользователем адресе и в каждой обнаруженной ссылке;
  • Расширение файла - лингвистическая близость, поскольку оно может запросто поменяться, скажем, с XLS на XLSX;
  • Имя файла - лингвистическая близость весьма вероятно поменявшегося имени;
  • и т.п.

Затем мы перемножаем полученные частные близости и получаем некоторое число, которое может варьироваться от нуля (встретилось стоп-слово) до значения с десятком нулей.

Проведя значительное количество экспериментов, мы пришли к выводу о возможности установки порога захвата цели примерно на порядок меньше максимально возможного значения при полном совпадении по всем критериям, получив 100 %-ный захват по всему множеству наблюдаемых файлов/сайтов.

Ряд технических моментов, критических для реализации описанного метода на практике, в эту краткую заметку не включен. Сканирование сайтов без принятия серьезных мер по ограничению воздействия на них может быть расценено их администраторами как попытка атаки на сайт и привести к блокированию сканирующего сервера.