Przepis

Wyszukiwarka backlinków w Pythonie: lista potencjalnych partnerów w czterdziestu liniach

Znajdź domeny, które linkują do Twoich konkurentów, ale nie do Ciebie, oceń je jednym zapytaniem i posortuj wynik w CSV. Przykład z hipotetycznymi liczbami znajduje się poniżej.

Ławka warsztatowa z narzędziami do szkicowania i czerwoną nitką łączącą punkty na papierze

Logika przed kodem

Trzy zapytania załatwiają sprawę. intersect przyjmuje od dwóch do dziesięciu domen i zwraca te, które linkują do kilku z nich naraz. refdomains dla Twojej witryny zwraca zbiór do odjęcia. bulk_dr ocenia następnie to, co pozostaje.

Koszt jednego uruchomienia jest znikomy, a rachunek jest wart wykonania raz. Dwa kredyty za intersect, dwa za Twoją listę, jeden za ocenę do 2000 domen. Pięć kredytów to $0.0005.

Kolejność ma znaczenie. Odejmij przed oceną.

Często ludzie najpierw oceniają wszystko, a potem filtrują. To błędne podejście. Ocena kosztuje niewiele, ale marnuje dużo czasu, gdy CSV ma pięćdziesiąt tysięcy wierszy. Skróć listę poprzez nakładanie najpierw, zapytaj o DR dla przetrwałych elementów i trzymaj wszystko w zwykłym słowniku, aby drugie uruchomienie mogło wykorzystać wynik z wczoraj.

prospects.py

Domeny w RIVALS to placeholdery. Nazwy pól są odczytywane za pomocą .get, więc sprawdź jeden surowy wiersz z własnego uruchomienia, zanim zaufasz kolumnie.

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

Przykład krok po kroku, hipotetyczne liczby

Wymyślone uruchomienie dla małego bloga niszowego; Twoje będą się różnić
KrokWierszy na wyjściuKredyty
intersect 3 konkurentów640 domen2
Minus Twoje domeny odsyłającePozostało 4102
bulk_dr dla 410410 ocenionych1
Zatrzymaj DR 20 i wyżejokoło 1200
Ręczna weryfikacja top 3030 stron otwartych0

Od CSV do outreachu, bez spamowania

01

Sortuj według nakładania

Domeny, które linkują do dwóch lub trzech Twoich konkurentów, to te, które mają powód tematyczny, aby linkować do Ciebie. Umieść je na początku.

02

Otwórz trzydzieści ręcznie

Spójrz na stronę, która linkuje do konkurenta. Czy to lista zasobów, recenzja, artykuł newsowy? Tylko niektóre z nich akceptują nowy wpis.

03

Napisz jedną linię uzasadnienia

Powiedz, co Twoja strona dodaje, czego nie ma strona konkurenta. Jeśli nie możesz tego powiedzieć w jednym zdaniu, pomiń tę witrynę.

04

Zaloguj to, co wysłałeś

Dodaj kolumny z datą, kontaktem i wynikiem do tego samego CSV i zatwierdź go. W następnym kwartale podziękujesz sobie.

Błędy i poprawki

Skrypty do pozyskiwania leadów psują się w tych samych kilku miejscach
BłądDlaczego to boliPoprawka
Sortowanie tylko według DRDuże katalogi i skryptery wynurzają się na góręSortuj najpierw według liczby nakłań, DR jako drugorzędne
Wysyłanie do wszystkiego powyżej proguWygląda na spam, kosztuje zaufanieOtwórz top 30 ręcznie
Ręczne kodowanie URLPrzecinki i ukośniki łamią zapytanieUżyj urllib.parse.urlencode
Wysyłanie 3000 domen w jednym zapytaniuPowyżej limitu 2000Podziel listę na chunki, jeden kredyt za chunk
Ufanie DR jako jakościTo jest logarytmiczna skala zliczająca domeny odsyłająceTraktuj to jako klucz sortowania, nie werdykt
Dwa małe krzaki i jeden duży dąb dzielący się słońcem w ogrodzie

Wybieranie konkurentów, którzy dzielą Twojego czytelnika

Konkurencja decyduje, co zwróci intersect. Wyszukiwarka backlinków jest tylko tak dobra, jak lista, którą jej podasz. Trzech bezpośrednich konkurentów dla tego samego czytelnika daje czyste nakładanie, podczas gdy ogromny wydawca, który pozycjonuje się za wszystko, zwraca tysiące linków, które nic nie mówią o Twojej stronie.

Załóżmy, że prowadzisz mały blog o naprawie rowerów. Twoimi konkurentami mogą być dwa blogi naprawcze i jeden sklep z silną sekcją poradników. To jest dobry zestaw. Dodaj ogólnokrajowy portal, a lista wypełni się stronami, które nigdy nie zlinkowałyby do bloga rowerowego.

