Для скачивания журналов было принято использовать свободно распространяемое программное обеспечение WGET.
В процессе создания архива электронных журналов оказалось, что значительный объём скачиваемой и сохраняемой информации может занимать реклама и графические счётчики посетителей сайта. В основном, данная информация генерируется внешними (по отношению к сайту журнала) серверами (как правило, лидерами российского или регионального рынка Интернет-рекламы и статистики, что, в свою очередь говорит о том, что их число ограничено), таким образом, может быть удалена без ущерба смысловому наполнению сайта журнала. Удаление лишних блоков информации не только уменьшает объём используемой архивом дисковой памяти, но и улучшает качество поискового индекса.
К сожалению, в стандартной функциональности используемого ПО для скачивания сайтов WGET возможность фильтрации скачиваемой информации не предусмотрена, поэтому коллективом разработчиков архива электронных журналов, учитывая наличие исходных текстов программы WGET, было принято решение реализовать данную функциональность своими силами. В первоначальном варианте фильтра все скачиваемые страницы, перед записью их на диск, проверялись на наличие рекламных блоков, и, в случае положительного результата, рекламные блоки удалялись. Для описания рекламных блоков было решено использовать шаблоны, созданные при помощи регулярных выражений языка Perl, для их хранения была создана отдельная таблица в СУБД. Для удобства создания, корректировки и проверки правильности шаблонов был разработан соответствующий интерфейс администратора.
К сожалению, впоследствии от фильтрации страниц от рекламы в процессе их скачивания пришлось отказаться. Для объяснения причин отказа необходимо вспомнить, что одной из задач, поставленных разработчиками при создании архива электронных журналов, была задача уменьшения сетевого трафика за счёт повторного скачивания только тех материалов сайта, которые изменились с момента предыдущего скачивания журнала. Рассмотрим поведение ПО WGET при повторном скачивании материала: - на сервер журнала отправляется запрос информации о материале - для этого используется метод HEAD протокола HTTP;
- в случае отсутствия в ответе сервера заголовков Content-Length (размер запрашиваемого материала) и Last-modified (дата последней модификации материала) документ, хранящийся на сервере, считается более новым, чем сохранённый локально, и, таким образом, скачивается повторно;
- в случае, если размер документа на сервере не совпадает с размером локальной копии документа, а так же в случае, если даты документов отличаются, документ скачивается повторно.
Таким образом, в случае удаления рекламных блоков на этапе скачивания, возможность уменьшения сетевого трафика теряется. Учитывая, что стоимость дисковых носителей всё еще значительно ниже стоимости трафика аналогичного объёма, такой результат был признан неприемлемым.
Тем не менее, модификация скачиваемых страниц перед сохранением на диск в некоторых случаях может быть просто необходимой. Так, в одном из скачиваемых журналов на нескольких страницах (пусть адрес одной из таких страниц будет http://адрес1) была обнаружена некорректная ссылка на языке HTML - вместо кода использовался код (во втором варианте вместо одного знака = стоит два знака =). При переходе по этой ссылке как браузеры Internet Explorer и Mozilla, так и WGET, пытались открыть страницу http://адрес1="http://адрес2. В случае, если бы сайт этого журнала был бы статическим, браузеры (и WGET) получили бы от сервера сообщение об ошибке 404 протокола HTTP (адрес не найден), но данный сайт оказался динамическим и его ПО просто игнорировало часть адреса после знака =, передавая браузеру текст той же самой страницы, с которой был осуществлён переход. Учитывая большое количество относительных ссылок с этой страницы, объём скаченной информации с данного сайта оказался на порядок выше, чем реальный объём данного сайта.
При дальнейшем изучении исходных кодов ПО WGET оказалось, что данный фильтр можно встроить на этапе конвертирования HTML-ссылок документа в локальные - в этом случае WGET создаёт резервные копии документов, которые, при повторном скачивании, использует для сравнения длины и даты модификации с документами на сервере. Таким образом, за счёт большего объёма архива сайта журнала на диске, появляется возможность уменьшить сетевой трафик.
В процессе создания архива оказалось, что у достаточно большого количества журналов архив материалов (реже - произвольная их часть) находится за пределами иерархической структуры директорий начальной страницы, в том числе и на других доменах. Учитывая, что во избежание скачивания всего сайта, на котором расположен журнал, целиком, ПО WGET было дано указание не выходить за рамки данной иерархии, сложилась ситуация, в результате которой значительная, если не самая ценная, часть журнала не подлежала скачиванию. Естественным образом, данная ситуация не удовлетворила коллектив разработчиков, что повлекло за собой необходимость как внести изменения в структуру хранимой информации о журнале - было принято решение дополнительно хранить все URL иерархий, принадлежащие данному журналу, так и внести соответствующие доработки в ПО WGET.
Одной из часто встречающихся ситуаций, обнаруженных при создании архива журналов, оказался случай, когда несколько журналов находятся на одном уровне иерархии одного и того же сайта. Данная ситуация, если её не рассматривать отдельно, приводит к тому, что при скачивании каждого отдельно описанного журнала скачиваются и все остальные журналы той же иерархии, что, в свою очередь, приводит к нерациональному расходу как дискового пространства, так и сетевого трафика. В связи с этим был создан механизм, позволяющий (на основе анализа URL) выявить потенциальные "дубликаты" журналов и предъявить их список для анализа администратору электронного архива, который принимал окончательное решение по данному вопросу.
Среди ситуаций, потребовавших отдельного рассмотрения, необходимо отметить и проблемы сетевого характера, а именно - возможные обрывы связи в процессе скачивания журнала. Оказалось, что обработка обрывов связи происходит по-разному для начальной стадии скачивания и для всех остальных стадий. Обрыв связи на начальной стадии может привести к двум случаям: невозможность определить ip-адрес сайта журнала и невозможность подключиться к серверу журнала. Оказалось, что в первом случае ПО WGET не делает повторных попыток определить адрес сайта, а во втором - не делает повторных попыток подсоединиться к серверу, что приводит к тому, что журнал, перед скачиванием которого возникли проблемы со связью, не скачивается и не попадает в архив. Соответственно, разработчики архива журнала не удовлетворились таким поведением ПО WGET, и дополнили свой программный комплекс модулем анализа и обработки описанной ситуации. В случае, если обрыв связи происходит не на начальной стадии процесса скачивания, ПО WGET позволяет задать количество повторных попыток скачивания материалов сайта, во время скачивания которых произошел обрыв связи, что вполне устроило коллектив разработчиков, хотя и не исключает возможности потери части документов сайта журнала. Чтобы обнаружить потерю документов, была создана система оповещения администратора архива о значительных изменениях размера сайта журнала. Эта же система, в случае идентичности двух последних архивных экземпляров сайта журнала, рекомендует администратору уменьшить частоту скачивания сайта в архив.
|