Automatizar la indexación de contenidos con Python

La indexación de los contenidos suele darnos algún quebradero de cabeza que otro y es que Google a veces puede hacernos poco caso o ignorarnos durante días e incluso semanas. Para agilizar el proceso de notificación al bot de los nuevos contenidos que hemos publicado o de la actualización de los mismos podemos hacer uso de la API de indexación de Google, que según ellos mismos, es más recomendable incluso que actualizar el sitemap y hacer ping a Google:

Google asegura que es mejor utilizar la API Indexing que los sitemaps para notificar modificaciones del contenido.
Fuente: Guía de inicio a la API Indexing

Cuando gestionamos un site cuyo ritmo de publicación es constante como puede ser un medio de comunicación, un portal de empleo o incluso un ecommerce, podemos hacer uso de esta API para agilizar el proceso de indexación y que Google sea consciente del ritmo de publicación que llevamos.

Disclaimer: Oficialmente la API está destinada únicamente para URLs con marcado de datos "En directo" y "Oferta de empleo" pero está demostrado que es un buen trigger para que al menos Google visite la URL solicitada, así que igualmente puede ser un procedimiento válido para acelerar el rastreo pero no asegura en ningún caso la indexación.

Framework de automatización para la indexación de contenidos

Para automatizar este proceso y agilizar el ritmo de indexación de nuevos contenidos, vamos a utilizar diferentes herramientas que nos van a permitir crear un framework de trabajo eficiente para que nos haga ser más productivos.

Para ello, vamos a utilizar las siguientes herramientas para crear nuestro workflow:

  • La API de inspección de URLs de Google.
  • Screaming Frog
  • La API de indexación de Google.
  • Python.
  • Programador de tareas de Windows.

El workflow de trabajo que vamos a crear será el siguiente:

Automatizar la indexacion de contenidos para SEO

Una vez tenemos claro el workflow, ¡vamos al grano!

Programar rastreo en Screaming Frog

Screaming Frog tiene una funcionalidad muy útil que es la programación de rastreos, la cual nos puede ayudar en la extracción automática de información sin que tengamos que estar continuamente abriendo la app.

Antes de programar nuestro rastreo, primero vamos a crear una configuración de rastreo específica. Para ello vamos a limitar el rastreo a las URLs a las que queremos hacer seguimiento (podrían ser nuevos productos, últimos artículos del blog, ofertas de empleo, etc). Cada configuración va a depender del caso, por ejemplo: limitamos las URLs que tiene que rastrear en la sección de «incluir», limitamos si es necesario el número de URLs, excluimos el rastreo fuera de la carpeta de inicio, etc. Tampoco olvidemos conectar con la API de Google Search Console y activar la casilla de la API de inspección ya que es la que nos va a servir para identificar URLs que aún no están en Google. Tras configurar el rastreo, guardamos dicha configuración en un archivo «.seospiderconfig».

Una vez tengamos nuestra configuración específica guardada, creamos una programación de rastreo: le damos nombre, descripción, etc., definimos nuestra URL semilla y cargamos la configuración de rastreo que hemos creado anteriormente. La periodicidad será cosa tuya, pero podemos hacer un rastreo diario a primera hora de la mañana, por ejemplo las 08:00h. No olvidemos señalar la pestaña de conexión con Google Search Console.

1. Configuramos el nombre, descripción y periodicidad del rastreo programado en Screaming Frog
2. Definimos URL semilla y cargamos la configuración de rastreo específica que hemos creado anteriormente.

Por último, debemos definir cómo vamos a exportar los datos y aquí vamos a señalar la pestaña «Search Console:URLs indexables no indexadas», ya que serán estas URLs las que nos interesa forzar su indexación.

El documento de exportación será en formato CSV y activaremos la casilla «Sustituir achivos en destino», lo que sobrescribirá los datos de la extracción anterior cada vez que se ejecute.

3. Definimos el método de exportación: fichero CSV, sustituir archivos en destino y exportamos la pestaña «Search Console:URLs indexables no indexadas»

Script de Python

Una vez tengamos el rastreo programado de forma periódica, vamos a hacer uso de un script de Python para leer el documento que se ha exportado del rastreo de Screaming Frog y hacer la llamada a la API Indexing de Google para notificarle de que hay algunas URLs indexables que aún no están en Google.

La lógica es sencilla: con Screaming extraemos las URLs de aquellos artículos/productos que hemos publicado recientemente y que aún no se han indexado y con Python recogemos estas URLs y utilizamos la API para forzar su indexación.

Para utilizar la API de indexación de Google con Python he utilizado el tutorial de JC Chouinard.

Importamos las librerias necesarias que vamos a utilizar en el script:

