Ricetta

Trova backlink in Python: una lista di prospect in quaranta righe

Trova domini che linkano ai tuoi competitor ma non a te, valutali in una sola chiamata e ordina il CSV. Di seguito un esempio pratico con numeri ipotetici.

Banco da lavoro con strumenti di bozza e un filo rosso che collega punti su carta

La logica prima del codice

Tre chiamate risolvono il lavoro. intersect prende da due a dieci domini e restituisce chi linka a più di uno di essi. refdomains sul tuo sito dà l'insieme da sottrarre. bulk_dr valuta poi ciò che rimane.

Il costo per esecuzione è minimo e l'aritmetica vale la pena di essere fatta una volta. Due crediti per l'intersect, due per la tua lista, uno per la valutazione di fino a 2.000 domini. Cinque crediti equivalgono a $0.0005.

L'ordine conta. Sottrai prima di valutare.

Spesso si valutano tutti i domini prima di filtrare. È sbagliato. Valutare costa poco, ma fa perdere molto tempo quando il CSV ha cinquantamila righe. Riduci la lista per sovrapposizione prima di chiedere il DR ai sopravvissuti e mantieni tutto in un dict semplice così che una seconda esecuzione possa riutilizzare il risultato di ieri.

prospects.py

I domini in RIVALS sono segnaposto. I nomi dei campi vengono letti con .get, quindi controlla una riga grezza della tua esecuzione prima di affidarti a una colonna.

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')

Esempio pratico, numeri ipotetici

Esecuzione inventata per un piccolo blog di nicchia; la tua sarà diversa
FaseRighe in uscitaCrediti
intersect di 3 rivali640 domini2
Meno i domini che linkano al tuo sito410 rimasti2
bulk_dr sui 410410 valutati1
Mantieni DR 20 e superiorecirca 1200
Verifica manuale delle prime 3030 pagine aperte0

Dal CSV all'outreach, senza spammare nessuno

01

Ordina per sovrapposizione

I domini che linkano a due o tre dei tuoi rivali sono quelli con una ragione tematica per linkare a te. Mettili per primi.

02

Apri trenta pagine a mano

Guarda la pagina che linka al rival. È una lista di risorse, una recensione, un articolo di news? Solo alcune di queste accettano una nuova voce.

03

Scrivi una riga di motivazione

Dì cosa aggiunge la tua pagina rispetto a quella del rival. Se non riesci a dirlo in una frase, salta quel sito.

04

Registra cosa hai inviato

Aggiungi colonne per data, contatto e risultato allo stesso CSV e commit. Il prossimo mese ti ringrazierai.

Errori e correzioni

Gli script di prospecting falliscono negli stessi pochi punti
ErrorePerché fa maleCorrezione
Ordinamento solo per DRGrandi directory e scraper salgono in cimaOrdina prima per conteggio sovrapposizione, poi per DR
Inviare email a tutto sopra una sogliaSembra spam, costa credibilitàApri manualmente le prime 30
Codifica URL a manoVirgole e slash rompono la queryUsa urllib.parse.urlencode
Invio di 3.000 domini in una chiamataSopra il limite di 2.000Dividi la lista, un credito per chunk
Fidarsi del DR come qualitàÈ un conteggio su scala logaritmica dei domini che linkanoUsalo come chiave di ordinamento, non come verdetto
Due piccoli cespugli e un grande albero di quercia che condividono la luce del sole in un giardino

Scegliere rivali che condividono il tuo lettore

I rivali decidono cosa restituisce l'intersect. Un backlinks finder è buono quanto la lista che gli fornisci. Tre competitor diretti per lo stesso lettore danno una sovrapposizione pulita, mentre un editore enorme che si posiziona per tutto ti dà migliaia di link che non dicono nulla sulla tua pagina.

Immagina di gestire un piccolo blog sulla riparazione delle bici. I tuoi rivali potrebbero essere due blog di riparazione e uno shop con una forte sezione guide. È un buon set. Aggiungi un giornale nazionale e la lista si riempirà di pagine che non linkerebbero mai a un blog di bici.

