О чём?
В этой публикации мы разберём вопрос генерации карты сайта для поисковых роботов. Речь пойдёт о создании файла Sitemap.xml силами JavaScript
Первый важный момент
Существует две разновидности Sitemap.xml:
- Это файл-индекс с набором ссылок на файлы-карты
- Это сами файлы-карты
Второй важный момент — размер строки адреса
Существуют ограничения самого файлов-индексов и файлов-карт:
- Количество адресов в файле не должно превышать 50000 штук
- Размер файла не должен превышать 50 мегабайт (52 428 800 байт)
- Размер строки-адреса не должен превышать 2048 символов (2048 байт)
Что даёт нам эта информация?
Во-первых, при написании функции генерации Sitemap.xml мы должны учитывать появление файла-индекса. Если мы хотим «скормить» роботам один миллиард адресов, тогда нам понадобится минимум (1000000000 / 50000) = 20000 файлов + 1 файл-индекс, в котором будут лежать ссылки на эти 20К адресов.
Вывод можно сделать такой: переполнить файл-индекс адресами представляется «нереальным» для большинства сайтов (доменов)
Во-вторых, мы должны хорошо представлять структуру сайта, а именно длину его адресов. Приведу 2 примера:
--первый пример
https://www.example.com/
https://www.example.com/1
https://www.example.com/1000000000
--второй пример
https://www.example.www.example.www.example.www.example.com/
https://www.example.www.example.www.example.www.example.com/safgygvjydarkcwbyibvwnwr
https://www.example.www.example.www.example.www.example.com/jhfsdjfhgjevebrhajkbre-aberhbakjervbaverkvubrv-aerbaebrbubiearbuireab-arbhbvraejbhvrehb
Как выдумаете? Какой вариант Sitemap.xml быстрее заполнит 50 мегабайт? Мы не будем гадать. Мы посчитаем. (1 символ = 1 байт)
-- первый пример new Blob(["http://www.example.com/"]).size 23 new Blob(["https://www.example.com/1"]).size 25 new Blob(["https://www.example.com/1000000000"]).size 34
--второй пример new Blob(["https://www.example.www.example.www.example.www.example.com/"]).size 60 new Blob(["https://www.example.www.example.www.example.www.example.com/safgygvjydarkcwbyibvwnwr"]).size 84 new Blob(["https://www.example.www.example.www.example.www.example.com/jhfsdjfhgjevebrhajkbre-aberhbakjervbaverkvubrv-aerbaebrbubiearbuireab-arbhbvraejbhvrehb"]).size 147
Скрин из браузера
Теперь просто перемножим байты на максимальное возможное количество адресов в файле Sitemap.xml
23*50000 = 1150000 байт (1,1 Мб) 25*50000 = 1250000 байт (1,19 Мб) 34*50000 = 1700000 байт (1,62 Мб) 60*50000 = 3000000 байт (2,86 Мб) 84*50000 = 4200000 байт (4,01 Мб) 147*50000 = 7350000 байт (7,01 Мб)
Последний вариант записи самый ёмкий. Чем длиннее адрес, тем больше он будет занимать места в файле.
Третий важный момент — размер «обвязки» строки адреса
Для файлов-индексов обязательны XML-теги:
- <sitemapindex> Инкапсулирует информацию о всех файлах Sitemap в этом файле.
- <sitemap> Инкапсулирует информацию об отдельном файле Sitemap.
- <loc> Указывает местоположение файла Sitemap. Этим местоположением может быть файл Sitemap, файл Atom, файл RSS или простой текстовый файл.
Для файлов-карт обязательны XML-теги:
- <urlset> Инкапсулирует этот файл и указывает стандарт текущего протокола.
- <url> Родительский тег для каждой записи URL-адреса. Остальные теги являются дочерними для этого тега.
- <loc> URL-адрес страницы. Этот URL-адрес должен начинаться с префикса (например, HTTP) и заканчиваться косой чертой, если Ваш веб-сервер требует этого. Длина этого значения не должна превышать 2048 символов.
Есть необязательные XML-теги. Уверен, что поисковые системы хорошо справляются без них. Поэтому даже не буду их рассматривать.
Четвёртый важный момент — Маскирование символов
Если у вас не ЧПУ-адреса, то придётся потратить больше символов для редактирования. Рекомендую перевести сайт на ЧПУ (Человеко-Понятные-УРЛы)
Символ | Маскирование | |
---|---|---|
Амперсанд | & | & |
Одинарные кавычки | ‘ | ' |
Двойные кавычки | « | " |
Больше | > | > |
Меньше | < | < |
Пятый важный момент —
Функция генерации Sitemap.xml на клиенте (браузере) — для файлов-карт
Функция будет принимать массив адресов-строк. Если их будет больше 50000, то массив будет обрезан до 50000 адресов. Функция будет возвращать файл «sitemap.xml» в браузере.
function getSitemapXML(array){ if (array.length>50000){array.length = 50000}; var a = array.map(i=>`<url>\n<loc>\n${i}\n</loc>\n</url>\n`).join(""); var b = `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${a}\n</urlset>`; var blob = new Blob([b], {type: "text/plain"}); var link = document.createElement("a"); link.setAttribute("href", URL.createObjectURL(blob)); link.setAttribute("download", "sitemap.xml"); link.click(); }
Пример работы функции. Создадим массив и зальём его одинаковыми адресами.
var arr = Array(60000) arr.fill("https://www.example.www.example.www.example.www.example.com/jhfsdjfhgjevebrhajkbre-aberhbakjervbaverkvubrv-aerbaebrbubiearbuireab-arbhbvraejbhvrehb")
Функция генерации sitemap.xml на клиенте — JavaScript
Вызываем функцию и передаём в неё наш массив:
getSitemapXML(arr)
Содержимое созданного файла
Смотрим, что внутри файла, который скачался из браузера
Хром успешно распознал разметку и нашёл в карте 50 тысяч адресов.
Информационные ссылки
JavaScript | Как сохранить данные в файл на клиенте (браузере)?
XML-формат файла Sitemap — https://www.sitemaps.org/ru/protocol.html