from oauth2client.service_account import ServiceAccountCredentials
from googleapiclient.discovery import build
import httplib2
import pandas as pd
from datetime import date

Leemos el fichero CSV que ha exportado Screaming Frog y que siempre se llamará igual porque los datos se sobrescriben con cada extracción. Extraemos las URLs y rellenamos el diccionario «requests» que será el que utilizaremos para hacer la petición en bulk a la API:

file = open('search_console_url_indexable_no_indexada.csv', 'r')
next(file)
urls = [row.split(",")[0].replace('"','') for row in file]

requests = {}

type = 'URL_UPDATED'
counter = 0
for i in urls:
        if counter < 200:
            requests[i.strip()] = type
            counter += 1

Después llamamos a la API de indexación y le enviamos el batch de URLs:

# Credits to JC Chouinard https://www.jcchouinard.com/google-indexing-api-with-python/
JSON_KEY_FILE = "client_secrets.json"

SCOPES = ["https://www.googleapis.com/auth/indexing"]
ENDPOINT = "https://indexing.googleapis.com/v3/urlNotifications:publish"

# Authorize credentials
credentials = ServiceAccountCredentials.from_json_keyfile_name(JSON_KEY_FILE, scopes=SCOPES)
http = credentials.authorize(httplib2.Http())

# Build service
service = build('indexing', 'v3', credentials=credentials)

def insert_event(request_id, response, exception):
    if exception is not None:
        print(exception)
    else:
        print(response)


batch = service.new_batch_http_request(callback=insert_event)

for url, api_type in requests.items():
    batch.add(service.urlNotifications().publish(
        body={"url": url, "type": api_type}))

batch.execute()

Finalmente vamos a crear un documento de logs con la fecha del día para que tengamos un registro de las URLs a las que hemos forzado su indexación:

df = pd.DataFrame({
    'URLs': urls,
    'Accion': type
})
today = date.today()

df.to_csv(str(today)+'-Indexation_Status.csv')

Programador de tareas

Una vez que ya tenemos el script creado y el rastreo de Screaming programado, la autentica magia está en automatizar este proceso de tal forma que cada día (o la periodicidad que desees), el script se ejecute automáticamente tras el rastreo de Screaming Frog para recoger las URLs no indexadas y hacer la request a la API ¡¡TODO DE FORMA AUTOMÁTICA!!

Para ello vamos a utilizar el programador de tareas de Windows.

Únicamente necesitamos tres cosas:

  1. La ubicación del ejecutable de Python (.exe)
  2. La ubicación de nuestro script
  3. La ubicación de la carpeta donde se ubica nuestro script

Para saber donde está ubicado el ejecutable de Python, puedes usar este comando en la consola CMD:

py -c "import sys;print(sys.executable)"

Una vez que conocemos estos tres elementos comentados, abrimos nuestro programador de tareas y creamos una nueva tarea:

En «Acciones» rellenamos los campos así:

Y en «Desencadenadores» programamos la ejecución del script de forma periodica justo despues del rastreo de Screaming Frog, por ejemplo, a las 08:05h:

Con esto ya estaría el workflow montado… ¡¡Ahora a disfrutar de la magia de la automatización!!

Resumen del proceso

En definitiva, lo que va a ocurrir diariamente y sin que hagamos absolutamente nada es:

  • Rastreo automático de Screaming Frog de las URLs específicas (nuevos productos, artículos, etc.) que queramos. De este rastreo se exportará un documento CSV con las URLs que son indexables y que no están indexadas aún gracias a la URL Inspection API.
  • Ejecución automática del script de Python que recogerá estas URLs y utilizará la API Indexing para notificar a Google de esto.
  • Finalmente, estas URLs deberían indexarse en un lapso de tiempo corto, pero esto es algo que no se puede asegurar al 100%.

Sobre el autor

Alex Romero Lopez, Consultor SEO en España
alejandro.romerolopez95@gmail.com Web Otros artículos del autor

Especialista SEO con gran foco en el área técnica. Entusiasta de la programación, en especial Python y Javascript, y la aplicación de ésta en el ámbito SEO para automatizar procesos o profundizar en ciertos ámbitos como el web scraping o el uso de APIs. He trabajado en proyectos SEO de muy diferente tamaño y sector lo que me permite obtener una perspectiva 360º de cómo trabajarlo.

2 comentarios en «Automatizar la indexación de contenidos con Python»

  1. Hola Alex. Muchas gracias por compartir conocimiento. He leído que la API de indexación solo es efectiva en el envío de streams de directo y que ignora otro tipo de contenidos como noticias o nuevas páginas. Al menos así se especifica en la documentación. ¿Has podido si esto es así? Gracias

    Responder

Deja un comentario