Tu blog tiene 200 artículos y quieres publicar diez más esta semana. Antes de abrir otra URL, conviene saber si alguno ya aparece cientos de veces en Google pero recibe pocos clics. Puedes revisar la tabla de Search Console a mano; con dos archivos CSV y un script pequeño puedes obtener una lista de candidatos en segundos y dedicar la revisión humana a los diez más visibles.
Este método amplía una decisión que ya contamos en SoyJB sobre mejorar URLs existentes antes de duplicar temas. Aquí la tarea es diferente: convertir dos exportaciones comparables de la pestaña Páginas en una lista reproducible. El script no cambia el sitio ni “arregla el SEO” automáticamente.
1. Exporta dos periodos completos
En Search Console abre Rendimiento → Resultados de búsqueda, usa el mismo tipo de búsqueda y los mismos filtros, y selecciona 28 días completos. Ve a Páginas, pulsa Exportar → CSV y guarda esa tabla como actual.csv. Repite con los 28 días anteriores y guarda anterior.csv. No incluyas el día en curso o datos preliminares: Google explica que las cifras recientes pueden cambiar.
Importante: el exportado normal de Search Console puede limitar las filas de la tabla a 1.000 ejemplos representativos, aunque el total del gráfico sea mayor. Este script sirve para un sitio pequeño o una primera criba, no para afirmar que analizó todas las URLs de un portal grande. Para más volumen se necesita la API o la exportación masiva.
2. Ejecuta el script
Guarda el siguiente código como gsc_csv_oportunidades.py en la misma carpeta que los dos CSV. Reconoce encabezados habituales en español e inglés, ignora herramientas y otras rutas que no sean del blog, calcula CTR como clics divididos por impresiones y muestra hasta diez URLs con al menos 100 impresiones y CTR de 2 % o menos. Esos umbrales son una criba editable, no una regla universal de Google.
"""Shortlist existing blog URLs from two Search Console Pages CSV exports."""
import csv
import sys
ALIASES = {
"Top pages": "url", "Páginas principales": "url", "Page": "url",
"Página": "url", "URL": "url", "Clicks": "clicks", "Clics": "clicks",
"Impressions": "impressions", "Impresiones": "impressions",
}
def load(path):
with open(path, encoding="utf-8-sig", newline="") as handle:
rows = csv.DictReader(handle)
fields = {ALIASES.get(k.strip(), k.strip()): k for k in rows.fieldnames or []}
needed = ("url", "clicks", "impressions")
if any(k not in fields for k in needed):
raise SystemExit(f"Faltan columnas en {path}: {needed}; recibidas {rows.fieldnames}")
data = {}
for row in rows:
url = row[fields["url"]].strip()
if "/blog/" not in url and "/en/blog/" not in url:
continue
data[url] = (
int(row[fields["clicks"]].strip()),
int(row[fields["impressions"]].strip()),
)
return data
def shortlist(current, previous, min_impressions=100, max_ctr=0.02):
found = []
for url, (clicks, impressions) in current.items():
if not impressions or impressions < min_impressions:
continue
ctr = clicks / impressions
if ctr > max_ctr:
continue
old_clicks, old_impressions = previous.get(url, (0, 0))
found.append((impressions, url, clicks, ctr, old_clicks, old_impressions))
return sorted(found, reverse=True)
if __name__ == "__main__":
if len(sys.argv) != 3:
raise SystemExit("Uso: python3 gsc_csv_oportunidades.py actual.csv anterior.csv")
for impressions, url, clicks, ctr, old_clicks, old_impressions in shortlist(
load(sys.argv[1]), load(sys.argv[2])
)[:10]:
print(f"{impressions:>5} imp | {clicks:>3} clics | {ctr:.1%} CTR | "
f"antes {old_impressions} imp/{old_clicks} clics | {url}")
Ejecuta python3 gsc_csv_oportunidades.py actual.csv anterior.csv. La salida muestra impresiones, clics y CTR actuales junto con los del periodo anterior. Si el CSV de tu cuenta utiliza otros nombres de columna, añade esos nombres al diccionario ALIASES; el error mostrará los encabezados recibidos. No pegues datos privados de Search Console en una herramienta pública para ejecutar el código.
3. Usa la lista para decidir, no para publicar otra nota
Una URL con 500 impresiones y 1 clic merece investigación; no demuestra que el título sea malo. En Search Console filtra esa página y abre Consultas: quizá aparece por preguntas que el texto no responde, está en una posición baja, o la página acaba de publicarse. Google recomienda revisar cambios por consulta y página, y mirar tendencias de impresiones y clics antes de sacar conclusiones sobre posición.

Comprueba también la fecha de publicación y de la última edición. El CSV de páginas no incluye la edad del artículo; por eso el script no puede excluir automáticamente posts de ayer. Espera a tener datos completos comparables y revisa una URL de edad similar. Si una página antigua responde otra intención, mejora el título y la apertura, añade el ejemplo que falta y conserva la URL. Si una página ya satisface la consulta, una cifra baja puede deberse a la página de resultados y no requerir cambios.
Prueba local: ejecuté el código con CSV de ejemplo en español e inglés. Detectó una URL de blog con 200 impresiones y dos clics, descartó otra con CTR alto y una ruta de herramientas, y mostró 50 impresiones del periodo anterior. Es una prueba de la lógica, no un resultado real de tráfico. Para un análisis preciso de tu sitio, confirma los filtros, las fechas y la cobertura de filas del exportado antes de actuar.