Od dwóch do dziesięciu domen to zakres, jaki akceptuje endpoint, więc wybierz zestaw w tym zakresie. Trzymaj listę wystarczająco krótką, aby móc wymienić każdego konkurenta z pamięci. Krótkie listy są łatwiejsze do obrony.

Dlaczego gigantyczne huby zanieczyszczają zbiór

Katalogi i agregatory linkują do prawie wszystkiego. Pojawiają się w każdym intersect i zakopują garść domen, które linkują z prawdziwego zainteresowania. Przeczytaj górę posortowanej listy, zanim jej zaufasz.

Zwykły plik wykluczeń naprawia większość tych problemów. Trzymaj domeny, których nigdy nie chcesz, w jednym pliku tekstowym, po jednej na linię. Załaduj je do zbioru i odrzuć dopasowania przed zapytaniem o ocenę, więc kredyty idą tylko na kandydatów wartych przeczytania.

Oddzielanie konkurentów od Twojej witryny

Twoja domena nigdy nie powinna być konkurentem. Brzmi to oczywiste, ale skopiowana lista ze starego projektu często ją zawiera, a wtedy intersect raportuje Twoje własne linki z powrotem do Ciebie.

Umieść konkurentów w słowniku konfiguracyjnym na początku skryptu, z komentarzem, dlaczego każda z nich tam jest. Za miesiąc przypomnisz sobie powód, a obcy czytający repozytorium też.

Czytanie surowych wierszy przed filtrowaniem

Kod odczytuje każde pole za pomocą .get, co zapobiega awarii uruchomienia przy brakującym kluczu. Ukrywa też błędny klucz. Wypisz jeden wiersz z intersect przed napisaniem jakiegokolwiek filtra i spójrz na nazwy pól oraz typ każdej wartości.

Ocena, która przychodzi jako tekst, sortuje się jako tekst, więc 9 ląduje po 80. Przekonwertuj ją na liczbę raz, tuż po zapytaniu, a reszta skryptu może pozostać prosta.

Normalizuj domeny przed porównaniem

Ta sama witryna może pojawić się z prefiksem www. na jednej liście i bez niego na drugiej. Zmniejsz wszystko do małych liter i usuń prefiks przed porównaniem zbiorów. W przeciwnym razie Twoja własna witryna może wyglądać na nowego kandydata.

Zbedne ukośniki i przypadkowe spacje z wklejonej listy powodują ten sam problem. Jednolinijkowa funkcja czyszczenia kosztuje mniej niż jedno zmarnowane zapytanie o ocenę.

Trzymaj datowaną kopię każdego uruchomienia

Zapisz każde uruchomienie do pliku z datą i zachowaj poprzedni. Możesz wtedy odróżnić nowych kandydatów od tych, które już widziałeś, i zobaczyć, kiedy konkurent zaczął linkować gdzieś nowo.

Datowane pliki to również najłatwiejszy sposób na debugowanie dziwnego wyniku. Otwórz dwa pliki obok siebie i zmiana jest zwykle oczywista.

Oceniaj tylko to, co przetrwa

Zapytanie masowe przyjmuje do 2000 domen za jeden kredyt. Przekaż mu przetrwałe elementy po odjęciu, nigdy pełny intersect. W wymyślonym przykładzie powyżej 640 wierszy i 410 wierszy kosztuje tyle samo ocenienia w jednym zapytaniu, ale mniejsza lista jest znacznie łatwiejsza do przeczytania.

Kamieniarka z mosiężną ciężarkiem i szorstkim kamieniem w osobnych misach

Pytania przed uruchomieniem wyszukiwarki

Większość pytań, jakie ludzie zadają w tej części pracy, sprowadza się do kosztu, sortowania i tego, co się dzieje, gdy zapytanie się nie powiedzie.

Czy lista potencjalnych partnerów kosztuje dużo zbudowania?

Niewiele. Przepis używa intersect, refdomains i bulk_dr, więc pięć kredytów za uruchomienie przy pokazanym rozmiarze, co daje $0.0005. Ponowne uruchomienie za miesiąc kosztuje tyle samo. Twój czas spędzony na czytaniu stron to prawdziwy koszt.

Dlaczego nie posortować intersect według DR i na tym skończyć?

DR liczy domeny odsyłające w skali logarytmicznej. Duże katalogi wynurzają się na górę niezależnie od ich istotności, więc sortuj najpierw według nakładania i używaj DR jako breakera, a nie głównego klucza.

Czy mogę wysłać outreach do wszystkiego w CSV?

Możesz, ale to marnotrawstwo listy. Otwórz stronę, która linkuje do konkurenta, zdecyduj, czy nowy wpis pasuje, a dopiero potem pisz. CSV to krótka lista, nie lista mailingowa.

