
Переиндексация 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
.
Скрипт делает следующее:
Читает список URL-адресов из файла
urls.csv
Отправляет каждый URL в Google Indexing API с типом
URL_UPDATED
Сохраняет результат в файл
result.txt
Учитывает ограничения по квоте — если квота исчерпана, скрипт определяет, для какого JSON-ключа это произошло, и продолжает с другим ключом из папки
json_keys
Добавлена задержка в 1 секунду между запросами, чтобы не превысить лимит частоты.
Показывает в консоли:
какой 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 последний раз попадал в индекс.
Как использовать?
Создайте папку
json_keys/
и положите туда один или несколько.json
-ключей сервисных аккаунтов.Создайте файл
urls.csv
со списком адресов, например:https://example.com/page-1 https://example.com/page-2
Запустите скрипт — он сам всё обработает
Пример вывода в консоль

Проблема с квотами?
Google разрешает до 200 URL в день на проект, и это ограничение нельзя обойти простыми методами. Однако вы можете:
Создать несколько проектов в Google Cloud, каждый со своим JSON-ключом.
Скрипт перебирает ключи из папки
json_keys/
по очереди.Как только квота исчерпана у одного ключа, скрипт сообщает об этом и продолжает с другим.
Полезные дополнения
Скрипт, как и все можно развить и я оставил в коде простор для творчества. Вот идеи куда его еще можно развивать:
Хранение логов в БД — можно заменить
txt_file
наdatabase
и сохранить отправку в таблицуДобавить Telegram-бота для уведомлений (например, если квота закончилась)
Парсинг и добавление новых URL в
urls.csv
из Sitemap сайта
Результат использования скрипта
До начала использования:

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

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