Разработка электроники,

Систем автоматики,

Программного обеспечения

ООО "Антех ПСБ",
Санкт-Петербург

+79811865082

anteh@bk.ru

ООО Антех ПСБ примеры

Автогенератор Sitemap.xml и Sitemap.xml.gz для сайта/ов

Сайт https://anteh.ru

Последние изменения:

27.10.2015 -в скрипте нужно webcheck заменить на webchrck.py

24.10.2015 Установка FreeBSD 10.2 webcheck 1.10.3_1, google-sitemapgen 1.5

04.01.2016 Усовершенствованный скрипт автоматической генерации sitemap для заданного списка хостов с учётом совместно работающего mod_security

Для сайта формируются и .xml и .xml.gz. Предполагается, что у Вас есть сервер FreeBSD и Вам нужно для какого-либо сайта сформировать Sitemap.xml и Sitemap.xml.gz. Если сервера под рукой нет, то формирование Sitemap файлов можно произвести на существующих для этого сервисах. Если страниц немного 500-1500, то это как правило бесплатно.

Нужно:
1.Выбрать всех url. Через webcheck порт.
2.Фильтрация, выбор нужных файлов сайта. Скрипт.
3.Генерация Sitemap.xml и Sitemap.xml.gz по стандарту google. При помощи google-sitemapen порта.

Формировать .xml.gz файл Sitemap можно в случае, если размер файла, согласно протоколу http://sitemaps.org/ru/protocol.php, превысит 10 мегабайт. В robots.txt можно указывать и .xml и .xml.gz файлы для одного сайта. Робот сам выберет наиболее свежий из них. Есть и ограничение в 50 000 урлов на один Sitemap. Для больших сайтов Sitemap файлов может быть несколько.

Обновляем FreeBSD порты.
Устанавливаем:

#webcheck /usr/ports/www/webcheck

#google-sitemapgen /usr/ports/www/google-sitemapgen


Конфигурационные файлы:
/usr/local/share/webcheck/config.py #конфигурационный файл webcheck можно не настраивать.
/etc/sitemap/sitemapgen.site1.ru.xml.conf #конфигурационный .xml файл google-sitemapen для site1.ru

/etc/sitemap/sitemapgen.site1.ru.xml.gz.conf #конфигурационный .xml.gz файл google-sitemapen для site1.ru

/etc/sitemap/sitemapgen.site1.com.conf #конфигурационный файл google-sitemapen для site1.com

В приводимом примере, для .ru формируем и.xml и .xml.gz, для .com только .xml -так захотелось).
Файл конфигурации google-sitemapen, может иметь любое имя и располагаться где угодно, содержимое sitemapgen.site1.ru.xml.conf:

<?xml version="1.0" encoding="UTF-8"?>
<site
base_url="http://site1.ru/"
store_into="/path/site1.ru/Sitemap.xml"
verbose="1"
>
<urllist path="/tmp/webcheck/url_list.txt" encoding="UTF-8" />
</site>

sitemapgen.site1.ru.xml.gz.conf:

<?xml version="1.0" encoding="UTF-8"?>
<site
base_url="http://site1.ru/"
store_into="/path/site1.ru/Sitemap.xml.gz"
verbose="1"
>
<urllist path="/tmp/webcheck/url_list.txt" encoding="UTF-8" />
</site>

sitemapgen.site1.com.conf:

<?xml version="1.0" encoding="UTF-8"?>
<site
base_url="http://site1.com/"
store_into="/path/site1.com/Sitemap.xml"
verbose="1"
>
<urllist path="/tmp/webcheck/url_list.txt" encoding="UTF-8" />
</site>

Создаём скипты /etc/sitemap/site1.ru.sitemapgen и /etc/sitemap/site1.com.sitemapgen.


/etc/sitemap/site1.ru.sitemapgen:

#!/bin/sh
lastmod=`date +"%Y-%m-%d"`
folder=/tmp/webcheck
if [ ! -d $folder ]
then
mkdir $folder
fi
cd $folder
/usr/local/bin/webcheck.py -afq http://site1.ru/
cat urllist.html \
| awk '{if (index($3,"internal")>0 && index($2,"?")==0) {print substr($2,7,length($2)-7)}
| awk '!/(\/|\.css|\.gif|\.jpeg|\.jpg|\.js)$/' | sort \
| awk '{if (index($1,"catalog")>0) {print $1 " changefreq=daily priority=1.0 lastmod='$la
else {print $1 " changefreq=weekly priority=0.5 lastmod='$lastmod'"}}' > url_list.txt
/usr/local/bin/python /usr/local/lib/python2.7/site-packages/sitemap_gen.py \
--config=/etc/sitemap/sitemapgen.site1.ru.xml.conf
/usr/local/bin/python /usr/local/lib/python2.7/site-packages/sitemap_gen.py \
--config=/etc/sitemap/sitemapgen.site1.ru.xml.gz.conf
rm -Rf $folder

/etc/sitemap/site1.com.sitemapgen:

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

...|\.css|\.gif|\.jpeg|\.jpg|\.js... тут перечисляем типы файлов, которых не будет в Sitemap файлах.

Собственно запуск скрипта:
# /bin/sh /etc/sitemap/site1.ru.sitemapgen

После окончания увидим подоюный вывод:


...
The Sitemap type is WEB Sitemap.
Opened URLLIST file: /tmp/webcheck/url_list.txt
Sorting and normalizing collected URLs.
Writing Sitemap file "/path/site1.ru/Sitemap.xml" with 54 URLs
Notifying search engines.
Notifying: www.google.com
Count of file extensions on URLs:
54 .html
Number of errors: 0
Number of warnings: 0
Reading configuration file: /sitemap/sitemapgen.site1.ru.xml.gz.conf
The Sitemap type is WEB Sitemap.
Opened URLLIST file: /tmp/webcheck/url_list.txt
Sorting and normalizing collected URLs.
Writing Sitemap file "/path/site1.ru/Sitemap.xml.gz" with 54 URLs
Notifying search engines.
Notifying: www.google.com
Count of file extensions on URLs:
54 .html
Number of errors: 0
Number of warnings: 0

Разумеется необходимо подключение к internet для построения sitemap любого сайта, находящегося как на текущем сервере, так и на любом другом.

Возможные проблемы:
Проверить версию python2.7 -должна соответствовать установленной
/usr/local/share/webcheck/config.py -запретить использование файла robots.txt при построении карты сайта, установить USE_ROBOTS = False

Конфигурация webcheck хранится в файле /usr/local/share/webcheck/config.py. Для того, чтобы отключить не нужные в нашем случае схемы сканирования и плагины, формирующие отчеты, в файле config.py необходимо изменить: PLUGINS = ['sitemap'] -достаточно только этого параметра. Оставлял всё как было.

Версия webcheck 1.10.3 формирует index.html и urllist.html. index.html содержит карту сайта в виде многоуровневого списка, urllist.html - в виде одноуровневого. Можно вытащить список URL'ов из любого из них.

Установка FreeBSD 10.2 webcheck 1.10.3_1, google-sitemapgen 1.5

Ставим:

#webcheck-1.10.3 /usr/ports/www/webcheck

#google-sitemapgen-1.5 /usr/ports/www/google-sitemapgen

Если запустить вышеприведённый скрипт, то получаем такую ошибку:

# /bin/sh /<path>/sitemap/anteh.ru.sitemapgen
env: python: No such file or directory
cat: urllist.html: No such file or directory
/<path>/sitemap/anteh.ru.sitemapgen: /usr/local/bin/python: not found
/<path>/sitemap/anteh.ru.sitemapgen: /usr/local/bin/python: not found

"env: python: No such file or directory" строка генерируется /usr/local/bin/webcheck.py. Смотрим файл @webcheck.py, первой строкой идёт "#!/usr/bin/env python". Python находится в /usr/local/bin директории, но там только @python2. В файле /usr/local/bin/webcheck.py меняем первую строку на "#!/usr/bin/env python2" и скрипт редактируем до такого состояния:

#!/bin/sh
lastmod=`date +"%Y-%m-%d"`
folder=/tmp/webcheck
if [ ! -d $folder ]
then
mkdir $folder
fi
cd $folder
/usr/local/bin/webcheck.py -afq http://site.ru/
cat urllist.html \
| awk '{if (index($3,"internal")>0 && index($2,"?")==0) {print substr($2,7,length($2)-7)}}' \
| awk '!/(\/|\.css|\.gif|\.jpeg|\.png|\.ogg|\.ogv|\.dll|\.rar|\.gz|\.pdf|\.tar|\.jpg|\.js|\.mpeg)$/' | sort \
| 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/python2 /usr/local/lib/python2.7/site-packages/sitemap_gen.py \
--config=/etc/sitemap/sitemapgen.anteh.ru.xml.conf
/usr/local/bin/python2 /usr/local/lib/python2.7/site-packages/sitemap_gen.py \
--config=/etc/sitemap/sitemapgen.anteh.ru.xml.gz.conf
rm -Rf $folder

В общем в 3х местах к python добавляем цифру "2". Результат работы скрипта 2 файла, сайтмап и его сжатая версия. Файлы будут сформированы в корневой директории сайта. Желательно сделать резервные копии старых файлов сайтмапа

...
Reading configuration file: /<path>/sitemapgen.site.ru.xml.conf
The Sitemap type is WEB Sitemap.
Opened URLLIST file: /tmp/webcheck/url_list.txt
Sorting and normalizing collected URLs.
Writing Sitemap file "/<path>/site.ru/Sitemap.xml" with 74 URLs
Notifying search engines.
Notifying: www.google.com
Count of file extensions on URLs:
73 .html
Number of errors: 0
Number of warnings: 0
Reading configuration file: /<path>/sitemapgen.site.ru.xml.gz.conf
The Sitemap type is WEB Sitemap.
Opened URLLIST file: /tmp/webcheck/url_list.txt
Sorting and normalizing collected URLs.
Writing Sitemap file "/<path>/site.ru/Sitemap.xml.gz" with 74 URLs
Notifying search engines.
Notifying: www.google.com
Count of file extensions on URLs:
73 .html
Number of errors: 0
Number of warnings: 0
#

Усовершенствованный скрипт автоматической обработки заданного списка хостов с учётом совместно работающего mod_security. mod_security автоматически отключается на время генерации sitemap

Скрипт

Пример sitemap файла конфигурации .xml.conf

Пример sitemap файла конфигурации .xml.gz.conf

#!/usr/local/bin/bash
set -o nounset
set -o errexit
#/usr/local/bin/bash /<script directory>/sitemap/sitemapgen

#=== CONFIG ============================
#Apache virtual host configuration file
VHostNameOr="/usr/local/etc/apache24/extra/httpd-vhosts.conf"
#Add host to handle
Host=(anteh.ru anteh.com adc.anteh.ru site.ru)
#Soft apache restart. Handle each host separately
MODE="seq"
#Hard apache restart. Handle all hosts simultaneously. apachectl restart
#MODE="all"
#Dir with config for sitemap files
HostConfDir="/<script directory>/sitemap"
#---------------------------------------



host_handle()
{
lastmod=`date +"%Y-%m-%d"`
folder=/tmp/webcheck
if [ ! -d $folder ]
then
mkdir $folder
fi
cd $folder
/usr/local/bin/webcheck.py -afq http://$1/
cat urllist.html \
| awk '{if (index($3,"internal")>0 && index($2,"?")==0) {print substr($2,7,length($2)-7)}}' \
| awk '!/(\/|\.css|\.gif|\.jpeg|\.png|\.ogg|\.ogv|\.dll|\.rar|\.gz|\.pdf|\.tar|\.jpg|\.js|\.mpeg)$/' | sort \
| 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/python2 /usr/local/lib/python2.7/site-packages/sitemap_gen.py \
--config=$2/sitemapgen.$1.xml.conf
/usr/local/bin/python2 /usr/local/lib/python2.7/site-packages/sitemap_gen.py \
--config=$2/sitemapgen.$1.xml.gz.conf
rm -Rf $folder
}


