Rețetă

Găsitor de backlinks în Python: o listă de prospecte în patruzeci de linii

Găsește domenii care linkuiesc către rivalii tăi, dar nu către tine, evaluează-le într-un singur apel și sortează CSV-ul. Mai jos găsești un exemplu detaliat cu numere ipotetice.

Banc de atelier cu instrumente de schițare și un fir roșu care leagă puncte pe hârtie

Logica înainte de cod

Trei apeluri rezolvă problema. intersect primește între două și zece domenii și returnează care linkuiesc către mai multe dintre ele. refdomains pe site-ul tău oferă mulțimea de scăzut. bulk_dr evaluează apoi ce rămâne.

Costul per execuție este infim, iar calculul merită făcut o dată. Două credite pentru intersect, două pentru propria listă, unul pentru evaluarea a până la 2.000 de domenii. Cinci credite înseamnă $0.0005.

Ordinea contează. Scade înainte de a evalua.

Oamenii evaluează adesea totul mai întâi și filtrează mai târziu. Asta e invers. Evaluarea costă puțin, dar pierde mult timp când CSV-ul are cincizeci de mii de rânduri. Redu lista prin suprapunere mai întâi, cere DR pentru supraviețuitori și păstrează totul într-un dict simplu, astfel încât o a doua execuție să poată reutiliza rezultatul de ieri.

prospects.py

Domeniile din RIVALS sunt placeholder-uri. Numele câmpurilor sunt citite cu .get, așa că verifică un rând brut din propria execuție înainte să te bazezi pe o coloană.

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

Exemplu detaliat, numere ipotetice

Execuție inventată pentru un blog de nișă mic; a ta va fi diferită
PasRânduri rezultateCredite
intersect a 3 rivali640 domenii2
Minus domeniile care linkuiesc către tine410 rămase2
bulk_dr pe cele 410410 evaluate1
Păstrează DR 20 și pesteaproximativ 1200
Verificare manuală a primelor 3030 pagini deschise0

De la CSV la outreach, fără a trimite spam

01

Sortează după suprapunere

Domeniile care linkuiesc către doi sau trei dintre rivalii tăi sunt cele care au un motiv tematic să linkuiască către tine. Pune-le pe primul loc.

02

Deschide treizeci manual

Uită-te la pagina care linkuiește către rival. Este o listă de resurse, un review, o știre? Doar unele dintre acestea acceptă o nouă intrare.

03

Scrie un rând de motivare

Spune ce aduce pagina ta pe care pagina rivalului nu îl are. Dacă nu poți spune asta într-o propoziție, ocolește acel site.

04

Loghează ce ai trimis

Adaugă coloane pentru dată, contact și rezultat în același CSV și commit-uie-l. În trimestrul viitor, îți vei mulțumi.

Erori și remedieri

Scripturile de prospectare greșesc în aceleași câteva locuri
EroareDe ce afecteazăRemediere
Sortarea doar după DRDirectoarele mari și scraperele apar în vârfSortează mai întâi după numărul de suprapuneri, DR pe al doilea loc
Trimiterea către toate deasupra unui pragSună a spam, costă capitalul de încredereDeschide primele 30 manual
Codificare URL manualăVirgulele și slash-urile strică interogareaFolosește urllib.parse.urlencode
Trimiterea a 3.000 de domenii într-un singur apelPeste limita de 2.000Împarte lista în chunk-uri, un credit per chunk
Încrederea în DR ca indicator de calitateEste un număr de domenii care linkuiesc pe o scară logaritmicăTratează-l ca o cheie de sortare, nu ca un verdict
Două arbuști mici și un stejar mare care împart soarele într-o grădină

Alegerea rivalilor care împărtășesc cititorul tău

Rivalii decid ce returnează intersectarea. Un găsitor de backlinks este la fel de bun cât lista pe care i-o dai. Trei competitori direcți pentru același cititor oferă o suprapunere curată, în timp ce un editor mare care se clasează pentru aproape orice îți oferă mii de linkuri care nu spun nimic despre pagina ta.

Să zicem că ai un blog mic despre reparația bicicletelor. Rivalii tăi ar putea fi două bloguri de reparații și un magazin cu o secțiune de ghiduri puternică. Aceasta este o mulțime bună. Adaugă un outlet național și lista se umple de pagini care nu ar linkui niciodată către un blog de biciclete.

