Recette
Suivez les backlinks avec une différence hebdomadaire lisible en une minute
Extraction, stockage, comparaison, publication. La recette tient dans un seul fichier Python, un dossier de fichiers JSON datés et une ligne cron.

La recette, de A à Z
- 1
Créez la clé
Connectez-vous avec Google, créez une clé sur la page du compte et exportez-la sous le nom
RANKIFT_KEY. Ne jamais la committer dans le repo. - 2
Choisissez l'action
refdomainspour la différence au niveau du domaine, ce qui convient à la plupart des alertes. Utilisezbacklinksuniquement si vous avez besoin des URLs et des ancres, au même coût de 2 crédits. - 3
Stockez des instantanés datés
Un fichier par domaine et par exécution, nommé avec la date. Le disque est bon marché, et les anciens fichiers vous permettent de répondre à des questions qu'on ne vous a pas encore posées.
- 4
Diff et publication
Comparez les deux fichiers les plus récents, affichez ce qui a disparu et ce qui est apparu, et quittez silencieusement si les deux listes sont vides.
- 5
Planifiez-le
Cron le lundi matin. Ajoutez une notification en cas d'échec, car un moniteur silencieux est pire qu'aucun moniteur.
diff.py
Vérifié par rapport aux paramètres documentés : action, q, per, page et key. La forme de la réponse varie selon l'action, donc imprimez une vraie réponse et définissez ROWS et ID pour qu'ils correspondent avant de lui faire confiance.
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])Pourquoi un diff bat un tableau de bord
Un graphique vous dit que la ligne a bougé. Un diff vous dit quels domaines ont bougé, ce qui est l'élément sur lequel vous pouvez agir.
Des outils comme Ahrefs et Semrush affichent les liens nouveaux et perdus dans leur propre interface, et pour un travail ponctuel, c'est suffisant. Le problème commence à cinquante sites et un seul analyste, lorsque le rituel du lundi consistant à ouvrir chaque projet avale la matinée.
Un script transforme ce rituel en un fichier. Il laisse également une archive datée, de sorte qu'en mars, vous puissiez répondre à la question sur l'apparence du profil en octobre sans supplier un fournisseur pour une exportation.
La ligne cron
S'exécute le lundi à 07:00 heure du serveur et vous envoie tout résultat par email, c'est pourquoi le script n'imprime rien lorsqu'il n'y a aucun changement.
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-listCe que cela coûte
| Configuration | Appels par semaine | Crédits par semaine | Par an |
|---|---|---|---|
| 1 domaine, moins de 1 000 domaines référents | 1 | 2 | environ $0.01 |
| 1 domaine, 4 000 domaines référents | 4 | 8 | environ $0.04 |
| Votre site et 5 concurrents, 1 page chacun | 6 | 12 | environ $0.06 |
| 50 sites clients, 1 page chacun | 50 | 100 | environ $0.52 |

Les pièges que nous avons rencontrés, pour que vous les évitiez
Les instantanés ne changent que lorsque l'index change. Nous rafraîchissons environ mensuellement, donc la plupart des exécutions hebdomadaires retournent une liste identique et n'impriment rien. C'est intentionnel. Le silence est le résultat attendu.
La pagination profonde est limitée à 50 000 lignes, et la limite de cinq pages dans le script vous maintient bien en dessous. Les domaines très importants nécessitent une approche différente : triez avec sort et order=desc sur un champ que l'action accepte, et arrêtez-vous tôt une fois que les lignes ne sont plus intéressantes.
Exécutez le premier tirage à la main et lisez le JSON. Vérifiez les noms de champs. Ensuite, comparez le nombre de lignes avec le total des domaines référents d'une réponse de l'action gratuite overview, si cette réponse en contient un.
Gérez explicitement les erreurs HTTP 401 et 402, car 401 signifie une clé invalide et 402 signifie que le solde est à zéro. Les deux doivent figurer dans votre notification d'échec. Lorsqu'un diff se déclenche, suivez le guide des liens perdus pendant la première heure.
Mesurer une campagne d'achat de liens, instantané par instantané
Acheter des liens sans une ligne de base est un moyen courant de se retrouver avec un chiffre que vous ne pouvez pas défendre. Prenez l'instantané avant que le premier placement ne soit en ligne, et conservez-le à côté de chaque instantané suivant.
Ensuite, comparez les domaines référents, et non les comptes bruts, car un seul donneur peut porter de nombreux liens. Chaque nouvelle ligne dans le diff est un site que vous pouvez ouvrir et vérifier à la main.
Une campagne qui semble plate pendant un mois n'est pas automatiquement un échec. Les rafraîchissements de l'index sont lents, donc le diff accuse un retard par rapport à ce qui s'est passé sur les pages en direct, et ce retard fait partie de la méthode.
Comment mesurer si les backlinks achetés ont fonctionné ?
Commencez à la date du premier placement et cherchez les lignes de donneurs qui apparaissent après. Ne comptez que celles qui sont restées dans les deux instantanés suivants. Ensuite, confrontez ce compte à ce que vous avez payé pour les placements, et notez le résultat à côté des dates.
Que doit contenir l'instantané avant un achat ?
La liste complète des domaines référents, sauvegardée dans le même format de fichier que chaque exécution ultérieure, avec la date et le domaine dans le nom de fichier. Une ligne de base dans un format différent ne peut pas être comparée, et c'est l'erreur que vous ne pouvez pas réparer par la suite.

