Trouveur de backlinks en Python : une liste de prospects en quarante lignes
Trouvez les domaines qui lient vers vos concurrents mais pas vers vous, évaluez-les en un seul appel, et triez le CSV. Un exemple détaillé avec des chiffres hypothétiques est ci-dessous.
Équipe éditoriale Linkzoid ·
La logique avant le code
Trois appels suffisent. intersect prend deux à dix domaines et renvoie ceux qui lient vers plusieurs d’entre eux. refdomains sur votre propre site fournit l’ensemble à soustraire. bulk_dr évalue ensuite ce qui reste.
Le coût par exécution est minime, et le calcul vaut la peine d’être fait une fois. Deux crédits pour l’intersect, deux pour votre propre liste, un pour l’évaluation de jusqu’à 2 000 domaines. Cinq crédits équivalent à $0.0005.
L’ordre compte. Soustrayez avant d’évaluer.
Les gens évaluent souvent tout d’abord et filtrent ensuite. C’est l’inverse de ce qu’il faut faire. L’évaluation coûte peu, mais elle prend beaucoup de temps lorsque le CSV contient cinquante mille lignes. Réduisez d’abord la liste par recouvrement, demandez le DR aux survivants, et conservez le tout dans un dictionnaire simple afin qu’une seconde exécution puisse réutiliser le résultat d’hier.
prospects.py
Les domaines dans RIVALS sont des espaces réservés. Les noms de champs sont lus avec .get, donc vérifiez une ligne brute issue de votre propre exécution avant de vous fier à une colonne.
python
import csv, json, os, urllib.request as u, urllib.parse as p
KEY = os.environ['LZ_KEY']
ME = 'mysite.example'
RIVALS = ['rival-a.example', 'rival-b.example', 'rival-c.example']
def get(**kw):
q = p.urlencode(kw)
with u.urlopen(f'https://linkzoid.pro/api.php?{q}&key={KEY}', timeout=30) as r:
d = json.load(r)
if not d['ok']:
raise SystemExit(d)
return d
gap = get(action='intersect', q=','.join(RIVALS), per=1000)['rows']
mine = {r.get('domain') for r in get(action='refdomains', q=ME, per=1000)['rows']}
fresh = [r.get('domain') for r in gap if r.get('domain') not in mine]
scores = get(action='bulk_dr', domains=','.join(fresh[:2000]))['rows']
with open('prospects.csv', 'w', newline='') as f:
wr = csv.writer(f)
for row in scores:
wr.writerow([row.get('domain'), row.get('dr')])
print(len(fresh), 'candidates')
Exemple concret, chiffres hypothétiques
Exemple inventé pour un petit blog de niche ; le vôtre sera différent
Étape
Lignes obtenues
Crédits
intersection de 3 concurrents
640 domaines
2
Moins vos propres domaines référents
410 restants
2
bulk_dr sur les 410
410 évalués
1
Conserver un DR de 20 et plus
environ 120
0
Vérifier manuellement les 30 premiers
30 pages ouvertes
0
Du CSV à la prospection, sans spammer personne
01
Trier par chevauchement
Les domaines qui lient vers deux ou trois de vos concurrents sont ceux qui ont une raison thématique de vous lier. Mettez-les en premier.
02
Ouvrir trente à la main
Consultez la page qui fait le lien vers le concurrent. S'agit-il d'une liste de ressources, d'un article de revue, d'une actualité ? Seuls certains de ces supports acceptent une nouvelle entrée.
03
Rédigez une ligne de justification
Expliquez ce que votre page apporte que celle du concurrent n'a pas. Si vous ne pouvez pas le dire en une phrase, passez à un autre site.
04
Enregistrez ce que vous avez envoyé
Ajoutez des colonnes pour la date, le contact et le résultat au même CSV, et validez-le. Vous vous en remercierez le trimestre prochain.
Erreurs et corrections
Les scripts de prospection font souvent les mêmes erreurs
Erreur
Pourquoi cela nuit
Correction
Trier uniquement par DR
Les gros répertoires et les scrapers remontent en tête
Triez d'abord par le nombre de chevauchements, puis par le DR
Envoyer à tous ceux qui dépassent un seuil
Ressemble à du spam, coûte en crédibilité
Ouvrir manuellement les 30 premiers
Encodage URL à la main
Les virgules et les slashes cassent la requête
Utilisez urllib.parse.urlencode
Envoi de 3 000 domaines en un seul appel
Au-delà de la limite de 2 000
Découpez la liste, un crédit par lot
Faire confiance au DR comme indicateur de qualité
Il s'agit d'un compte logarithmique de domaines référents
Traitez-le comme une clé de tri, et non comme un verdict
Choisir des concurrents qui partagent votre audience
Les concurrents déterminent le résultat de l'intersection. Un outil de recherche de backlinks n'est aussi performant que la liste que vous lui fournissez. Trois concurrents directs ciblant la même audience offrent un chevauchement clair, tandis qu'un grand média qui se positionne pour tout type de requête vous renverra des milliers de liens sans pertinence pour votre page.
Imaginons que vous gériez un petit blog sur la réparation de vélos. Vos concurrents pourraient être deux blogs de réparation et un magasin avec une section guides bien développée. C'est un bon ensemble. Ajoutez un média national et la liste se remplira de pages qui ne feraient jamais de lien vers un blog vélo.
La borne de l'endpoint accepte de deux à dix domaines, donc choisissez un ensemble qui s'insère dans cette fourchette. Gardez la liste assez courte pour pouvoir citer chaque concurrent par mémoire. Les listes courtes sont plus faciles à justifier.
Pourquoi les hubs géaux polluent l'ensemble
Les annuaires et les agrégateurs font des liens vers presque tout. Ils apparaissent dans chaque intersection et enfouissent les rares domaines qui font des liens par intérêt réel. Lisez le début de la liste triée avant de lui faire confiance.
Un fichier d'exclusion simple règle la plupart de ces problèmes. Garrez les domaines que vous ne voulez jamais voir dans un fichier texte, un par ligne. Chargez-le dans un ensemble et retirez les correspondances avant l'appel de scoring, afin que les crédits ne soient dépensés que pour des candidats dignes d'intérêt.
Séparer les concurrents de votre propre site
Votre propre domaine ne devrait jamais être un concurrent. Cela semble évident, mais une liste copiée depuis un ancien projet l'inclut souvent, et l'intersection vous renvoie alors vos propres liens.
Placez les concurrents dans un dictionnaire de configuration en haut du script, avec un commentaire expliquant pourquoi chaque domaine est présent. Le mois prochain, vous vous souviendrez de la raison, et un étranger qui lit le dépôt aussi.
Lire les lignes brutes avant de filtrer
Le code lit chaque champ avec .get, ce qui évite qu'une clé manquante ne fasse planter l'exécution. Cela masque aussi une clé erronée. Imprimez une ligne de l'intersection avant d'écrire tout filtre, et examinez les noms de champs et le type de chaque valeur.
Un score arrivé sous forme de texte s'ordonne comme du texte, donc 9 se place après 80. Convertissez-le en nombre une fois, juste après l'appel, et le reste du script peut rester simple.
Normaliser les domaines avant la comparaison
Un même site peut apparaître avec un préfixe www. dans une liste et sans lui dans une autre. Mettez tout en minuscules et supprimez le préfixe avant de comparer les ensembles. Sinon, votre propre site peut apparaître comme un nouveau candidat.
Les barres de fin et les espaces parasites d'une liste collée causent le même problème. Une fonction de nettoyage en une ligne coûte moins cher qu'un appel de scoring gaspillé.
Conserver une copie datée de chaque exécution
Écrivez chaque exécution dans un fichier daté, et conservez le précédent. Vous pouvez ainsi distinguer les nouveaux candidats de ceux que vous avez déjà vus, et voir quand un concurrent a commencé à faire des liens ailleurs.
Les fichiers datés sont aussi le moyen le plus simple de déboguer un résultat étrange. Ouvrez les deux fichiers côte à côte et le changement est généralement évident.
Scorer uniquement ce qui survit
L'appel groupé prend jusqu'à 2 000 domaines pour un crédit. Passez-lui les survivants de la soustraction, jamais l'intersection complète. Dans l'exemple inventé ci-dessus, 640 lignes et 410 lignes coûtent le même prix à scorer en un appel, mais la liste plus petite est bien plus facile à lire.
Questions avant de lancer le finder
La plupart des questions que les gens apportent à cette partie du travail se résument au coût, au tri et à ce qui se passe lorsqu'un appel échoue.
Une liste de prospects coûte-t-elle cher à construire ?
Pas vraiment. La recette utilise intersect, refdomains et bulk_dr, soit cinq crédits par exécution à la taille indiquée, ce qui représente 0,0005 $. Une nouvelle exécution le mois prochain coûtera autant. Votre temps, passé à lire les pages, est le vrai coût.
Pourquoi ne pas trier l'intersection par DR et s'arrêter là ?
Le DR compte les domaines référençant sur une échelle logarithmique. Les grands annuaires remontent en haut quelle que soit leur pertinence, donc triez d'abord par chevauchement et utilisez le DR comme départage, et non comme clé principale.
Puis-je envoyer une prospection à tout ce qui est dans le CSV ?
Vous le pouvez, mais c'est une mauvaise utilisation de la liste. Ouvrez la page qui fait lien vers le concurrent, décidez si une nouvelle entrée est pertinente, et seulement ensuite rédigez. Le CSV est une shortlist, pas une liste de diffusion.
Combien de concurrents devrais-je commencer par ?
Trois est un bon départ, dans la fourchette de deux à dix que l'intersection accepte. Ajoutez-en plus seulement si la première exécution retourne trop peu de lignes pour les classer.
Que faire si mon propre domaine n'a encore aucun domaine référençant ?
Alors la soustraction ne retire rien, et chaque ligne de l'intersection devient un candidat. C'est correct, mais la liste sera longue. Réduisez-la par le chevauchement et lisez les trente premières à la main.
Le script a-t-il besoin d'une clé payante ?
Oui. Les appels intersect, refdomains et bulk_dr sont facturés au crédit. L'action de vue gratuite ne nécessite pas de clé, et le crédit de 100 $ de l'inscription couvre de nombreuses exécutions de cette taille.
Avant qu'un seul message ne parte
Ouvrez la page candidate et confirmez qu'elle fait lien vers le concurrent, et non simplement vers une liste de liens.
Vérifiez que la page convient à votre audience, et pas seulement à votre mot-clé.
Supprimez tout domaine que vous avez déjà contacté, et notez la date à côté.
Rédigez une phrase sur ce que votre page apporte, ou supprimez le candidat.
Envoyez par petits lots, afin que les réponses puissent effectivement être lues.
Exécuter le finder sur un calendrier
Les listes de prospects se défraîchissent plus lentement que la plupart des gens ne le pensent. Mensuel est largement suffisant. Les nouveaux liens d'un concurrent apparaissent avec l'actualisation mensuelle, donc une exécution toutes les quelques semaines en capture la plupart. Les exécutions hebdomadaires reproduisent surtout le fichier de la semaine dernière, c'est pourquoi le même outil de backlinks peut tourner sans surveillance sans générer beaucoup de bruit.
Le rythme raisonnable est mensuel pour le scoring et un rapide coup d'œil aux premières lignes après chaque exécution. Gardez l'étape de soustraction dans le même job, afin que la liste n'inclue jamais ce que vous avez déjà.
Garder la clé hors du fichier
Le script lit la clé depuis l'environnement, donc elle ne se trouve jamais dans le dépôt. Définissez LZ_KEY comme secret dans votre planificateur, ou exportez-le depuis un fichier qui reste hors de git.
Une ligne de crontab peut appeler le même script avec la variable définie devant. Vérifiez que le fichier contenant la clé a des permissions strictes sur le serveur.
Échouer avant d'écrire le CSV
Un 401 ou un 402 doit arrêter l'exécution, ainsi qu'un indicateur ok qui lit false. Le code lève une exception avant l'ouverture du fichier, donc une exécution échouée n'écrira jamais le CSV d'hier avec un fichier partiel.
Journaliser la dépense avec chaque exécution
Chaque réponse contient _credits, donc affichez le solde à la fin du job. Sur quelques mois, cette ligne vous dira si un calendrier coûte ce que vous aviez prévu, et si une boucle a commencé à recharger les pages.
Associez-le au SQLite diff si vous voulez l'historique dans une base de données au lieu d'un dossier de fichiers.
Un mot sur ce que le DR peut et ne peut pas dire
Le DR ici est round(100 fois log(ref_domains + 1) sur log(20 000 000)). Il augmente avec les domaines référençant et rien d'autre. Gardez cela en tête. Un site peut être à 55 et rester inutile pour vous.
Utilisez-le pour classer, puis lisez. Regardez ce que le site publie, s'il fait lien vers une centaine de boutiques sans rapport, et si quelque chose a changé dessus récemment. Ces vérifications prennent une minute par site, et aucun script ne les remplace.
Une fois la liste propre, conservez-la dans un fichier daté et relancez dans un mois. Le manuel d'exécution des Actions montre comment le planifier, et la comparaison n8n couvre la route sans code si votre chargé de prospection le préfère.
Notes sur les tarifs et la taille
Chaque appel retourne jusqu'à 1 000 lignes et est facturé une fois, donc parcourir 5 000 lignes d'intersection coûte 10 crédits, soit 0,001 $. La pagination profonde s'arrête à 50 000 lignes. Utilisez sort et order=desc sur le serveur plutôt que de trier une énorme liste en Python après coup.