IndexNow i Indexing API czyli natychmiastowe indeksowanie serwisu WWW ‑ Skrypty w Python

Używając tych skryptów w python, możesz zaindeksować swoją stronę w wynikach wyszukiwania praktycznie natychmiast.

Skrypty, służą do automatycznego zgłaszania ze strony internetowej (pobiera dane z sitemap) do systemu indeksowania wyszukiwarkek Bing i Google, wykorzystując protokół IndexNow i Indexing API. Jest to przydatne w przypadku, gdy chcesz, aby nowe treści na twojej stronie były szybko odkryte i zindeksowane, co może przyspieszyć ich pojawienie się w wynikach wyszukiwania. Z testów wynika że w przeciągu kilku minut cała zawartość na poziomie 10 tysięcy podstron pojawia się w Google.

Co dokładnie robią skrypty?

  1. Pobieranie pliku sitemap: Skrypt zaczyna od pobrania pliku sitemap.xml, który zazwyczaj zawiera listę wszystkich dostępnych URL-i na stronie internetowej. Plik ten jest używany przez wyszukiwarki do lepszego rozumienia struktury witryny.
  2. Analiza pliku sitemap: Po pobraniu, skrypt parsuje plik XML, aby wyodrębnić z niego URL-e. Sitemap XML jest standardem i zazwyczaj stosuje określone schematy nazw, które skrypt musi rozpoznać, aby prawidłowo odczytać URL-e.
  3. Wysyłanie żądania POST: Następnie skrypt zbiera te URL-e i przygotowuje z nich listę (do 10 000 URL-i na żądanie), którą przesyła do systemu IndexNow poprzez żądanie HTTP POST w formacie JSON. Żądanie to jest wysyłane na serwer wyszukiwarki, z którym chcesz się komunikować (np. Bing).
  4. Przetwarzanie odpowiedzi: Skrypt również sprawdza odpowiedź od serwera wyszukiwarki, co pozwala zobaczyć, czy zgłoszenie URL-i zakończyło się sukcesem, czy też wystąpiły jakieś problemy.

Jak go uruchomić

Aby uruchomić skrypt Pythona, który automatycznie zgłasza URL-e do systemu IndexNow czy Indexing API, potrzebujesz spełnić kilka podstawowych warunków i wykonać następujące kroki:

Wymagania:
Python: Upewnij się, że masz zainstalowanego Pythona na swoim komputerze. Możesz go pobrać i zainstalować z oficjalnej strony Pythona.
Biblioteka Requests: Musisz mieć zainstalowaną bibliotekę requests, którą możesz zainstalować lub zaktualizować za pomocą polecenia pip. Otwórz terminal lub wiersz poleceń i wpisz:

Skrypt pythonie do Indexing API

import requests
import xml.etree.ElementTree as ET

# Konfiguracja
sitemap_url = 'https://www.example.com/sitemap.xml'
search_engine = 'api.indexnow.org'
host_name = "www.example.com"
key = "2342342342523423423423"
# key_location = "https://www.example.com/5e98e8a534564a618fe410f7b37ba664.txt"

def fetch_sitemap(url):
    response = requests.get(url)
    response.raise_for_status()  # Sprawdza, czy zapytanie się powiodło
    return response.text

def parse_sitemap(xml_content):
    root = ET.fromstring(xml_content)
    namespaces = {'ns': 'http://www.sitemaps.org/schemas/sitemap/0.9'}  # Dostosuj namespace do twojego sitemap
    url_list = [url.find('ns:loc', namespaces).text for url in root.findall('ns:url', namespaces)]
    return url_list

def submit_to_indexnow(url_list, search_engine_hostname):
    post_url = f'http://{search_engine_hostname}/indexnow'
    headers = {'Content-Type': 'application/json; charset=utf-8'}
    body = {
        "host": host_name,
        "key": key,
        # "keyLocation": key_location,
        "urlList": url_list
    }
    response = requests.post(post_url, json=body, headers=headers)
    return response.status_code, response.text

# Wykonanie funkcji
sitemap_content = fetch_sitemap(sitemap_url)
urls = parse_sitemap(sitemap_content)
status_code, response_text = submit_to_indexnow(urls[:10000], search_engine)  # Przesyła maksymalnie pierwsze 10000 URL-i

print(f"Status: {status_code}, Response: {response_text}")

Skrypt pythonie do Google Indexing

from google.oauth2 import service_account
from googleapiclient.discovery import build
import xml.etree.ElementTree as ET
import requests

# Konfiguracja
# Definiujemy zakresy dostępu do API
SCOPES = ['https://www.googleapis.com/auth/indexing']

# Ścieżka do pliku z kluczem usługi
SERVICE_ACCOUNT_FILE = 'indexing-api.json'

# Adres URL sitemap.xml
sitemap_url = 'https://adreswww.pl/sitemap.xml'


def authenticate_with_google():
    """
    Uwierzytelnia się w Google API i zwraca zainicjowany serwis indexing.
    """
    # Tworzymy obiekt z klucza usługi
    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    # Inicjujemy serwis indexing z zainicjowanymi poświadczeniami
    service = build('indexing', 'v3', credentials=credentials)
    return service


def fetch_sitemap(url):
    """
    Pobiera treść sitemap.xml z podanego adresu URL.
    """
    response = requests.get(url)
    response.raise_for_status()
    return response.text


def parse_sitemap(xml_content):
    """
    Wyodrębnia z sitemap.xml listę URL.
    """
    root = ET.fromstring(xml_content)
    namespaces = {'ns': 'http://www.sitemaps.org/schemas/sitemap/0.9'}
    url_list = [url.find('ns:loc', namespaces).text for url in root.findall('ns:url', namespaces)]
    return url_list


def submit_urls_to_google_indexing_api(service, url_list):
    """
    Przesyła listę URL do API usługi indexing Google.
    """
    for url in url_list:
        # Tworzymy treść zapytania
        body = {
            'url': url,
            'type': 'URL_UPDATED'
        }
        # Przesyłamy zapytanie
        response = service.urlNotifications().publish(body=body).execute()
        print(f"Przesłano {url}: Odpowiedź {response}")


# Główna logika
google_service = authenticate_with_google()
sitemap_content = fetch_sitemap(sitemap_url)
urls = parse_sitemap(sitemap_content)
submit_urls_to_google_indexing_api(google_service, urls)

Problemy jakie mogą wystąpić

  • Błąd HttpError 403: Permission denied. Failed to verify the URL ownership sygnalizuje, że Google nie widzi Twojej aplikacji (a dokładniej – konta usługi) jako właściciela adresu URL, który próbujesz zgłosić.
  • W konsoli Cloud włącz Indexing API dla projektu, z którego pochodzi konto usługi.
  • Plik credentials.json używany w skrypcie musi pochodzić z tego samego konta usługi.
  • Skrypt powinien uwierzytelniać się przy pomocy OAuth 2.0 service account bez dodatkowych zakresów – biblioteka googleapiclient robi to domyślnie.
  • Od 2024 r. Google Indexing API jest oficjalnie przeznaczone wyłącznie do stron z JobPosting albo BroadcastEvent w VideoObject. Zgłaszanie innych typów URL nie jest blokowane technicznie, ale narusza wytyczne i może prowadzić do ograniczenia albo błędów. Zobacz w Google Search Central.
  • Zweryfikuj witrynę w Google Search Console
    • Dodaj właściwość („Domena” obejmuje wszystkie protokoły i subdomeny).
    • Zakończ weryfikację (DNS TXT lub inną metodą).