Анализ работоспособности ссылок на страницах магистров прошлых лет
Первый выпуск магистров ДонНТУ, которые оформляли свои сайты был 12 лет назад. Это было славное время дефицитного dial – up и пестрого WEB 1.0. Многое изменилось в сети с тех пор, хотя я, сказать по – правде, в то время и не знал что такое Интернет. А так как изменения на сайтах магистров не производились, то сейчас попробуем узнать, как быстро изменяется глобальная сеть и сколько же живет ссылка, оставленная без присмотра.
«Мануальный осмотр»
Как нас всегда учили: «Прежде, чем начать что – то делать посмотрите, а не сделано ли это до вас». После беглого просмотра тематик индивидуальных разделов магистров, я обнаружил похожее задание: Индивидуальное задание Шпантак Иван и, как это не прискорбно, но в 2005 году живых ссылок на страницах до 2003 года уже осталось немного. Больше подобных заданий не было.
Выбор стратегии
Думаю, Шпантак Иван Александрович мог выполнить свое задание вручную, не прибегая к методам автоматизации, а вот в моем случае придется что – то придумать. Напишем программку, которая пройдется по сайту магистров и соберет всю интересующих информацию в базу данных. Грубый подсчет показал, что всего на сайте порядка 3 тысяч страниц магистров, причем, чем моложе сайт, тем больше на нем будет ссылок. Собирать будем уникальные ссылки, а кросслинки вынесем в отдельную таблицу. Для идентификации ссылок внутри программы воспользуемся MD5 хэшем. Конечно, хэш – это теоретическая возможность коллизии, однако для данной задачи 128 бит более, чем достаточно.
Выбор инструментов
Программировать будем в Delphi, так как знаем эту среду непонаслышке и много времени с ней работали. Базу данных возьмем Access по той же причине, да и устанавливать ничего дополнительно желания нет, а компоненты ADO ведут себя стабильно. Здесь, есть недостаток – библиотеки ADO потоконебезопасны, так что запись придется производить в отдельном потоке, это и будет узким местом нашего метода. Для доступа к серверу вначале я хотел воспользоваться Windows InternetAPI, но библиотека поддерживает до 4 одновременных подключений к серверу (можно больше, но нужно править реестр), поэтому откажемся от этой затеи в пользу Indy или Synapse. С Indy почему – то у меня сразу не заладилось: то поток намертво зависает, хотя все необходимые настройки произведены, то соединение не происходит, или коннект есть, а данные не поступают, и события не возбуждаются. В общем, остановили мы выбор на библиотеке Synapse, и хоть последнее обновление и было несколько лет назад, работает она быстро, четко и без нервов.
Реализация
Итак, написали программу:
ядро: менеджер потоков и множество потоков – соединений, которые по мере завершения передают скачанные данные менеджеру, а тот сливает их в базу данных;
пользовательский интерфейс – чисто для индикации процесса выполнения (менеджер имеет несколько событий для связи с внешним миром), так как 3447 сайтов (а именно столько насчиталось ссылок с корневой страницы портала магистров) за минуту не обработаются. Для того, чтобы обойти все страницы портала магистров, моей программе понадобилось более 3 часов (параллельно работали 40 потоков). Как показал лог выполнения, при работе с 5 ссылками произошли ошибки, но, думаю, такая неточность не сильно скажется на общем результате.
Результаты
База данных раздулась до 100 мегабайт, так что здесь выложить её не получится. Поэтому выложу исходник модуля со всеми классами и типами. При минимальной модификации можно повторить мой эксперимент.
База содержит много информации, главное – правильно её проанализировать. Сейчас приведу статистику по битым ссылкам по годам. Учитываются все уникальные ссылки (и внешние, и внутренние), редирект считаем битой ссылкой.
Выводы
Предположения подтвердились – количество неработающих ссылок возрастает с возрастом необновляемого сайта. А из – за того, что абсолютное количество ссылок с каждым годом увеличивается, влияние неработающих ссылок более старого года на сумму всех ссылок на портале уменьшается.
P.S.
Всю необходимую информацию по программированию и взаимодействих с БД Access можно найти в разделе Ссылки этого сайта.