Receta
Rastrea backlinks con una diferencia semanal que puedes leer en un minuto
Extraer, almacenar, comparar, publicar. La receta completa es un archivo Python, una carpeta con JSON con fecha y una línea de cron.

La receta, de principio a fin
- 1
Crea la clave
Inicia sesión con Google, crea una clave en la página de la cuenta y expórtala como
RANKIFT_KEY. Nunca la subas al repositorio. - 2
Elige la acción
refdomainspara la diferencia a nivel de dominio, que es lo que la mayoría de las alertas necesitan. Usabacklinkssolo cuando necesites URLs y texto de anclaje, al mismo costo de 2 créditos. - 3
Almacena instantáneas con fecha
Un archivo por dominio por ejecución, nombrado con la fecha. El disco es barato y los archivos antiguos te permiten responder preguntas que aún nadie ha hecho.
- 4
Diferencia y publica
Compara los dos archivos más recientes, imprime lo que desapareció y lo que llegó, y salga silenciosamente si ambas listas están vacías.
- 5
Programa la ejecución
Cron el lunes por la mañana. Añade una notificación de fallo, porque un monitor silencioso es peor que ninguno.
diff.py
Verificado contra los parámetros documentados: action, q, per, page y key. La forma de la respuesta varía según la acción, así que imprime una respuesta real y ajusta ROWS e ID para que coincidan antes de confiar en ella.
import json, os, sys, glob, urllib.parse, urllib.request
KEY, SITE = os.environ['RANKIFT_KEY'], 'https://rankift.com/api.php'
ROWS, ID = 'rows', 'domain' # adjust after inspecting one response
def pull(domain):
out, page = [], 1
while True:
qs = urllib.parse.urlencode({'action': 'refdomains', 'q': domain,
'per': 1000, 'page': page, 'key': KEY})
with urllib.request.urlopen(f'{SITE}?{qs}') as r:
batch = json.load(r)[ROWS]
out += batch
if len(batch) < 1000 or page >= 5: # five pages = 5,000 rows
return out
page += 1
domain, date = sys.argv[1], sys.argv[2]
json.dump(pull(domain), open(f'snap/{domain}-{date}.json', 'w'))
files = sorted(glob.glob(f'snap/{domain}-*.json'))
if len(files) > 1:
old = {r[ID] for r in json.load(open(files[-2]))}
new = {r[ID] for r in json.load(open(files[-1]))}
lost, gained = sorted(old - new), sorted(new - old)
if lost or gained:
print(f'{domain}: -{len(lost)} +{len(gained)}')
print('lost:', lost[:25])Por qué una diferencia supera a un panel de control
Un gráfico te dice que la línea se movió. Una diferencia te dice qué dominios se movieron, que es lo que puedes actuar.
Herramientas como Ahrefs y Semrush muestran enlaces nuevos y perdidos en su propia interfaz, y para trabajo ad hoc está bien. El problema comienza con cincuenta sitios y un analista, cuando el ritual del lunes de abrir cada proyecto consume la mañana.
Un script convierte ese ritual en un archivo. También deja un archivo con fecha, así que en marzo puedes responder cómo se veía el perfil en octubre sin pedirle a un proveedor una exportación.
La línea de cron
Ejecuta el lunes a las 07:00 hora del servidor y envía cualquier salida por correo, por eso el script no imprime nada cuando no hubo cambios.
0 7 * * 1 cd /srv/linkwatch && for d in example.com rival-one.com rival-two.com; do python3 diff.py $d $(date +%F); done | mail -s 'link diff' your-team-listCuánto cuesta
| Configuración | Llamadas por semana | Créditos por semana | Por año |
|---|---|---|---|
| 1 dominio, menos de 1.000 dominios de referencia | 1 | 2 | aprox. $0.01 |
| 1 dominio, 4.000 dominios de referencia | 4 | 8 | aprox. $0.04 |
| Tu sitio y 5 rivales, 1 página cada uno | 6 | 12 | aprox. $0.06 |
| 50 sitios de clientes, 1 página cada uno | 50 | 100 | aprox. $0.52 |

Detalles a los que llegamos, para que tú no
Las instantáneas solo cambian cuando lo hace el índice. Actualizamos aproximadamente cada mes, por lo que la mayoría de las ejecuciones semanales devuelven una lista idéntica y no imprimen nada. Eso es intencional. El silencio es el resultado esperado.
La paginación profunda está limitada a 50.000 filas, y el límite de cinco páginas en el script te mantiene muy por debajo. Los dominios grandes necesitan un plan diferente: ordena con sort y order=desc en un campo que la acción acepte, y detente temprano una vez que las filas dejen de ser interesantes.
Ejecuta la primera extracción manualmente y lee el JSON. Verifica los nombres de los campos. Luego compara el recuento de filas con el total de dominios de referencia de una respuesta de la acción gratuita overview, si esa respuesta tiene uno.
Maneja HTTP 401 y 402 explícitamente, porque 401 significa una clave incorrecta y 402 significa que el saldo llegó a cero. Ambos deben estar en tu notificación de fallo. Cuando una diferencia se active, sigue el manual de enlaces perdidos durante la primera hora.
Medir una campaña de enlaces comprados, una instantánea a la vez
Comprar enlaces sin una línea base es una forma común de terminar con un número que no puedes defender. Toma la instantánea antes de que se active la primera colocación y guárdala junto con cada instantánea posterior.
Luego compara dominios de referencia, no recuentos brutos, porque un donante puede contener muchos enlaces. Cada nueva fila en la diferencia es un sitio que puedes abrir y verificar manualmente.
Una campaña que parece plana durante un mes no es automáticamente un fracaso. Las actualizaciones del índice son lentas, por lo que la diferencia retrasa lo que sucedió en las páginas en vivo, y ese retraso es parte del método.
¿Cómo mido si los backlinks comprados funcionaron?
Comienza desde la fecha de la primera colocación y busca las filas de donantes que aparezcan después. Cuenta solo las que permanecieron en las siguientes dos instantáneas. Luego compara ese recuento con lo que pagaste por las colocaciones y registra el resultado junto a las fechas.
¿Qué debe contener la instantánea antes de una compra?
La lista completa de dominios de referencia, guardada en el mismo formato de archivo que cada ejecución posterior, con la fecha y el dominio en el nombre del archivo. Una línea base en un formato diferente no se puede comparar, y ese es el error que no puedes reparar después.

