Recette

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.

Workshop bench with drafting tools and a red thread connecting points on paper

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
ÉtapeLignes obtenuesCrédits
intersection de 3 concurrents640 domaines2
Moins vos propres domaines référents410 restants2
bulk_dr sur les 410410 évalués1
Conserver un DR de 20 et plusenviron 1200
Vérifier manuellement les 30 premiers30 pages ouvertes0

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
ErreurPourquoi cela nuitCorrection
Trier uniquement par DRLes gros répertoires et les scrapers remontent en têteTriez d'abord par le nombre de chevauchements, puis par le DR
Envoyer à tous ceux qui dépassent un seuilRessemble à du spam, coûte en crédibilitéOuvrir manuellement les 30 premiers
Encodage URL à la mainLes virgules et les slashes cassent la requêteUtilisez urllib.parse.urlencode
Envoi de 3 000 domaines en un seul appelAu-delà de la limite de 2 000Dé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érentsTraitez-le comme une clé de tri, et non comme un verdict
Two small shrubs and one large oak tree sharing sunlight in a garden

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.

Stone weighing scale with a brass weight and a rough rock in separate pans

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.