Între două și zece domenii este fereastra pe care o acceptă endpoint-ul, așa că alege setul din interiorul lui. Păstrează lista suficient de scurtă încât să poți numi fiecare rival din memorie. Listele scurte sunt mai ușor de justificat.

De ce hub-urile uriașe poluează setul

Directoarele și agregatoarele linkuiesc către aproape totul. Apar în fiecare intersectare și îngroapă mânănuia de domenii care linkuiesc din interes real. Citește vârful listei sortate înainte să ai încredere în ea.

Un fișier simplu de excludere rezolvă majoritatea acestor probleme. Păstrează domeniile pe care nu vrei niciodată să le ai într-un fișier text, câte unul pe linie. Încarcă-l într-un set și elimină potrivirile înainte de apelul de evaluare, astfel încât creditele să meargă doar către candidați care merită citiți.

Menținerea rivalilor și a site-ului tău separate

Domeniul tău nu ar trebui niciodată să fie un rival. Sună evident, dar o listă copiată dintr-un proiect vechi o include adesea, iar apoi intersectarea raportează linkurile tale către tine.

Pune rivalii într-un dict de configurare în partea de sus a scriptului, cu un comentariu despre de ce este fiecare acolo. Luna viitoare îți vei aminti motivul, la fel și un străin care citește repo-ul.

Citirea rândurilor brute înainte de filtrare

Codul citește fiecare câmp cu .get, ceea ce împiedică o cheie lipsă să strice execuția. Ascunde și o cheie greșită. Afișează un rând din intersect înainte să scrii orice filtru și uită-te la numele câmpurilor și la tipul fiecărei valori.

Un scor care ajunge ca text se sortează ca text, așa că 9 ajunge după 80. Convertesc-l la număr o dată, chiar după apel, iar restul scriptului poate rămâne simplu.

Normalizarea domeniilor înainte de comparare

Același site poate apărea cu prefixul www. într-o listă și fără el în alta. Lowercasează totul și elimină prefixul înainte să compari mulțimile. Altfel, site-ul tău poate părea un candidat nou.

Slash-urile de la final și spațiile pierdute dintr-o listă lipită cauzează aceeași problemă. O funcție de curățare pe o linie costă mai puțin decât un singur apel de evaluare risipit.

Păstrează o copie datată a fiecărei execuții

Scrie fiecare execuție într-un fișier datat și păstrează-l pe cel anterior. Astfel poți distinge noii candidați de cei pe care i-ai văzut deja și poți vedea când un rival a început să linkuiască undeva nou.

Fișierele datate sunt, de asemenea, cel mai simplu mod de a depana un rezultat ciudat. Deschide cele două fișere unul lângă celălalt și schimbarea este de obicei evidentă.

Evaluează doar ce supraviețuiește

Apelul bulk primește până la 2.000 de domenii la un credit. Transmite-i supraviețuitorii scăderii, nu intersectarea completă. În exemplul inventat de mai sus, 640 de rânduri și 410 de rânduri costă la fel să fie evaluate într-un singur apel, dar lista mai mică este mult mai ușor de citit.

Cântar de piatră cu o greutate de alamă și o piatră brută în tăvi separate

Întrebări înainte să rulezi găsitorul

Majoritatea întrebărilor pe care le aduc oamenii la această parte a jobului se rezumă la cost, sortare și ce se întâmplă când un apel eșuează.

O listă de prospecte costă mult să fie construită?

Nu prea. Rețeta folosește intersect, refdomains și bulk_dr, deci cinci credite per execuție la dimensiunea afișată, adică $0.0005. O reluare luna viitoare costă la fel. Timpul tău, petrecut citind pagini, este costul real.

De ce nu sortez intersectarea după DR și mă opresc acolo?

DR numără domeniile care linkuiesc pe o scară logaritmică. Directoarele mari apar în vârf indiferent de relevanța lor, așa că sortează mai întâi după suprapunere și folosește DR ca separator de egalitate, nu ca cheie principală.

Pot trimite outreach către totul din CSV?

Poți, dar este o utilizare prostă a listei. Deschide pagina care linkuiește către rival, decide dacă o nouă intrare se potrivește și abia apoi scrie. CSV-ul este o listă scurtă, nu o listă de corespondență.

