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

Файл 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 в очередь на индексацию. Независимо от того, на сколько сильно была изменена структура сайта, Вам достаточно одной команды, чтобы в кратчайшие сроки «освежить» память роботов.

Понравилась статья?

Подпишитесь на RSS или почтовую рассылку;

Присоединяйтесь в Twitter, Facebook, Google+, VK;

Поделитесь ссылкой в социальной сети или блоге:

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

  1. Сергей, а для Unix-хостинга данный способ развёртывания сайтмэп-генератора подходит?

    • FreeBSD вроде как тоже Unix 😀 Подходит, только поконкретнее настраивайте webcheck (количество запросов в единицу времени), чтобы нагрузка на процессор не зашкаливала. Хотя, если хостов не очень много, а железо достаточно мощное, то и без дополнительных заморочек проблем не будет.

    • На здоровье! Только учтите, что webcheck обновился, имена и форматы генерируемых файлов изменились. Немного позже я буду переделывать скрипт, генерирующий sitemap рабочего сайта (пока сделал на скорую руку, есть недочеты). Если интересно, выложу обновленный вариант.

      • угу, насчет webcheck уже заметил, обновленный вариант конечно было бы интересно посмотреть, а то сейчас сам пытаюсь его сделать
        самое паршивое что все sitemap генераторы на выходе дают разное число страниц, кому верить незнаю, вот и приходится самому делать

        • Навскидку изменилось следующее (разбираться подробнее не было времени):
          1. webcheck теперь нужно запускать с ключами -afq, подробнее webcheck --help.
          2. список URL’ов теперь нужно выбирать из файла urllist.html, а не sitemap.html.
          Дальнейшая обработка списка URL’ов как и раньше по потребностям с помощью awk.

  2. вот спасибо большое за статью а то я измаялся вчера полночи убил и в итоге так и не осилил…сейчас попробую эту схему провернуть, тьфу три раза…

  3. Весьма подробная инструкция. Благодарю. А вот такое руководство компании, если Вы там еще работаете, надо жестко строить.

Оставить комментарий