Ilu konkurentów powinienem zacząć?

Trzy to dobry start, w zakresie od dwóch do dziesięciu, jaki akceptuje intersect. Dodawaj więcej tylko, gdy pierwsze uruchomienie zwróci zbyt mało wierszy do rangowania.

Co jeśli moja domena nie ma jeszcze domen odsyłających?

Wtedy odjęcie nic nie usuwa, a każdy wiersz intersect staje się kandydatem. To jest poprawne, ale lista będzie długa. Skróć ją poprzez nakładanie i przeczytaj top trzydzieści ręcznie.

Czy skrypt potrzebuje płatnego klucza?

Tak. Zapytania intersect, refdomains i bulk_dr są wyceniane według kredytów. Działanie overview free nie wymaga klucza, a kredyt rejestracyjny $100 pokrywa wiele uruchomień tego rozmiaru.

Przed wysłaniem jakiejkolwiek wiadomości

  • Otwórz stronę kandydata i potwierdź, że linkuje do konkurenta, a nie tylko do listy linków.
  • Sprawdź, czy strona pasuje do Twojego czytelnika, a nie tylko do Twojego słowa kluczowego.
  • Usuń każdą domenę, do której już wysłałeś wiadomość, i zapisz datę obok niej.
  • Napisz jedno zdanie o tym, co Twoja strona dodaje, lub odrzuć kandydata.
  • Wyślij w małych partiach, aby odpowiedzi można było naprawdę przeczytać.

Uruchamianie wyszukiwarki w harmonogramie

Listy potencjalnych partnerów starzeją się wolniej, niż większość ludzi się spodziewa. Miesięcznie to wystarczy. Nowe linki od konkurenta pojawiają się przy miesięcznym odświeżeniu, więc uruchomienie co kilka tygodni łapie większość z nich. Cotygodniowe uruchomienia głównie reprodukują plik z zeszłego tygodnia, dlatego ta sama wyszukiwarka backlinków może działać bez nadzoru bez dużego szumu.

Rozsądnym rytmem jest miesięczne ocenianie i szybki rzut oka na górne wiersze po każdym uruchomieniu. Trzymaj krok odejmowania w tym samym zadaniu, więc lista nigdy nie zawiera tego, co już posiadasz.

Trzymaj klucz poza plikiem

Skrypt odczytuje klucz ze środowiska, więc nigdy nie siedzi w repozytorium. Ustaw LZ_KEY jako sekret w swoim harmonogramie lub wyeksportuj go z pliku, który jest poza git.

Linia crontab może wywołać ten sam skrypt ze zmienną ustawioną przed nim. Sprawdź, czy plik trzymający klucz ma ścisłe uprawnienia na serwerze.

Niepowodzenie przed zapisaniem CSV

401 lub 402 powinno zatrzymać uruchomienie, tak samo jak flaga ok czytająca false. Kod podnosi wyjątek przed otwarciem pliku, więc nieudane uruchomienie nigdy nie nadpisze wczorajszego CSV częściowym.

Zaloguj wydatki z każdym uruchomieniem

Każda odpowiedź zawiera _credits, więc wydrukuj saldo na końcu zadania. Przez kilka miesięcy ta linia powie Ci, czy harmonogram kosztuje tyle, ile zaplanowałeś, i czy pętla nie zaczęła ponownie pobierać stron.

Połącz go z SQLite diff, jeśli chcesz historię w bazie danych zamiast folderu plików.

Słowo o tym, co DR może i nie może powiedzieć

DR tutaj to round(100 razy log(ref_domains + 1) nad log(20,000,000)). Wzrasta z domenami odsyłającymi i niczym innym. Miej to na uwadze. Witryna może siedzieć na 55 i tak być bezużyteczna dla Ciebie.

Użyj go do rangowania, potem czytaj. Spójrz, co publikuje witryna, czy linkuje do stu niezwiązanych ze sobą sklepów i czy coś na niej niedawno się zmieniło. Te sprawdzenia zajmują minutę na witrynę i żaden skrypt ich nie zastąpi.

Gdy lista jest czysta, trzymaj ją jako plik z datą i uruchom ponownie za miesiąc. Dokumentacja Actions pokazuje, jak to zaplanować, a porównanie n8n obejmuje drogę bez kodowania, jeśli osoba prowadząca outreach woli tę opcję.

Uwagi dotyczące oceny i rozmiaru

Każde zapytanie zwraca do 1000 wierszy i jest rozliczane raz, więc paginacja przez 5000 wierszy intersect kosztuje 10 kredytów, czyli $0.001. Głęboka paginacja zatrzymuje się na 50 000 wierszach. Użyj sort i order=desc na serwerze zamiast sortowania ogromnej listy w Pythonie później.