Как стать автором
Обновить

Как отправить много страниц сайт на переиндексацию в Google Indexing API и автоматизировать процесс

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров377

Переиндексация URL в Google — важный инструмент в руках SEO-специалиста и маркетолога. Если вы внесли изменения на сайте, добавили новые страницы или изменили структуру — сообщить об этом Google можно руками в интерфейсе. Примерно вот так:

Но если у вас сайт примерно с вот таким количеством страниц, сделать это руками будет довольно проблематично.

С помощью Indexing API можно сильно ускорить этот процесс, хотя и не без костылей. Ниже расскажу, как автоматизировать этот процесс с помощью Python-скрипта, который уже есть на просторах интернета, но я немного доработал и усилил его.

Сам скрипт:

import datetime
from oauth2client.service_account import ServiceAccountCredentials
import httplib2
import json
import os
from script_mysql import MySQLi
from config import *
import time  # Добавляем импорт модуля time

"""
pip install google-api-python-client oauth2client
pip install --upgrade oauth2client
"""


def write_result(work_type, url, date):
    if work_type == 'database':
        db = MySQLi(host, user, password, database_home)
        db.commit("INSERT INTO indexing_api (url, date) VALUES (%s, %s)", url, datetime.date.today())
    elif work_type == 'txt_file':
        with open('result.txt', 'a', encoding='utf-8') as result_file:
            string_write = f"{url};{date}\n"
            result_file.write(string_write)


SCOPES = ["https://www.googleapis.com/auth/indexing"]


def indexURL2(u, http):
    ENDPOINT = "https://indexing.googleapis.com/v3/urlNotifications:publish"
    content = {'url': u.strip(), 'type': "URL_UPDATED"}
    json_ctn = json.dumps(content)
    response, content = http.request(ENDPOINT, method="POST", body=json_ctn)
    result = json.loads(content.decode())

    if "error" in result:
        print("Error({} - {}): {}".format(result["error"]["code"], result["error"]["status"],
                                          result["error"]["message"]))
        return "Error({} - {}): {}".format(result["error"]["code"], result["error"]["status"],
                                           result["error"]["message"])
    else:
        print("URL успешно отправлен на переиндексацию: {}".format(result["urlNotificationMetadata"]["url"]))

        if "latestUpdate" in result["urlNotificationMetadata"]:
            latest_update = result["urlNotificationMetadata"]["latestUpdate"]
            print("Последнее обновление URL:")
            print("- URL: {}".format(latest_update.get("url", "N/A")))
            print("- Тип: {}".format(latest_update.get("type", "N/A")))
            print("- Время уведомления: {}".format(latest_update.get("notifyTime", "N/A")))
        else:
            print("Нет данных о предыдущих обновлениях, но URL успешно отправлен.")

        return "OK"


count_urls = 0
for root, dirs, files in os.walk("json_keys"):
    for json_key_path_name in files:
        json_key = 'json_keys/' + json_key_path_name
        credentials = ServiceAccountCredentials.from_json_keyfile_name(json_key, scopes=SCOPES)
        http = credentials.authorize(httplib2.Http())

        with open("urls.csv", "r") as a_file:
            urls = a_file.readlines()

        with open("urls.csv", "w") as new_file:
            flag = False
            request_google_api = ''
            for url in urls:
                url_new = url.rstrip("\n")
                if flag:
                    new_file.write(url)
                else:
                    request_google_api = indexURL2(url_new, http)
                    time.sleep(1)  # Задержка в 1 секунду между запросами

                if 'Error' in request_google_api:
                    # Проверяем, если ошибка 429, то выводим, какой ключ исчерпал квоту
                    if "RESOURCE_EXHAUSTED" in request_google_api:
                        print(f"Квота исчерпана для ключа {json_key}")
                    flag = True
                    new_file.write(url)
                    request_google_api = ''
                else:
                    if not flag:
                        write_result('txt_file', url_new, datetime.date.today())
                        count_urls += 1

print("Отправлено на индексацию: " + str(count_urls) + " шт.")

Что делает скрипт?

Предварительно вам необходимо создать документ с раширением .py в отдельной папке. Вставить туда скрипт, рядом с ним создать документ urls.csv и папку json_keys .

Скрипт делает следующее:

  1. Читает список URL-адресов из файла urls.csv

  2. Отправляет каждый URL в Google Indexing API с типом URL_UPDATED

  3. Сохраняет результат в файл result.txt

  4. Учитывает ограничения по квоте — если квота исчерпана, скрипт определяет, для какого JSON-ключа это произошло, и продолжает с другим ключом из папки json_keys

  5. Добавлена задержка в 1 секунду между запросами, чтобы не превысить лимит частоты.

  6. Показывает в консоли:

    • какой URL был успешно отправлен

    • есть ли у него история обновлений

    • если ошибка — ее код, статус и сообщение

    • имя ключа, для которого исчерпана квота