Cómo se ve una semana ruidosa en la diferencia
Una semana con miles de filas nuevas no siempre es una crisis. A menudo son scrapers. Copian páginas y las copias crean enlaces que nadie colocó. Verifica el donante primero antes de asumir algo sobre tu propio sitio.
Ordena las filas nuevas por calidad del donante antes de leerlas. La mayor parte de la lista suele ser ruido, y una breve mirada a las filas superiores te dice si el pico merece el resto de tu mañana.
Si las filas son páginas de scrapers, registra el recuento y sigue adelante. Si son sitios reales con enlaces a tus páginas de dinero, sigue los pasos de triaje.
¿Por qué la diferencia muestra ganancias de spam?
Porque la diferencia informa lo que apareció en el índice, no lo que eligió un humano. El spam que el índice ha capturado se ve igual que un enlace editorial hasta que abres la página del donante y la lees.
¿Con qué frecuencia debo revisar los candidatos para desavow?
El mes se adapta mejor al ritmo del índice que el día. Una revisión diaria muestra principalmente la misma lista de nuevo, mientras que una mensual da a cada candidato tiempo para ser recrawlado antes de juzgarlo. La página de triage de enlaces de spam tiene los pasos de decisión.
Antes de confiar en la primera diferencia
- La primera extracción se leyó manualmente, fila por fila, durante al menos una página.
- Los nombres de los campos coinciden con las constantes en la parte superior del script.
- Un 401 y un 402 fallan en el trabajo ruidosamente, no silenciosamente.
- La carpeta de instantáneas está respaldada o sincronizada en algún lugar desde donde puedas restaurarla.
- Alguien que no sea el autor ha visto la primera alerta y está de acuerdo en que vale la pena un mensaje.
Mantén el archivo de instantáneas útil durante un año
Mantén cada archivo con fecha, incluidos los que parecen sin cambios. Un año de instantáneas semanales ocupa poco espacio en disco y responde preguntas que aún nadie ha hecho, como cuándo apareció un donante por primera vez.
Nombra los archivos de manera consistente, con el dominio, la fecha y la acción. Los nombres mixtos hacen que el script de diferencia elija el par incorrecto, y un par incorrecto produce una alerta segura pero errónea.
Comprime los archivos antiguos una vez cada trimestre si el espacio importa. Mantén los doce más recientes sin comprimir, para que el trabajo semanal nunca espere a un archivo.
¿Cómo encuentro la primera instantánea donde apareció un donante?
Ordena los archivos con fecha por nombre, luego busca en cada uno el dominio del donante hasta el primer acierto. Un bucle corto hace esto en unas pocas líneas, y el resultado es solo tan bueno como el nombre que mantuviste desde el principio.
¿Qué debo eliminar y qué debo mantener?
Mantén cada instantánea en la que se basó una decisión, más la primera y la última de cada mes. Elimina el resto solo después de que se haya verificado el archivo, porque un archivo eliminado no puede responder una pregunta más tarde.
Envía la diferencia donde la gente ya lee
Una diferencia que cae en una carpeta sin leer no tiene valor. Lo compartido supera a lo privado. Publica el resultado en el canal que tu equipo ya observa, y mantén el mensaje lo suficientemente corto para actuar en un vistazo.
Un buen mensaje nombra el dominio, el recuento de filas perdidas y ganadas, y el primer paso. Deja fuera la lista completa, que pertenece al archivo adjunto.
El silencio en una semana tranquila es parte del diseño. Si no hubo cambios, nadie necesita un recordatorio de que no hubo cambios. Manténlo así. El canal se mantiene legible para la próxima alerta real.
¿Qué debe contener el mensaje?
Tres cosas: el nombre del donante o rival, los dos recuentos y un enlace al archivo guardado. Cuando se adjunta una puntuación, añade la mejor Domain Rating entre las filas nuevas, porque un dominio fuerte cambia la prioridad más que diez débiles.
¿Quién recibe la notificación de fallo?
Alguien que pueda arreglar el trabajo, no solo alguien que lee los mensajes. Un 401 necesita una nueva clave, y un 402 necesita una recarga desde la página de la cuenta. Ninguno se resuelve esperando el próximo lunes.
Extenderlo
Cambia refdomains por backlinks cuando la alerta necesite la URL del donante y el ancla. Ten en cuenta el mismo costo de dos créditos.
Añade bulk_dr para puntuar cada dominio nuevo, a un crédito por llamada de hasta 2.000 dominios. Luego tu mensaje puede decir "3 nuevos, mejor DR 72" en lugar de una lista desnuda.
Para Google Sheets, la misma cadena de consulta funciona en Apps Script con UrlFetchApp. Y para rivales, usa los umbrales de alertas de backlinks de la competencia.