Продолжение заметки "Проблема автоматического скачивания файла с переменным Web адресом" - возможность запуска первой части робота (спайдера) с неточного/просроченного адреса.
Кратко напомним проблему. Некий сайт - или сайты - публикует в виде файла для скачивания некую нужную нам и периодически обновляемую информацию. Мы хотели бы создать робот, который периодически доставлял бы этот файл в нашу информационную систему для дальнейшего использования. Но адрес файла также периодически меняется. Для решения этой проблемы мы создали робот, который состоит из двух частей:
- Спайдер, запускаемый однократно в момент получения задания на слежение, который сканирует сайт и находит родительскую страницу интересующего нас файла;
- Скаут, запускаемый ежедневно, который получает от спайдера адрес родительской страницы, сканирует ее и находит на ней возможно изменившуюся ссылку на интересующий нас файл.
После срабатывания скаута выполняется смысловая загрузка интересующего файла, парсинг его в систему и все дальнейшие смысловые действия.
В предыдущей статье мы описали спайдер, который запускается в предположении, что адрес интересующего файла в момент запуска спайдера известен точно, т.е. еще не изменился. На практике оказалось, что это условие является достаточно рискованным:
- При наличии значительного количества наблюдаемых сайтов/файлов необходимо вручную проверить актуальность адресов всех наблюдаемых файлов;
- Ошибка хотя бы в одном адресе приведет к полному сканированию сайта (лог покажет администратору, что сайт сканируют насквозь) без смыслового результата для нас.
Соответственно, было принято решение создать "самонаводящийся" спайдер, способный осуществить "захват цели" в условиях "неточной начальной уставки". Термины взяты из области головок самонаведения ракет воздух-воздух.
Действительно, как действует самонаводящаяся ракета? Пилот истребителя захватывает цель в достаточно широкую рамку прицела и отдает ракете, еще висящей под крылом истребителя, команду на захват цели. Головка самонаведения ракеты сканирует область пространства, соответствующую рамке прицела пилота, и находит источник ИК излучения - двигатель цели. На дисплее пилота отображается решение ракеты - захваченный двигатель цели, пилот решение ракеты подтверждает и ракета переходит из режима захвата цели в режим сопровождения цели - "глаз" ее головки самонаведения непрерывно следит за маневрирующей целью, отдавая команды на органы управления ракеты. Ракета висит под крылом, зыркает за целью своим глазом и поводит плавниками. В случае команды пилота на пуск ракета сходит с пилона и... Дальше понятно.
Мы решили сделать нечто подобное для нашего спайдера: пусть он попытается захватить ссылку на интересующий нас файл даже в том случае, если она уже успела измениться.
Важно отметить, что в отличие от фазы работы скаута - анализ всех ссылок родительской страницы интересующего файла - мы не можем выполнить ранжирование. Спайдер пойдет по дереву сайта и должен будет точно остановиться на ссылке на интересующий файл с первого раза, без получения информации о всех дальнейших ссылках.
Еще раз: скаут имеет полное множество ссылок-кандидатов и выбирает наиболее похожую методом ранжирования по полному множеству. Спайдер такой возможности лишен и должен выполнить пороговое принятие решения без возможности анализа полного множества.
Что мы знаем про адрес файла в момент его передачи пользователем спайдеру?
- Мы знаем расширение файла;
- Мы знаем путь к файлу от корня сайта - он не имеет никакого отношения к пути по дереву ссылок сайта;
- Мы знаем имя файла, но оно может поменяться;
- Мы можем предположить наличие в имени файла даты;
- При работе спайдера в большинстве случаев мы можем получить текст ссылки и работать с ним.
Соответственно, для спайдера мы записываем функцию, которая определяет близость каждой обнаруженной в процессе сканирования сайта ссылки к данному пользователем адресу по целому ряду критериев:
- Текст ссылки - словарь с положительной и обратной логикой;
- Дата - наличие или отсутствие в данном пользователем адресе и в каждой обнаруженной ссылке;
- Расширение файла - лингвистическая близость, поскольку оно может запросто поменяться, скажем, с XLS на XLSX;
- Имя файла - лингвистическая близость весьма вероятно поменявшегося имени;
- и т.п.
Затем мы перемножаем полученные частные близости и получаем некоторое число, которое может варьироваться от нуля (встретилось стоп-слово) до значения с десятком нулей.
Проведя значительное количество экспериментов, мы пришли к выводу о возможности установки порога захвата цели примерно на порядок меньше максимально возможного значения при полном совпадении по всем критериям, получив 100 %-ный захват по всему множеству наблюдаемых файлов/сайтов.
Ряд технических моментов, критических для реализации описанного метода на практике, в эту краткую заметку не включен. Сканирование сайтов без принятия серьезных мер по ограничению воздействия на них может быть расценено их администраторами как попытка атаки на сайт и привести к блокированию сканирующего сервера.