Автоматическое создание файла sitemap на FreeBSD


Файл sitemap предназначен для того, чтобы роботы поисковых систем максимально эффективно сканировали сайт. Сложность создания и поддержки актуального состояния файла sitemap растет с увеличением количества страниц сайта и ростом частоты их обновления. В состав большинства современных CMS входят инструменты, позволяющие автоматизировать процесс создания файла sitemap. Мне не повезло. CMS сайта нашей Компании в первозданном виде не поддерживает автоматическое создание файлов sitemap, а руководство экономит, в т.ч. и на услугах программиста, который мог бы запросто написать соответствующий модуль. Эти обстоятельства заставили меня задуматься об автоматизации процесса создания/обновления файла sitemap. В данной статье описан мой способ решения этой задачи.
Исходные данные

Имеется сервер с FreeBSD, на котором кроме прочих служб развернут Web-сервер. Нам понадобится следующее ПО: для генерации файла sitemap.xml.gz - google-sitemapgen, для сканирования сайта и подготовки исходных данных - webcheck, для промежуточной обработки данных – системные утилиты awk, sort и uniq. Перечисленное программное обеспечение будет устанавливаться из портов, поэтому я рекомендую Вам обновить их перед выполнением действий, описанных ниже (я использовал FreeBSD 7.0 и последние версии портов для нее). Ссылки на источники информации будут приводиться применительно к конкретным разделам статьи.


Установка и настройка google-sitemapgen

Установку google-sitemapgen необходимо выполнить из портов:

cd /usr/ports/www/google-sitemapgen
make install clean

google-sitemapgen поддерживает различные источники данных. В частности, могут использоваться данные из файла конфигурации, одного или нескольких файлов url_list.txt, access.log'ов Web-сервера, а также одного или нескольких файлов sitemap.xml. Периодическая ручная корректировка файла конфигурации, на мой взгляд, - гиблое дело, access.log каждый час очищается с помощью AWStats, дополнительные файлы sitemap.xml отсутствуют. Остается единственный способ - url_list.txt. С учетом сказанного файл конфигурации google-sitemapen, который может иметь любое имя и располагаться где угодно (в моем случае - /etc/sitemapgen.xml), должен иметь следующее содержимое:

<?xml version="1.0" encoding="UTF-8"?>
<site
base_url="http://www.company.com/"
store_into="/data/httpd/www-company-com/html/sitemap.xml.gz"
verbose="1"
>
<urllist path="/tmp/webcheck/url_list.txt" encoding="UTF-8" />
</site>


Естественно, значения параметров base_url и store_into необходимо заменить на адрес Вашего сайта и путь к будущему файлу sitemap.xml.gz, который должен располагаться в корневой папке Web-сервера, на котором расположен сайт. Процесс формирования файла url_list.txt рассмотрен ниже.


Установка и настройка webcheck

Установку webcheck необходимо выполнить из портов:

cd /usr/ports/www/webcheck
make install clean

Конфигурация webcheck хранится в файле config.py, который находится в папке /usr/local/share/webcheck. Для того, чтобы отключить не нужные в нашем случае схемы сканирования и плагины, формирующие отчеты, в файле config.py необходимо изменить две строки (ниже указаны новые значения параметров):

SCHEMES = ['http']
PLUGINS = ['sitemap']

Файл config.py содержит подробные комментарии и примерные значения большинства параметров, поэтому у Вас не должно возникнуть проблем с дополнительной (более тонкой) настройкой параметров сканирования сайта, которая в подавляющем большинстве случаев не потребуется.
Вы можете сформировать карту сайта, выполнив команду webcheck -aq http://www.company.com/, естественно, www.company.com нужно заменить на адрес Вашего сайта (ключ -a запрещает webcheck обрабатывать внешние ссылки, ключ -q отключает вывод сообщений). После завершения работы webcheck в текущей папке появится несколько файлов, включая sitemap.html. Он содержит карту сайта, однако ее формат не совместим с требуемым google-sitemapgen.
Написано позже: если Вы решите запускать webcheck с помощью cron'а, учтите, что в первозданном виде он не будет работать. Это обусловлено тем, что в заголовке скрипта указан неверный интерпретатор python. Для устранения недуга нужно изменить первую строку файла /usr/local/share/webcheck/webcheck.py c #!/usr/bin/env python на #!/usr/local/bin/python.


Стыковка google-sitemapgen и webcheck

Для создания файла url_list.txt в формате, который требуется google-sitemapgen, я использовал системные утилиты awk, sort и uniq, подробно описанные в awk(1), sort(1) и uniq(1), соответственно. Первый вызов awk выбирает все URL, не содержащие '?' (в моем случае индексирование таких URL не требуется) из файла sitemap.html, второй - расставляет дополнительные параметры, такие как частота обновления - changefreq, приоритет - priority и дата последнего обновления - lastmod. Вызов sort и uniq обеспечивает сортировку и удаление дубликатов URL, соответственно. В моем случае для всех документов, URL которых содержит текст catalog задается частота обновления - daily и приоритет 1.0, для остальных - частота обновления - weekly и приоритет 0.5. В качестве даты последнего изменения для всех документов выбирается текущая дата. Для выполнения описанного набора процедур я применяю периодически запускаемый скрипт следующего содержания:

#!/bin/sh
lastmod=`date +"%Y-%m-%d"`
folder=/tmp/webcheck
if [ ! -d $folder ]
then
mkdir $folder
fi
cd $folder
/usr/local/bin/webcheck -aq http://www.company.com/
cat sitemap.html
| awk '{if (index($3,"internal")>0 && index($2,"?")==0) {print substr($2,7,length($2)-7)}}'
| sort | uniq -u
| awk '{if (index($1,"catalog")>0) {print $1 " changefreq=daily priority=1.0 lastmod='$lastmod'"}
else {print $1 " changefreq=weekly priority=0.5 lastmod='$lastmod'"}}' > url_list.txt
/usr/local/bin/python /usr/local/lib/python2.5/site-packages/sitemap_gen.py
––config=/etc/sitemapgen.xml
rm -Rf $folder


Скрипт не нуждается в комментариях. Скорее всего для его адаптации Вам придется немного поиграть с вызовами awk (например, изменить существующие и/или добавить дополнительные). Я не специалист по awk, поэтому прошу прощение за возможную корявость написания кода. Приведенный вариант работает, и мне этого достаточно.
Написано позже: в связи с последним обновлением webcheck и обнаружением некоторых недочетов скрипт создания файла sitemap был изменен. Все изменения описаны в заметке Обновленный скрипт стыковки google-sitemapgen и webcheck.


Оповещение роботов поисковых систем

После настройки автоматической генерации файла sitemap.xml.gz необходимо оповестить о нем роботов поисковых систем. Проще всего сделать это с помощью файла robots.txt, добавив директиву Sitemap в раздел User-agent: *. Эта директива знакома большинству роботов.
Заключение

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

http://www.sergeysl.ru/freebsd-google-sitemapgen/

Обновлено: 12.03.2015