Cu câți rivali ar trebui să încep?

Trei este un bun început, în intervalul de două până la zece pe care îl acceptă intersectarea. Adaugă mai mult doar dacă prima execuție returnează prea puține rânduri pentru a fi clasate.

Ce se întâmplă dacă domeniul meu nu are încă domenii care linkuiesc?

Atunci scăderea nu elimină nimic, iar fiecare rând din intersect devine un candidat. Acesta este corect, dar lista va fi lungă. Redu-o prin suprapunere și citește primele treizeci manual.

Scriptul are nevoie de o cheie plătită?

Da. Apelurile intersect, refdomains și bulk_dr sunt prețuite pe credit. Acțiunea gratuită de prezentare generală nu are nevoie de cheie, iar creditul de înregistrare de $100 acoperă multe execuții de această dimensiune.

Înainte să iasă un singur mesaj

  • Deschide pagina candidatului și confirmă că linkuiește către rival, nu doar către o listă de linkuri.
  • Verifică dacă pagina se potrivește cititorului tău, nu doar cuvântului cheie.
  • Elimină orice domeniu la care ai contactat deja și loghează data lângă el.
  • Scrie o propoziție despre ce aduce pagina ta sau elimină candidatul.
  • Trimite în loturi mici, astfel încât răspunsurile să poată fi citite cu adevărat.

Rularea găsitorului pe un program

Listele de prospecte devin proaste mai lent decât se așteaptă majoritatea oamenilor. Lunar este suficient. Linkurile noi de la un rival apar cu reîmprospătarea lunară, astfel încât o execuție la fiecare câteva săptămâni prinde majoritatea lor. Execuțiile săptămânale reproduc în mare parte fișierul din săptămâna trecută, de aceea același găsitor de backlinks poate rula neîngrijit fără mult zgomot.

Ritmul sensibil este lunar pentru evaluare și o privire rapidă la rândurile de sus după fiecare execuție. Păstrează pasul de scădere în aceeași job, astfel încât lista să nu includă niciodată ceea ce ai deja.

Păstrează cheia în afara fișierului

Scriptul citește cheia din mediu, astfel încât să nu stea în repo. Setează LZ_KEY ca secret în scheduler-ul tău sau exportă-l dintr-un fișier care rămâne în afara gitului.

O linie crontab poate apela același script cu variabila setată în fața lui. Verifică dacă fișierul care deține cheia are permisiuni stricte pe server.

Eșuează înainte de a scrie CSV-ul

Un 401 sau un 402 ar trebui să oprească execuția, la fel și un flag ok care citește fals. Codul ridică o excepție înainte ca fișierul să fie deschis, astfel încât o execuție eșuată nu va suprascrie niciodată CSV-ul de ieri cu unul parțial.

Loghează cheltuiala cu fiecare execuție

Fiecare răspuns conține _credits, așa că afișează soldul la finalul jobului. În câteva luni, acea linie îți va spune dacă un program costă cât ai planificat și dacă un loop a început să refacă pagini.

Asociază-l cu SQLite diff dacă vrei istoricul într-o bază de date în loc de un folder de fișiere.

Un cuvânt despre ce poate și nu poate spune DR

DR aici este round(100 times log(ref_domains + 1) over log(20,000,000)). Crește odată cu domeniile care linkuiesc și nimic altceva. Ține asta în minte. Un site poate sta la 55 și totuși să fie inutil pentru tine.

Folosește-l pentru a clasifica, apoi citește. Uită-te la ce publică site-ul, dacă linkuiește către o sută de magazine neînrudite și dacă ceva de pe el s-a schimbat recent. Acele verificări durează un minut pe site și niciun script nu le înlocuiește.

Odată ce lista este curată, păstreaz-o ca fișier datat și reia execuția peste o lună. Manualul de execuție Actions arată cum să îl programezi, iar comparația n8n acoperă ruta fără cod dacă persoana ta de outreach o preferă.

Note despre rată și dimensiune

Fiecare apel returnează până la 1.000 de rânduri și este facturat o dată, astfel încât paginare prin 5.000 de rânduri intersect costă 10 credite, adică $0.001. Paginarea profundă se oprește la 50.000 de rânduri. Folosește sort și order=desc pe server în loc să sortezi o listă uriașă în Python mai târziu.