Da due a dieci domini è il range che l'endpoint accetta, quindi scegli l'insieme al suo interno. Tieni la lista abbastanza corta da poter nominare ogni rival a memoria. Liste brevi sono più facili da difendere.

Perché i grandi hub inquinano l'insieme

Directory e aggregatori linkano a quasi tutto. Appaiono in ogni intersect e seppelliscono il manipolo di domini che linkano per reale interesse. Leggi l'inizio della lista ordinata prima di fidarti.

Un semplice file di esclusione risolve la maggior parte di questi problemi. Tieni i domini che non vuoi mai in un file di testo, uno per riga. Caricalo in un set e rimuovi le corrispondenze prima della chiamata di valutazione, così i crediti vanno solo ai candidati degni di lettura.

Mantenere separati rivali e il tuo sito

Il tuo dominio non dovrebbe mai essere un rival. Sembra ovvio, ma una lista copiata da un vecchio progetto spesso la include, e poi l'intersect riporta i tuoi link a te stesso.

Metti i rival in un dict di configurazione all'inizio dello script, con un commento sul motivo per cui ciascuno è lì. Il mese prossimo ricorderai il motivo, e anche uno straniero che legge il repo.

Leggere le righe grezze prima di filtrare

Il codice legge ogni campo con .get, che impedisce a una chiave mancante di far crashare l'esecuzione. Nasconde anche una chiave errata. Stampa una riga dall'intersect prima di scrivere qualsiasi filtro e guarda i nomi dei campi e il tipo di ogni valore.

Un punteggio che arriva come testo viene ordinato come testo, quindi 9 finisce dopo 80. Convertilo in numero una volta, subito dopo la chiamata, e il resto dello script può rimanere semplice.

Normalizza i domini prima di confrontare

Lo stesso sito può apparire con il prefisso www. in una lista e senza nell'altra. Metti tutto in minuscolo e rimuovi il prefisso prima di confrontare gli insiemi. Altrimenti il tuo sito potrebbe sembrare un nuovo candidato.

Slash finali e spazi casuali da una lista incollata causano lo stesso problema. Una funzione di pulizia di una riga costa meno di una chiamata di valutazione sprecata.

Tieni una copia datata di ogni esecuzione

Scrivi ogni esecuzione in un file datato e mantieni quello precedente. Puoi così distinguere i nuovi candidati da quelli che hai già visto e vedere quando un rival ha iniziato a linkare da qualche parte di nuovo.

I file datati sono anche il modo più semplice per fare debug di un risultato strano. Apri i due file fianco a fianco e il cambiamento è solitamente ovvio.

Valuta solo ciò che sopravvive

La chiamata bulk accetta fino a 2.000 domini con un credito. Passale i sopravvissuti della sottrazione, mai l'intersect completo. Nell'esempio inventato sopra, 640 righe e 410 righe costano lo stesso da valutare in una chiamata, ma la lista più piccola è molto più facile da leggere.

Bilancia in pietra con un peso in ottone e una roccia grezza in piatti separati

Domande prima di eseguire il finder

La maggior parte delle domande che le persone portano a questa parte del lavoro si riduce a costo, ordinamento e cosa succede quando una chiamata fallisce.

Una lista di prospect costa molto da costruire?

Non molto. La ricetta usa intersect, refdomains e bulk_dr, quindi cinque crediti per esecuzione alla dimensione mostrata, che è $0.0005. Una riesecuzione il mese prossimo costa lo stesso. Il tuo tempo, speso a leggere le pagine, è il vero costo.

Perché non ordinare l'intersect per DR e fermarsi lì?

DR conta i domini che linkano su scala logaritmica. Grandi directory salgono in cima indipendentemente dalla loro rilevanza, quindi ordina prima per sovrapposizione e usa DR come spareggio, non come chiave principale.

Posso inviare outreach a tutto nel CSV?

Puoi, ma è un cattivo uso della lista. Apri la pagina che linka al rival, decidi se una nuova voce si adatta, e solo allora scrivi. Il CSV è una shortlist, non una mailing list.

