masterspammer (masterspammer) wrote,
masterspammer
masterspammer

Category:

Loki Search - разбор полётов.

Изначально задуманный вариант паука не удалось реализовать в ожидаемый срок. Данный текст представляет собой прежде всего изложение алгоритма с целью его лучшего понимания.

Дано: сайт, материалы на котором регулярно добавляются и/или изменяются. Примерами такого сайта могут быть блог или форум. Делается достаточно сильное допущение, что обновлённые страницы анонсируются (на них появляется ссылка) на главной странице или на одной из страниц верхнего уровня (новости, история).
Существуют и другие способы получить список изменений (RSS, подписки), но они являются привязанными к конкретному сайту и здесь не рассматриваются.

Требуется: поддержание зеркала сайта (или, что почти то же самое, поискового индекса) в актуальном состоянии. Новые, анонсированные ссылками, страницы должны обновляться максимально бысто, остальные - как-либо, но за гарантированное время (часто невозможно узнать, изменилась ли страница, не скачав её; на данном этапе мы не занимаемся проверкой, а просто заменяем страницу новой версией); удалённые или удаляются из зеркала или снабжаются флагом "архив".


Если паук (один процесс или поток) начинает от главной страницы и дальше идёт по ссылкам на страницы в порядке возрастания их уровня, то он за достаточно небольшое время (зависит от размеров сайта) загрузит все обновившиеся страницы, которые были анонсированы. Далее, он загрузит вообще все страницы, имеющиеся на сайте, что может быть непозволительно долго. Если прерывать и начинать с начала работу паука после достижения некоторого количества проиндексированных страниц или уровней или по времени работы, то мы получим быстрое, но негарантированное обновления зеркала.

Действительно,  если страница расположена достаточно глубоко и была, например, отредактирована, то без аноноса паук до неё не дойдёт никогда и в заркале останется устаревшая копия. Часто список анонсированных страниц (например, "последние комментарии" или "список тем по дате изменения") может быть ограничен или разбит на страницы так, что за цикл работы паука анонс уйдёт из поля его зрения.

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

Список имеет вид:
file spider_id level state last_modification url
если файл не задан, то в зеркале ещё нет копии url;
spider_id позволяет каждому пауку обрабатывать прежде всего
"свои" ссылки, например, помечая, что он их будет закачивать сейчас,
и другим паукам их трогать не надо; состояния - url найден, поставлен
в очередь на закачку, закачан (и возможно ещё проиндексирован/архивирован - для
паука все эти состояния равнозначны "закачан"); дата последнего изменения и адрес

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

Цикл работы паука таков - из найденных ссылок (если они есть) он исключает уже имеющиеся в списке, добавляет оставшиеся в конец списка, далее выбирает себе для закачки некоторое количество НОВЫХ ссылок, выбирая минимум по уровню, а при равном уровне - по дате обновления (самые старые) - эти ссылки помечаются соответствующим статусом ("в очереди на закачку"), закачанные файлы помещаются в зеркало (со статусом "скачано") и на некоторое время паук оставляет список в покое - качает страницы и собирает новые ссылки.

Разница между пауками в том, что оба трактуют новизну ссылок по-разному - для "быстрого" это, например, час, а для медленного - сутки. Так же медленный может качать сильно устаревшие (например, на две недели) страницы вне зависимости от их уровня.

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

Некоторые особенности функционирования пауков (прежде всего касающиеся повышения отказоустойчивости) не рассматриваются здесь, заметим только, что они влияют на формат списка -  без них было он бы мог быть проще.
Tags: lokisearch, Поиск, РазборПолётов, ТекстовыеАлгоритмы
Subscribe

  • От субботы до субботы!

    Шкафчики красиво подвесил - в точности в той конфигурации, как они висели на прошлой их (не нашей!) кухне. Обнаружил небольшой уклон вбок (заметную…

  • Алдан

    Кажется, я знаю, как назвать своё "произведение" на Z80; про идею я писал несколько раз, а кратко это: 1. "системный" режим,…

  • (no subject)

    В общем, загад (вот гад!) не бывает богат. Из запланированного сделал абсолютный минимум. Эпиграфом субботы был анекдот про лягушку, ходившую по…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments