Автоматизация сбора данных статистики обхода и подачи на переобход страниц в Яндекс Вебмастере

Появление 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]