Что потребуется?

  • Python 3+

  • Аккаунт Google Cloud с активированным Indexing API

  • Один или несколько сервисных JSON-ключей

Как получить сервисный ключ?

1. Регистрируем новый аккаунт в Гугл.

2. Переходим сюда: https://console.cloud.google.com/apis/enableflow?apiid=indexing.googleapis.com&;credential=client_key&hl=ru&pli=1  и активируем API.

3.Переходим сюда: https://console.cloud.google.com/projectselector2/iam-admin/serviceaccounts?supportedpurview=project и нажимаем на “Create Project”.

4. Затем создаем сервисный аккаунт.

5. Заполняем все данные, выбираем роль “Owner”. Нажимаем done.

6. Кликаем по созданному аккаунту (на почту).

7. Переходим в раздел Keys и добавляем новый ключ. Выбираем формат Json и сохраняем файл ключа в папку скрипта json_keys.

8. В Google Search Console переходим в “Настройки” — “Пользователи и разрешения” — “Добавляем сервисную почту созданного аккаунта”.

Что нового по сравнению с базовым скриптом?

Оригинальный скрипт просто пробегал по списку URL и отправлял их на индексацию. Мой улучшенный вариант:

  • Добавляет задержку в 1 секунду — Google рекомендует не спамить API слишком часто.

  • Определяет, какой JSON-ключ "сгорел" по квоте и пропускает его.

  • Пишет результат в текстовый файл (или в базу данных при необходимости).

  • Обрабатывает ошибки с кодом 429 RESOURCE_EXHAUSTED — это важнейшая защита от "обрыва" скрипта из-за превышения лимита.

  • Показывает, были ли ранее обновления по URL — это помогает оценить, когда URL последний раз попадал в индекс.

Как использовать?

  1. Создайте папку json_keys/ и положите туда один или несколько .json-ключей сервисных аккаунтов.

  2. Создайте файл urls.csv со списком адресов, например:

    https://example.com/page-1
    https://example.com/page-2
  3. Запустите скрипт — он сам всё обработает

Пример вывода в консоль

Вот примерно с такими сообщениями вы встретитесь
Вот примерно с такими сообщениями вы встретитесь

Проблема с квотами?

Google разрешает до 200 URL в день на проект, и это ограничение нельзя обойти простыми методами. Однако вы можете:

  • Создать несколько проектов в Google Cloud, каждый со своим JSON-ключом.

  • Скрипт перебирает ключи из папки json_keys/ по очереди.

  • Как только квота исчерпана у одного ключа, скрипт сообщает об этом и продолжает с другим.

Полезные дополнения

Скрипт, как и все можно развить и я оставил в коде простор для творчества. Вот идеи куда его еще можно развивать:

  • Хранение логов в БД — можно заменить txt_file на database и сохранить отправку в таблицу

  • Добавить Telegram-бота для уведомлений (например, если квота закончилась)

  • Парсинг и добавление новых URL в urls.csv из Sitemap сайта

Результат использования скрипта

До начала использования:

Еще далеко до конца
Еще далеко до конца

И всего через пару дней после:

Вау, оно наконец сдвинулось с мертвой точки, на которой стояло больше 2 месяцев
Вау, оно наконец сдвинулось с мертвой точки, на которой стояло больше 2 месяцев

Заключение

Google Indexing API — мощный инструмент ускорения индексации, особенно для свежего контента, страниц с критическими изменениями или восстановленных URL или если их пипец как много. Но важно учитывать лимиты и уметь работать с квотами. Мой доработанный скрипт решает все эти задачи и делает процесс переиндексации простым и понятным. Осталось только раздобыть 500 штуку гугл почт. =)

Теги:
Хабы:
+1
Комментарии2

Публикации

Истории

Работа

Data Scientist
48 вакансий

Ближайшие события

19 марта – 28 апреля
Экспедиция «Рэйдикс»
Нижний НовгородЕкатеринбургНовосибирскВладивостокИжевскКазаньТюменьУфаИркутскЧелябинскСамараХабаровскКрасноярскОмск
23 апреля
Meetup DevOps 43Tech
Санкт-ПетербургОнлайн
24 апреля
VK Go Meetup 2025
Санкт-ПетербургОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань
14 мая
LinkMeetup
Москва
5 июня
Конференция TechRec AI&HR 2025
МоскваОнлайн
20 – 22 июня
Летняя айти-тусовка Summer Merge
Ульяновская область