À quoi ressemble une semaine bruyante dans le diff
Une semaine avec des milliers de nouvelles lignes n'est pas toujours une crise. Souvent, ce sont des scrapers. Ils copient des pages, et les copies créent des liens que personne n'a placés. Vérifiez le donneur avant de supposer quoi que ce soit sur votre propre site.
Triez les nouvelles lignes par qualité du donneur avant de les lire. La plupart de la liste est généralement du bruit, et un court coup d'œil aux premières lignes vous dit si l'augmentation mérite le reste de votre matinée.
Si les lignes sont des pages scrapées, notez le compte et passez à autre chose. Si ce sont de vrais sites avec des liens vers vos pages d'argent, suivez les étapes de triage.
Pourquoi le diff montre-t-il des gains provenant de spam ?
Parce que le diff rapporte ce qui est apparu dans l'index, pas ce qu'un humain a choisi. Le spam que l'index a récupéré ressemble à un lien éditorial jusqu'à ce que vous ouvriez la page du donneur et la lisiez.
À quelle fréquence devrais-je examiner les candidats au disavow ?
Mensuellement convient mieux au rythme de l'index que quotidiennement. Un examen quotidien montre principalement la même liste encore, tandis qu'un examen mensuel donne à chaque candidat le temps d'être recrawlé avant que vous ne le jugiez. La page triage des liens spam contient les étapes de décision.
Avant de faire confiance au premier diff
- Le premier tirage a été lu à la main, ligne par ligne, pour au moins une page.
- Les noms de champs correspondent aux constantes en haut du script.
- Un 401 et un 402 font tous deux échouer le job bruyamment, pas silencieusement.
- Le dossier des instantanés est sauvegardé ou synchronisé quelque part où vous pouvez le restaurer.
- Quelqu'un d'autre que l'auteur a vu la première alerte et convient qu'elle vaut la peine d'être un message.
Conservez l'archive des instantanés utile pendant un an
Conservez chaque fichier daté, y compris ceux qui semblent inchangés. Un an d'instantanés hebdomadaires prend peu d'espace disque, et il répond à des questions qu'on ne vous a pas encore posées, comme quand un donneur est apparu pour la première fois.
Nommez les fichiers de manière cohérente, avec le domaine, la date et l'action. Des noms mélangés font que le script de diff choisit la mauvaise paire, et une mauvaise paire produit une alerte convaincante mais fausse.
Compressez les fichiers plus anciens une fois par trimestre si l'espace est important. Conservez les douze plus récents non compressés, afin que le travail hebdomadaire n'attende jamais une archive.
Comment trouver le premier instantané où un donneur est apparu ?
Triez les fichiers datés par nom, puis recherchez dans chacun le domaine du donneur jusqu'à la première correspondance. Une courte boucle fait cela en quelques lignes, et le résultat n'est bon que si la nommage a été conservé depuis le début.
Que devrais-je supprimer, et que devrais-je conserver ?
Conservez chaque instantané sur lequel une décision a été basée, ainsi que le premier et le dernier de chaque mois. Supprimez le reste uniquement après que l'archive a été vérifiée, car un fichier supprimé ne peut pas répondre à une question plus tard.
Envoyez le diff là où les gens lisent déjà
Un diff qui atterrit dans un dossier non lu n'a aucune valeur. Le partage bat le privé. Publiez le résultat dans le canal que votre équipe regarde déjà, et gardez le message assez court pour agir en un coup d'œil.
Un bon message nomme le domaine, le nombre de lignes perdues et gagnées, et la première étape. Il exclut la liste complète, qui appartient au fichier joint.
Le silence sur une semaine calme fait partie de la conception. Si rien n'a changé, personne n'a besoin d'un rappel que rien n'a changé. Gardez-le ainsi. Le canal reste lisible pour la prochaine vraie alerte.
Que doit contenir le message ?
Trois choses : le nom du donneur ou du rival, les deux comptes et un lien vers le fichier sauvegardé. Lorsqu'un score est joint, ajoutez le meilleur Domain Rating parmi les nouvelles lignes, car un domaine fort change la priorité plus que dix domaines faibles.
Qui reçoit l'avis d'échec ?
Quelqu'un qui peut réparer le job, pas seulement quelqu'un qui lit les messages. Un 401 nécessite une nouvelle clé, et un 402 nécessite un rechargement depuis la page du compte. Aucun n'est résolu en attendant le lundi suivant.
L'étendre
Remplacez refdomains par backlinks lorsque l'alerte nécessite l'URL du donneur et l'ancre. Gardez à l'esprit le même coût de deux crédits.
Ajoutez bulk_dr pour scorer chaque nouveau domaine, à un crédit par appel de jusqu'à 2 000 domaines. Ensuite, votre message peut dire "3 nouveaux, meilleur DR 72" au lieu d'une liste nue.
Pour Google Sheets, la même chaîne de requête fonctionne dans Apps Script avec UrlFetchApp. Et pour les rivaux, utilisez les seuils de alertes backlinks concurrents.