На Bash за 5 минут, без регистрации и SMS
Раньше я писал свои генераторы Sitemap на PHP. Затем я привык пользоваться разными готовыми генераторами, которые имеют ограничения либо платные. В очередной раз встал вопрос генерации Sitemap.xml для нового отредизайненного GeekJOB.ru
И тут что-то подумалось, а что если написать свой генератор на базе WGET? Ведь он умеет рекурсивно собирать ссылки по сайту. Нам нужно будет только проставить время и вес собранных ссылок. Вроде интересная задача, го решать…
Ликбез
Sitemap.xml — это XML-файл, в котором перечислены URL-адреса. Это в простом варианте. Более расширенный вариант предполагает наличие метаданных: дата последнего изменения, частота изменений, приоритет. Все это нужно чтобы поисковые системы могли более грамотно сканировать сайт.
Пример файла:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<url>
<loc>https://geekjob.ru/</loc>
<lastmod>2019-09-18T14:12:23+03:00</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://geekjob.ru/vacancy</loc>
<lastmod>2019-09-18T14:12:23+03:00</lastmod>
<priority>0.80</priority>
</url>
</urlset>
Пишем Bash скрипт
Собственно суть: собираем с помощью WGET рекурсивно ссылки с сайта и собираем файл:
#!/bin/bash
sitedomain=https://geekjob.ru
rm -v linklist.txt
wget --spider --recursive --level=inf -nv --output-file=linklist.txt --reject '*.js,*.css,*.ico,*.txt,*.gif,*.jpg,*.png,*.pdf,*.txt' --ignore-tags=img,link,script --header="Accept: text/html" --follow-tags=a $sitedomain
grep -i URL linklist.txt | awk -F 'URL:' '{print $2}' | awk '{$1=$1};1' | awk '{print $1}' > clearlinks.txt
header='<?xml version="1.0" encoding="UTF-8"?><urlset
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">'
echo $header > sitemap.xml
lastmod=$(date "+%Y-%m-%dT%H:%M:%S+03:00")
limit=1024
itr=0
while read link
do
(( itr++ )) ; [ $itr -eq $limit ] && break
# Костыльный способ весовки, мне он подходит, для вас - решайте сами
priority=0.80
if [ $itr -eq 1 ]
then
priority=1.00
else
if [ $itr -gt 50 ];then
priority=0.76
fi
if [ $itr -gt 128 ];then
priority=0.64
fi
if [ $itr -gt 256 ];then
priority=0.51
fi
if [ $itr -gt 512 ];then
priority=0.42
fi
if [ $itr -gt 700 ];then
priority=0.33
fi
fi
# Отформатированный вывод
#echo -e "t<url>ntt<loc>$link</loc>ntt<lastmod>$lastmod</lastmod>ntt<priority>$priority</priority>nt</url>" >> sitemap.xml
# Без лишних табуляторов
echo -e "<url><loc>$link</loc><lastmod>$lastmod</lastmod><priority>$priority</priority></url>" >> sitemap.xml
done < clearlinks.txt
echo -e "</urlset>" >> sitemap.xml
#EOF#
Не знаю на сколько надо объяснять что в этом скрипте, вроде бы все просто. Если есть вопросы — задавайте в комментариях.