Con quanti rivali dovrei iniziare?

Tre è un buon inizio, dentro il range da due a dieci che l'intersect accetta. Aggiungi di più solo quando la prima esecuzione restituisce troppe poche righe da classificare.

E se il mio dominio non ha ancora domini che linkano?

Allora la sottrazione non rimuove nulla, e ogni riga dell'intersect diventa un candidato. È corretto, ma la lista sarà lunga. Riducila per sovrapposizione e leggi manualmente le prime trenta.

Lo script ha bisogno di una chiave a pagamento?

Sì. Le chiamate intersect, refdomains e bulk_dr sono fatturate a credito. L'azione di panoramica gratuita non richiede una chiave, e il credito di iscrizione da $100 copre molte esecuzioni di questa dimensione.

Prima che parta un singolo messaggio

  • Apri la pagina candidata e conferma che linka al rival, non solo a una lista di link.
  • Verifica che la pagina si adatti al tuo lettore, non solo alla tua keyword.
  • Rimuovi qualsiasi dominio che hai già contattato e registra la data accanto.
  • Scrivi una frase su cosa aggiunge la tua pagina, o scarta il candidato.
  • Invia in piccoli lotti, così le risposte possono essere effettivamente lette.

Eseguire il finder in pianificazione

Le liste di prospect invecchiano più lentamente di quanto la maggior parte delle persone si aspetti. Mensile è sufficiente. Nuovi link da un rival appaiono con l'aggiornamento mensile, quindi un'esecuzione ogni poche settimane cattura la maggior parte di essi. Esecuzioni settimanali riproducono principalmente il file della settimana scorsa, motivo per cui lo stesso backlinks finder può essere eseguito in background senza molto rumore.

Il ritmo sensato è mensile per la valutazione e una rapida occhiata alle prime righe dopo ogni esecuzione. Mantieni il passo di sottrazione nella stessa job, così la lista non include mai ciò che hai già.

Tieni la chiave fuori dal file

Lo script legge la chiave dall'ambiente, quindi non sta mai nel repo. Imposta LZ_KEY come segreto nel tuo scheduler, o esportalo da un file che resta fuori da git.

Una riga crontab può chiamare lo stesso script con la variabile impostata davanti. Verifica che il file che contiene la chiave abbia permessi stretti sul server.

Fallisci prima di scrivere il CSV

Un 401 o un 402 dovrebbero fermare l'esecuzione, così come un flag ok che risulta falso. Il codice solleva un'eccezione prima che il file venga aperto, così un'esecuzione fallita non sovrascrive mai il CSV di ieri con uno parziale.

Registra la spesa con ogni esecuzione

Ogni risposta porta _credits, quindi stampa il saldo alla fine del job. Nel corso di alcuni mesi quella riga ti dice se una pianificazione costa quanto previsto e se un loop ha iniziato a rifetchare le pagine.

Abbinale al SQLite diff se vuoi la cronologia in un database invece che in una cartella di file.

Una parola su cosa DR può e non può dire

DR qui è round(100 volte log(ref_domains + 1) diviso log(20.000.000, 2)). Sale con i domini che linkano e nient'altro. Tienilo a mente. Un sito può stare a 55 e comunque essere inutile per te.

Usalo per classificare, poi leggi. Guarda cosa pubblica il sito, se linka a cento negozi non correlati e se qualcosa è cambiato di recente. Questi controlli richiedono un minuto per sito e nessun script li sostituisce.

Una volta che la lista è pulita, mantienila come file datato e riesegui tra un mese. Il manuale Actions mostra come pianificarlo, e il confronto n8n copre la route no-code se la tua persona per l'outreach la preferisce.

Note su tasso e dimensione

Ogni chiamata restituisce fino a 1.000 righe ed è fatturata una volta, quindi navigare attraverso 5.000 righe di intersect costa 10 crediti, o $0.001. La paginazione profonda si ferma a 50.000 righe. Usa sort e order=desc sul server invece di ordinare una lista enorme in Python dopo.