Backlink-Finder in Python: Eine Prospektliste in vierzig Zeilen
Finden Sie Domains, die Ihre Konkurrenten verlinken, aber nicht Sie, bewerten Sie sie in einem Aufruf und sortieren Sie die CSV. Ein durchgerechnetes Beispiel mit hypothetischen Zahlen finden Sie unten.
Redaktion von Linkzoid ·
Die Logik vor dem Code
Drei Aufrufe erledigen die Arbeit. intersect nimmt zwei bis zehn Domains und gibt zurück, welche mehrere von ihnen verlinken. refdomains für Ihre eigene Seite liefert die Menge, die abgezogen werden soll. bulk_dr bewertet anschließend das, was übrig bleibt.
Die Kosten pro Lauf sind gering, und die Arithmetik lohnt sich einmal durchzudenken. Zwei Credits für den Intersect, zwei für Ihre eigene Liste, einer zum Bewerten von bis zu 2.000 Domains. Fünf Credits entsprechen $0.0005.
Die Reihenfolge ist wichtig. Subtrahieren Sie, bevor Sie bewerten.
Bewerten viele zuerst alles und filtern später. Das ist verkehrt. Das Bewerten kostet wenig, aber es verschwendet viel Zeit, wenn die CSV fünfzigtausend Zeilen hat. Kürzen Sie die Liste zuerst durch Überlappung, fragen Sie DR für die Überlebenden an und halten Sie das Ganze in einem einfachen Dict, damit ein zweiter Lauf das Ergebnis von gestern wiederverwenden kann.
prospects.py
Domains in RIVALS sind Platzhalter. Feldnamen werden mit .get gelesen, also prüfen Sie eine Rohzeile aus Ihrem eigenen Lauf, bevor Sie sich auf eine Spalte verlassen.
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')
Durchgerechnetes Beispiel, hypothetische Zahlen
Erfundener Lauf für einen kleinen Nischen-Blog; Ihr Ergebnis wird abweichen
Schritt
Ausgehende Zeilen
Credits
Intersect von 3 Konkurrenten
640 Domains
2
Minus Ihre eigenen verweisenden Domains
410 übrig
2
bulk_dr für die 410
410 bewertet
1
Behalten Sie DR 20 und höher
ca. 120
0
Top 30 manuell prüfen
30 Seiten geöffnet
0
Von CSV zu Outreach, ohne jemanden zu spammen
01
Nach Überlappung sortieren
Domains, die zwei oder drei Ihrer Konkurrenten verlinken, sind diejenigen mit einem thematischen Grund, zu Ihnen zu verlinken. Setzen Sie sie an die erste Stelle.
02
Dreißig manuell öffnen
Schauen Sie sich die Seite an, die den Konkurrenten verlinkt. Ist es eine Ressourcensammlung, eine Rezension, ein Nachrichtenartikel? Nur einige dieser Seiten akzeptieren einen neuen Eintrag.
03
Eine Zeile Grund schreiben
Sagen Sie, was Ihre Seite beiträgt, die die Seite des Konkurrenten nicht hat. Wenn Sie es nicht in einem Satz sagen können, überspringen Sie diese Seite.
04
Protokollieren, was Sie gesendet haben
Fügen Sie Spalten für Datum, Kontakt und Ergebnis zur gleichen CSV hinzu und committen Sie sie. Im nächsten Quartal werden Sie sich selbst danken.
Fehler und Korrekturen
Prospecting-Skripte scheitern an denselben wenigen Stellen
Fehler
Warum es weh tut
Korrektur
Nur nach DR sortieren
Große Verzeichnisse und Scraper steigen an die Spitze
Zuerst nach Überlappungszahl sortieren, DR als zweite Sortierkriterium
Alles über einem Schwellenwert per Mail versenden
Klingt nach Spam, kostet Goodwill
Top 30 manuell öffnen
URL-Kodierung manuell
Kommas und Schrägstriche brechen die Abfrage
Verwenden Sie urllib.parse.urlencode
3.000 Domains in einem Aufruf senden
Über dem Limit von 2.000
Liste chunken, ein Credit pro Chunk
DR als Qualität vertrauen
Es ist eine logarithmische Zählung der verweisenden Domains
Als Sortierschlüssel behandeln, nicht als Urteil
Konkurrenten wählen, die denselben Leser teilen
Konkurrenten entscheiden, was der Intersect zurückgibt. Ein Backlink-Finder ist nur so gut wie die Liste, die Sie ihm füttern. Drei direkte Konkurrenten für denselben Leser geben eine saubere Überlappung, während ein riesiger Publisher, der für alles rankt, Ihnen tausende Links liefert, die über Ihre Seite nichts aussagen.
Angenommen, Sie betreiben einen kleinen Blog über Fahrrad-Reparaturen. Ihre Konkurrenten könnten zwei Reparatur-Blogs und ein Shop mit einem starken Leitfaden-Bereich sein. Das ist ein guter Satz. Fügen Sie einen nationalen Sender hinzu, und die Liste füllt sich mit Seiten, die niemals auf einen Fahrrad-Blog verlinken würden.
Zwei bis zehn Domains ist der Bereich, den der Endpunkt akzeptiert, also wählen Sie den Satz innerhalb dieses Bereichs. Halten Sie die Liste kurz genug, dass Sie jeden Konkurrenten aus dem Gedächtnis benennen können. Kurze Listen sind einfacher zu verteidigen.
Warum riesige Hubs die Menge verschmutzen
Verzeichnisse und Aggregatoren verlinken fast auf alles. Sie tauchen in jedem Intersect auf und begraben die wenigen Domains, die aus echtem Interesse heraus verlinken. Lesen Sie die Spitze der sortierten Liste, bevor Sie ihr vertrauen.
Eine einfache Ausschlussdatei behebt die meisten dieser Probleme. Halten Sie die Domains, die Sie niemals wollen, in einer Textdatei, eine pro Zeile. Laden Sie sie in ein Set und entfernen Sie Übereinstimmungen vor dem Bewertungsauftrag, damit Credits nur für Kandidaten ausgegeben werden, die es wert sind, gelesen zu werden.
Konkurrenten und die eigene Seite getrennt halten
Ihre eigene Domain sollte niemals ein Konkurrent sein. Es klingt offensichtlich, aber eine kopierte Liste aus einem alten Projekt enthält sie oft, und dann meldet der Intersect Ihre eigenen Links zurück an Sie.
Legen Sie die Konkurrenten in einem Config-Dict an der Spitze des Skripts ab, mit einem Kommentar, warum jeder dort ist. Nächsten Monat werden Sie sich an den Grund erinnern, und ein Fremder, der das Repo liest, ebenfalls.
Rohzeilen lesen, bevor Sie filtern
Der Code liest jedes Feld mit .get, was verhindert, dass ein fehlender Schlüssel den Lauf abstürzt. Er verbirgt auch einen falschen Schlüssel. Drucken Sie eine Zeile aus dem Intersect aus, bevor Sie einen Filter schreiben, und schauen Sie sich die Feldnamen und den Typ jedes Werts an.
Eine Bewertung, die als Text ankommt, sortiert als Text, also landet 9 nach 80. Konvertieren Sie sie einmal in eine Zahl, direkt nach dem Aufruf, und der Rest des Skripts kann einfach bleiben.
Domains vor dem Vergleich normalisieren
Die gleiche Seite kann mit einem www.-Präfix in einer Liste und ohne in einer anderen erscheinen. Machen Sie alles kleingeschrieben und entfernen Sie das Präfix, bevor Sie Sets vergleichen. Andernfalls kann Ihre eigene Seite wie ein neuer Kandidat aussehen.
Schließende Schrägstriche und fremde Leerzeichen aus einer eingefügten Liste verursachen die gleichen Probleme. Eine Ein-Zeilen-Bereinigungsfunktion kostet weniger als ein verschwendeter Bewertungsauftrag.
Eine datierte Kopie jedes Laufs aufbewahren
Schreiben Sie jeden Lauf in eine datierte Datei und behalten Sie die vorherige. So können Sie neue Kandidaten von solchen unterscheiden, die Sie bereits gesehen haben, und sehen, wann ein Konkurrent an einer neuen Stelle verlinkt hat.
Datierte Dateien sind auch der einfachste Weg, ein seltsames Ergebnis zu debuggen. Öffnen Sie die beiden Dateien nebeneinander, und die Änderung ist normalerweise offensichtlich.
Nur das bewerten, was überlebt
Der Bulk-Aufruf nimmt bis zu 2.000 Domains in einem Credit. Übergeben Sie ihm die Überlebenden der Subtraktion, niemals den vollen Intersect. Im erfundenen Lauf oben kosten 640 Zeilen und 410 Zeilen gleich viel, in einem Aufruf zu bewerten, aber die kleinere Liste ist viel einfacher zu lesen.
Fragen, bevor Sie den Finder ausführen
Die meisten Fragen, die Menschen in diesem Teil der Arbeit mitbringen, reduzieren sich auf Kosten, Sortierung und was passiert, wenn ein Aufruf fehlschlägt.
Kostet eine Prospektliste viel zu erstellen?
Nicht viel. Das Rezept verwendet Intersect, refdomains und bulk_dr, also fünf Credits pro Lauf in der gezeigten Größe, was $0.0005 entspricht. Ein Wiederholungslauf im nächsten Monat kostet dasselbe. Ihre eigene Zeit, die Sie mit dem Lesen von Seiten verbringen, ist die eigentliche Kostenstelle.
War nicht den Intersect nach DR sortieren und dort aufhören?
DR zählt verweisende Domains auf einer logarithmischen Skala. Große Verzeichnisse steigen an die Spitze, unabhängig von ihrer Relevanz, also zuerst nach Überlappung sortieren und DR als Tie-Breaker verwenden, nicht als Hauptkriterium.
Kann ich Outreach an alles in der CSV senden?
Sie können, aber es ist eine schlechte Nutzung der Liste. Öffnen Sie die Seite, die den Konkurrenten verlinkt, entscheiden Sie, ob ein neuer Eintrag passt, und schreiben Sie erst dann. Die CSV ist eine Vorauswahl, keine Mailingliste.
Wie viele Konkurrenten sollte ich starten?
Drei sind ein guter Start, innerhalb des zwei bis zehn Bereichs, den der Intersect akzeptiert. Fügen Sie nur mehr hinzu, wenn der erste Lauf zu wenige Zeilen zurückgibt, um zu rangieren.
Was, wenn meine eigene Domain noch keine verweisenden Domains hat?
Dann entfernt die Subtraktion nichts, und jede Intersect-Zeile wird zu einem Kandidaten. Das ist korrekt, aber die Liste wird lang sein. Kürzen Sie sie durch Überlappung und lesen Sie die Top-Dreißig manuell.
Braucht das Skript einen bezahlten Schlüssel?
Ja. Die Intersect-, refdomains- und bulk_dr-Aufrufe sind nach Credit berechnet. Die kostenlose Übersichtsfunktion benötigt keinen Schlüssel, und der $100 Anmelde-Credit deckt viele Läufe dieser Größe ab.
Bevor eine einzelne Nachricht ausgeht
Öffnen Sie die Kandidatenseite und bestätigen Sie, dass sie auf den Konkurrenten verlinkt, nicht nur auf eine Linkliste.
Prüfen Sie, ob die Seite zu Ihrem Leser passt, nicht nur zu Ihrem Keyword.
Entfernen Sie jede Domain, die Sie bereits kontaktiert haben, und protokollieren Sie das Datum daneben.
Schreiben Sie einen Satz darüber, was Ihre Seite beiträgt, oder lassen Sie den Kandidaten fallen.
In kleinen Batches senden, damit Antworten tatsächlich gelesen werden können.
Den Finder im Zeitplan ausführen
Prospektlisten veralten langsamer, als die meisten Leute erwarten. Monatlich ist völlig ausreichend. Neue Links von einem Konkurrenten erscheinen mit dem monatlichen Refresh, also fängt ein Lauf alle paar Wochen die meisten davon ab. Wöchentliche Läufe reproduzieren meist die Datei von letzter Woche, weshalb derselbe Backlink-Finder unbeaufsichtigt ohne viel Lärm laufen kann.
Der vernünftige Rhythmus ist monatlich für die Bewertung und ein kurzer Blick auf die obersten Zeilen nach jedem Lauf. Halten Sie den Subtraktionsschritt im selben Job, damit die Liste niemals das enthält, was Sie bereits haben.
Den Schlüssel aus der Datei halten
Das Skript liest den Schlüssel aus der Umgebung, also sitzt er niemals im Repo. Setzen Sie LZ_KEY als Secret in Ihrem Scheduler oder exportieren Sie ihn aus einer Datei, die außerhalb von git bleibt.
Eine crontab-Zeile kann dasselbe Skript aufrufen, mit der Variable davor gesetzt. Stellen Sie sicher, dass die Datei, die den Schlüssel enthält, auf dem Server strenge Berechtigungen hat.
Fehlschlagen, bevor die CSV geschrieben wird
Ein 401 oder 402 sollte den Lauf stoppen, ebenso wie ein ok-Flag, das falsch liest. Der Code wirft eine Ausnahme, bevor die Datei geöffnet wird, also überschreibt ein fehlgeschlagener Lauf nie die CSV von gestern mit einer partiellen.
Die Ausgaben mit jedem Lauf protokollieren
Jede Antwort enthält _credits, also drucken Sie die Bilanz am Ende des Jobs. Über einige Monate hinweg sagt Ihnen diese Zeile, ob ein Zeitplan kostet, was Sie geplant haben, und ob eine Schleife begonnen hat, Seiten erneut abzurufen.
Koppeln Sie es mit dem SQLite-Diff, wenn Sie die Historie in einer Datenbank statt in einem Ordner von Dateien wollen.
Ein Wort dazu, was DR sagen kann und was nicht
DR hier ist round(100 * log(ref_domains + 1) / log(20,000,000)). Es steigt mit verweisenden Domains und nichts anderem. Behalten Sie das im Kopf. Eine Seite kann bei 55 stehen und trotzdem für Sie nutzlos sein.
Verwenden Sie es zum Rängen, dann lesen. Schauen Sie, was die Seite veröffentlicht, ob sie auf hundert unverwandte Shops verlinkt, und ob sich kürzlich etwas darauf geändert hat. Diese Checks dauern eine Minute pro Seite, und kein Skript ersetzt sie.
Sobald die Liste sauber ist, halten Sie sie als datierte Datei und führen Sie sie im nächsten Monat erneut aus. Das Actions Runbook zeigt, wie Sie es planen, und der n8n-Vergleich deckt die No-Code-Route ab, wenn Ihre Outreach-Person es bevorzugt.
Hinweise zu Bewertung und Größe
Jeder Aufruf gibt bis zu 1.000 Zeilen zurück und wird einmal abgerechnet, also kostet das Durchsuchen von 5.000 Intersect-Zeilen 10 Credits, oder $0.001. Deep Pagination endet bei 50.000 Zeilen. Verwenden Sie sort und order=desc auf dem Server, anstatt eine große Liste nachträglich in Python zu sortieren.