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 или E-mail рассылку, канал Twitter, где я сообщаю об интересных событиях в мире OpenSource, канал FriendFeed, где я делюсь ссылками на полезные публикации по администрированию Linux/Unix. Спасибо за визит!
Сергей, а для Unix-хостинга данный способ развёртывания сайтмэп-генератора подходит?
FreeBSD вроде как тоже Unix
Подходит, только поконкретнее настраивайте webcheck (количество запросов в единицу времени), чтобы нагрузка на процессор не зашкаливала. Хотя, если хостов не очень много, а железо достаточно мощное, то и без дополнительных заморочек проблем не будет.
Спасибо, давно думал как сделать нечто подобное со своим сайтом
На здоровье! Только учтите, что webcheck обновился, имена и форматы генерируемых файлов изменились. Немного позже я буду переделывать скрипт, генерирующий sitemap рабочего сайта (пока сделал на скорую руку, есть недочеты). Если интересно, выложу обновленный вариант.
угу, насчет webcheck уже заметил, обновленный вариант конечно было бы интересно посмотреть, а то сейчас сам пытаюсь его сделать
самое паршивое что все sitemap генераторы на выходе дают разное число страниц, кому верить незнаю, вот и приходится самому делать
Навскидку изменилось следующее (разбираться подробнее не было времени):
1. webcheck теперь нужно запускать с ключами
-afq, подробнееwebcheck --help.2. список URL’ов теперь нужно выбирать из файла
urllist.html, а неsitemap.html.Дальнейшая обработка списка URL’ов как и раньше по потребностям с помощью
awk.Выложил Обновленный скрипт стыковки google-sitemapgen и webcheck. Прошу прощение за длительную задержку
вот спасибо большое за статью а то я измаялся вчера полночи убил и в итоге так и не осилил…сейчас попробую эту схему провернуть, тьфу три раза…
На здоровье. Даже без “тьфу три раза” должно работать