На 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#

Не знаю на сколько надо объяснять что в этом скрипте, вроде бы все просто. Если есть вопросы — задавайте в комментариях.