#${Hosts[@]} $VHostName
offf(){
#=== Correction of Hosts for regular expressions
declare -a HostsReg=(${Hosts[@]})
if (( ${#HostsReg[@]}>0 )); then
i=-1
for a in "${HostsReg[@]}"; do
i=$((i+1))
HostsReg[i]=`echo $a | sed 's/\./\\\./g'`
done
fi
echo "=- HOSTS: ${Hosts[@]} =="
readarray vh < $VHostNameOr

#Handle array
if (( ${#vh[@]}>0 )); then
i=-1
start=0
last=0
SecRulEng_present=false
cat /dev/null > $VHostNameOr
for a in "${vh[@]}"; do #Handle all file
i=$((i+1))
if [[ $a =~ ^[[:space:]]*\<VirtualHost.*\>{1}[[:space:]]*$ ]]; then
start=$i
fi
if [[ $a =~ ^[[:space:]]*\</VirtualHost\>[[:space:]]*$ ]]; then
flag=true
str=$start
SecRulEng_present=false
while [ $str -le $i ] #Search ServerName marker
do
if $flag ;then #FIRST
if [[ ${vh[$str]} =~ ^[[:space:]]*ServerName[[:space:]]*.*$ ]]; then
for b in "${HostsReg[@]}"; do #Find host
if [[ ${vh[$str]} =~ ^[[:space:]]*ServerName[[:space:]]*$b[[:space:]]*$ ]]; then
echo ${vh[$str]}
flag=false
str=$[$start-1]
break
fi
done
fi
else
#Handle Vhost block SECOND
if [[ ${vh[$str]} =~ ^[[:space:]]*SecRuleEngine[[:space:]]*.*[[:space:]]*$ ]]; then
vh[$str]="SecRuleEngine Off"$'\n'
SecRulEng_present=true #SecRuleEngine was changed no need to create
fi
fi
str=$[$str+1]
done

while [ $last -lt $i ] #Add Block to out FIRST
do
#echo ${vh[$last]} >> "$VHostNameOr"
printf "%s" "${vh[$last]}" >> "$VHostNameOr"
if ! $flag && ! $SecRulEng_present ;then
if [[ ${vh[$last]} =~ ^[[:space:]]*\<VirtualHost.*\>{1}[[:space:]]*$ ]]; then
#echo "SecRuleEngine Off" >> "$VHostNameOr"
printf "%s\n" "SecRuleEngine Off" >> "$VHostNameOr"
fi
fi
last=$[$last+1]
done
fi
done
while [ $last -lt ${#vh[@]} ] #Add Block to out SECOND
do
#echo ${vh[$last]} >> "$VHostNameOr"
printf "%s" "${vh[$last]}" >> "$VHostNameOr"
last=$[$last+1]
done
fi
}


declare -a Hosts=()
#=== Check mod_security LoadModule
mod_security_activated=false
if echo `apachectl -M` | egrep -q '.*security2_module \(shared\).*';then
mod_security_activated=true
echo "=- mod_security Detected =="
fi
if $mod_security_activated ;then #Change SecRuleEngine On to Off if mod_security loaded

#=== Rezerv copy create ===============
VHostName=$VHostNameOr"_rzq0"
i=0
while [ -f $VHostName ]
do
if [ $i -ge 5 ];then #Create only 5 rezerved copy cyclic
i=0
rm $VHostNameOr"_rzq$i"
fi
VHostName=$VHostNameOr"_rzq$i"
i=$[$i+1]
done
cp $VHostNameOr $VHostName #Reserv copy
echo "=- Rezerv file: "$VHostName


if [ $MODE == "all" ];then
Hosts=("${Host[@]}")
offf
apachectl restart
ia=0
while [ $ia -lt ${#Hosts[@]} ] #Add Block to out SECOND
do
host_handle ${Hosts[$ia]} $HostConfDir
ia=$[$ia+1]
done
cp $VHostName $VHostNameOr
apachectl restart
fi

if [ $MODE == "seq" ];then
ib=0
while [ $ib -lt ${#Host[@]} ] #Add Block to out SECOND
do
Hosts=("${Host[$ib]}")
offf
apachectl -k graceful
host_handle ${Hosts[0]} $HostConfDir
cp $VHostName $VHostNameOr
ib=$[$ib+1]
done
#cp $VHostName $VHostNameOr
apachectl -k graceful
fi
echo "=- Return SecRuleEngine to last value =="
exit 0
else
echo "=- Mod_security Not Detected =="

ib=0
while [ $ib -lt ${#Host[@]} ] #Add Block to out SECOND
do
Hosts=("${Host[$ib]}")
host_handle ${Hosts[0]} $HostConfDir
ib=$[$ib+1]
done
apachectl -k graceful

fi
exit 0

Скрипт автоматически отключает mod_security для перечисленных хостов. Реализовано 2 режима. В первом режиме отключается mod_security для всех перечисленных хостов, "жёстко" перезапускается апач apachectl restart и производится формирование sitemap файлов для каждого из перечисленных хостов. Отключение mod_security для каждого из указанных хостов производится через "SecRuleEngine Off" директиву, скриптом добавляемую в конфигурационном файле апача.

Во втором режиме производится мягкий перезапуск апача "apachectl -k graceful", причём каждый из указанных хостов обрабатывается индивидуально. Для каждого хоста производится установка опции "SecRuleEngine Off", мягкий перезапуска апача, генерация сайт мап файлов. Т.е. mod_security для обрабатываемого хоста отключён только на время генерации sitemap файлов.

Если mod_security не подключен, то просто производится генерация sitemap для указанных хостов, без изменеия конфигурационного файла апача.

Циклически создаётся 5 резервных копий указанного конфигурационного файла апача.

Не делаются резервные копии старых файлов sitemap.

Нужно реализовать вывод данных в лог файл иначе трудно судить, сколько чего было преобразовано.

Можно ещё директиву echo поменять на printf, в критичных местах используется printf.

echo не точно делает запись в файл, например убирает первые пробелы табуляции или вообще портит строку:
" RewriteRule ^(.*)$ http://anteh.com/$1 [L,R=301]"
меняет на строку
"RewriteRule ^(.*)$ http://anteh.ru/$1 0 1"
И собственно, цитата:
"printf команда была создана для замены всем знакомой команды echo, настолько древней, что даже имя ее автора не известно. Возможности команды echo ограничены, кроме того, в разных ветках Unix'а оказались разные ее версии, что приводит к несовместимости. Поэтому Posix рекомендует пользоваться командой printf.

Добавление возврата строки в текущую строку:

string="some text"$'\n'

Нужно проверить сайт на правильные ссылки на https://validator.w3.org/checklink. Неправильно, когда ссылка на сайте вида http://../notes_a1.html. Проблема в "../" этого сочетания символов в ссылках не должно быть. Иначе проблемы с индексацией. Появятся дубли записей в sitemap файле и сылок станет больше, чем на самом деле. Браузеры такие неправильные ссылки обрабатывает нормально. Но для поисковых роботов это неправильная запись. Пример проверки страниц с подобными ошибками:

 List of broken links and other issues

There are issues with the URLs listed below. The table summarizes the issues and suggested actions by HTTP response status code.
Code    Occurrences     What to do
400     21      This is usually the sign of a malformed URL that cannot be parsed by the server. Check the syntax of the link.

error Line: 34 https://anteh.ru/../apg2.html
    Status: 400 Bad Request

    This is usually the sign of a malformed URL that cannot be parsed by the server. Check the syntax of the link. 
error Line: 39 https://anteh.ru/../apg7.html
    Status: 400 Bad Request

    This is usually the sign of a malformed URL that cannot be parsed by the server. Check the syntax of the link.
...

Copyright ©Новиков Алексей Александрович,

2023 Санкт-Петербург, 197372, ООО "Антех ПСБ",

anteh собака bk.ru