Автоматизация сбора данных статистики обхода и подачи на переобход страниц в Яндекс Вебмастере
Появление 404 статусов после обхода сайта яндексом вполне обычное дело, и таких страниц может быть достаточно много. При этом, нужно еще найти (определить) подходящую страницу для перенаправления (редиректа). Чтобы это не превращалось в сильную головную боль, мы нашли способ автоматизировать процесс. Предлагаем решение по упрощению той ситуации, когда мы ручками выбираем 404 страницы и пишем в .htaccess 301 редирект на актуальную страницу сайта, а затем отправляем несуществующую ссылку на переобход. Если таких ссылок 10, 20, 100 и более, то задача становится максимально рутинной - нужно взять ссылку несуществующей страницы, найти к ней максимально близкую (родственную) страницу, написать редирект и отправить на переобход.
И, именно этот процесс мы практически полностью автоматизировали.
Для получения битых ссылок достаточно скачать csv файл с результатами обхода, распарсить его и получить ссылки которые отдают 404 код.
Теперь, необходимо найти к этим несуществующим и битым ссылкам актуальные страницы или их ближайшую альтернативу, если такого товара (статьи и т.д.) больше не существует. Для этого можно использовать актуальную карту сайта sitemap.xml, но, если вы не уверены в её правильности, можно составить новый файл (во время составления карты сайта).
import sys
import logging
from pysitemap import crawler
if __name__ == '__main__':
if '--iocp' in sys.argv:
from asyncio import events, windows_events
sys.argv.remove('--iocp')
logging.info('using iocp')
el = windows_events.ProactorEventLoop()
events.set_event_loop(el)
root_url = 'ссылка/на/сайт'
crawler(root_url, out_file='file_input/sitemap.xml')
Как мы предлагаем все это автоматизировать
Визуально анализируем строение ссылки и делаем вывод о том, что общего в обеих ссылках – общее будет, как как минимум, каталог/раздел и, если, конечный товар/статья еще существует на сайте, то его название непременно содержится в обеих ссылках. Речь идет про ЧПУ в адресе ссылки, если вы не используете ЧПУ, то срочно переходите на них.
Установив такую закономерность, напрашивается простой вывод - для этой задачи отлично подойдет алгоритм Боейра-Мура (далее БМ) по поиску подстроки в строке.
def boyer_moore_match(text, pattern):
alphabet = set(text)
last = last_occurrence(pattern, alphabet)
m = len(pattern)
n = len(text)
i = m - 1 # text index
j = m - 1 # pattern index
while i < n:
if text[i] == pattern[j]:
if j == 0:
return True
else:
i -= 1
j -= 1
else:
l = last(text[i])
i = i + m - min(j, 1 + l)
j = m - 1
return -1
Но, найти соответствия, это не еще не все, нам важно чтобы совпадали каталоги/разделы, так как название товаров по версии БМ могут быть одинаковыми, но содержаться в разных местах. Именно поэтому, когда скрипт по алгоритму БМ находит тождество, требуется проанализировать структуру ссылки и проверить ее на соответствие. И только после этого, можно смело заявлять о полном тождестве и записывать ссылки в файлик, где строки будут иметь вид:
Redirect 301 /каталог_икс/старая/ссылка/ https://домен.ru/каталог_икс/новая/ссылка
Для удобства, рекомендуем сортировать ссылки по каталогам и сохранять их файлом именно в таком виде.
При этом, нельзя забывать про остатки и одиночек, которым не нашлось пары - их мы записываем в отдельный файлик, который потом просматриваем с пристрастием и решаем, что с ними делать.
Теперь, берем все несуществующие и битые ссылки, которым нашлось соответствие и запишем их в отдельный файл, где разобьем их по 140 штук, т.к. именно такой дневной лимит на переобход дает Яндекс.
Таким образом, по итогу, мы получаем 3 выходных файла:
- файл с битыми ссылками, которым не нашлось соответствия
- файл со ссылками на переобход
- коллекцию файлов, отсортированных по каталогам с прописанными редиктами
Можно смело сказать, что получилось ускорить и автоматизировать работу более чем на 80%. Все, что осталось сделать, это скопировать редиректы в .htaccess файл сайта и добавлять ссылки для переобхода в яндекс вебмастер.
После добавления редиректов в .htaccess можем проверить, действительно ли невалидные ссылки дают 301 редирект на валидную страницу - для этого мы написали небольшую функцию:
import requests as re
def link_checker(links: list):
no_redirect = list()
for link in links:
r = re.get(link)
if str(r.history[0]) == "<Response [301]>":
continue
else:
no_redirect.append(link)
if no_redirect:
return no_redirect
else:
return True
Дальше, об автоматизации
У Я. Вебмастера есть API, позволяющее отправлять ссылки на переобход.
1. Для этого нужно - создать приложение Яндекс.OAuth [https://oauth.yandex.ru/] и произвести авторизацию, о которой мы писали в статье интеграция с API соцсетей для авторизации пользователей.
2. Получаем идентификатор пользователя, необходимый для вызова любых ресурсов через API.
Запрос:
[GET] [https://api.webmaster.yandex.net/v4/user]
Ответ:
{
"user_id": 1
}
где, user_id - это ID пользователя.
3. Далее, получаем ID сайта
Запрос:
[GET] [https://api.webmaster.yandex.net/v4/user/{user-id}/hosts]
где user_id - это ID пользователя из 2ого шага
Пример ответа:
{
"hosts":
{
“host_id”:
“http:example.site:80”,
...
}
}
4. Следующим шагом, в теле запроса передаем URL страницы, которую следует переобойти.
[POST] [https://api.webmaster.yandex.net/v4/user/{user-id}/hosts/{host-id}/recrawl/queue]
где
user_id - ID пользователя полученный во 2ом шаге
host_id - ID сайта из шага 3
{
“url”: “http://вашсайт.рф”
}
где url - это ссылка на Ваш сайт
Ответ:
{
"task_id": "c7fe80c0-36e3-11e6-8b2d-df96aa592c0a",
"quota_remainder":
1
}
где task_id - это ID задачи на переобход
quota_remainder - это остаток запросов(сайтов), которые вы
можете отправить на переобход в течение суток (Не забываем, что их максимальное количество 140)
Можно написать простой Task Manager, который будет заниматься отправкой ссылок на переобход, но, это по желанию. В результате, мы автоматизировали одну из самых рутинных задач по SEO. С подробным кодом можно ознакомится на нашей страничке гихаб [https://github.com/StudioDivier/seo-urls]