Rankift
RankiftFå 100 $ gratis

Recept

Spåra backlinks med en veckovis diff du kan läsa på en minut

Hämta, lagra, jämför, posta. Hela receptet är en Python-fil, en mapp med daterad JSON och en cron-rad.

Workshop-bänk med nyckel som förbinder två vattentankar och en klocka

Receptet, från början till slut

  1. 1

    Skapa nyckeln

    Logga in med Google, skapa en nyckel på kontosidan och exportera den som RANKIFT_KEY. Committa aldrig den till repo:t.

  2. 2

    Välj åtgärden

    refdomains för diffen på domännivå, vilket är vad de flesta varningar behöver. Använd backlinks endast när du behöver URL:er och ankartexter, till samma kostnad på 2 krediter.

  3. 3

    Lagra daterade ögonblicksbilder

    En fil per domän per körning, namngiven med datumet. Disk är billigt, och gamla filer låter dig svara på frågor som ännu inte ställts.

  4. 4

    Diff och posta

    Jämför de två senaste filerna, skriv ut vad som försvunnit och vad som kommit till, och avsluta tyst om båda listorna är tomma.

  5. 5

    Schemalägg det

    Cron på måndagsmorgonen. Lägg till en felnotifikation, eftersom en tyst övervakare är värre än ingen alls.

diff.py

Kontrollerad mot de dokumenterade parametrarna: action, q, per, page och key. Svarsstrukturen skiljer sig åt per åtgärd, så skriv ut ett riktigt svar och ställ in ROWS och ID så att de matchar innan du litar på det.

python
import json, os, sys, glob, urllib.parse, urllib.request

KEY, SITE = os.environ['RANKIFT_KEY'], 'https://rankift.com/api.php'
ROWS, ID = 'rows', 'domain'   # adjust after inspecting one response

def pull(domain):
    out, page = [], 1
    while True:
        qs = urllib.parse.urlencode({'action': 'refdomains', 'q': domain,
                                     'per': 1000, 'page': page, 'key': KEY})
        with urllib.request.urlopen(f'{SITE}?{qs}') as r:
            batch = json.load(r)[ROWS]
        out += batch
        if len(batch) < 1000 or page >= 5:   # five pages = 5,000 rows
            return out
        page += 1

domain, date = sys.argv[1], sys.argv[2]
json.dump(pull(domain), open(f'snap/{domain}-{date}.json', 'w'))

files = sorted(glob.glob(f'snap/{domain}-*.json'))
if len(files) > 1:
    old = {r[ID] for r in json.load(open(files[-2]))}
    new = {r[ID] for r in json.load(open(files[-1]))}
    lost, gained = sorted(old - new), sorted(new - old)
    if lost or gained:
        print(f'{domain}: -{len(lost)} +{len(gained)}')
        print('lost:', lost[:25])

Varför en diff slår en dashboard

En graf visar att linjen har rört sig. En diff visar vilka domäner som har rört sig, vilket är det du kan agera på.

Verktyg som Ahrefs och Semrush visar nya och förlorade länkar i sina egna gränssnitt, och för ad hoc-arbete är det bra. Problemet börjar vid femtio webbplatser och en analyst, när måndagsritualen att öppna varje projekt äter upp morgonen.

Ett skript förvandlar den ritualen till en fil. Det lämnar också ett daterat arkiv, så i mars kan du svara på hur profilen såg ut i oktober utan att be en leverantör om en export.

Cron-raden

Körs måndag kl. 07:00 servertid och mailar ut all output till dig, vilket är varför skriptet inte skriver något när inget har ändrats.

bash
0 7 * * 1  cd /srv/linkwatch && for d in example.com rival-one.com rival-two.com; do python3 diff.py $d $(date +%F); done | mail -s 'link diff' your-team-list

Vad det kostar

1 kredit är $0.0001. Varje anrop debiteras en gång oavsett radantal, upp till 1 000 rader.
InstallationAnrop per veckaKrediter per veckaPer år
1 domän, under 1 000 hänvisande domäner12ca $0.01
1 domän, 4 000 hänvisande domäner48ca $0.04
Din webbplats och 5 konkurrenter, 1 sida vardera612ca $0.06
50 kundwebbplatser, 1 sida vardera50100ca $0.52
Trädgårdsmästare som klipper en buske i en lugn trädgård med en riva

Fallgropar vi stött på, så att du slipper

Ögonblicksbilder ändras bara när indexet gör det. Vi uppdaterar ungefär en gång i månaden, så de flesta veckokörningar returnerar en identisk lista och skriver inget. Det är medvetet. Tystnad är det förväntade resultatet.

Djup paginering är begränsad till 50 000 rader, och gränsen på fem sidor i skriptet håller dig långt under den. Stora domäner behöver en annan plan: sortera med sort och order=desc på ett fält som åtgärden accepterar, och avsluta tidigt när raderna inte längre är intressanta.

Kör den första hämtningen för hand och läs JSON:en. Kontrollera fältnamnen. Jämför sedan radantalet med totalen för hänvisande domäner från ett svar från den gratis overview-åtgärden, om det svaret innehåller en sådan.

Hantera HTTP 401 och 402 explicit, eftersom 401 betyder en felaktig nyckel och 402 betyder att saldot har nått noll. Båda hör hemma i din felnotifikation. När en diff utlöses, följ runboken för förlorade länkar under den första timmen.

Att mäta en inköpt länkkampanj, en ögonblicksbild i taget

Att köpa länkar utan en baslinje är ett vanligt sätt att hamna med ett nummer man inte kan försvara. Ta ögonblicksbilden innan den första placeringen går live, och behåll den bredvid varje ögonblicksbild som följer.

Jämför sedan hänvisande domäner, inte råa antal, eftersom en donator kan bära många länkar. Varje ny rad i diffen är en webbplats du kan öppna och kontrollera för hand.

En kampanj som ser platt ut i en månad är inte automatiskt ett misslyckande. Indexuppdateringar är långsamma, så diffen ligger efter vad som hände på de live-sidor som finns, och den fördröjningen är en del av metoden.

Hur mäter jag om inköpta backlinks fungerade?

Börja från datumet för den första placeringen och leta efter donatorraderna som dyker upp efter det. Räkna bara de som fanns kvar i de två nästa ögonblicksbilderna. Jämför sedan det antalet med vad du betalade för placeringarna, och registrera resultatet bredvid datumen.

Vad ska ögonblicksbilden före ett köp innehålla?

Den fullständiga listan över hänvisande domäner, sparad i samma filformat som varje senare körning, med datum och domän i filnamnet. En baslinje i ett annat format kan inte diffas, och det är det misstaget du inte kan reparera efteråt.

Detektiv som sorterar löv på marken med en förstoringsglas

Hur en stökig vecka ser ut i diffen

En vecka med tusentals nya rader är inte alltid en kris. Ofta är det skrapare. De kopierar sidor, och kopior skapar länkar som ingen har placerat. Kontrollera donatorn först innan du antar något om din egen webbplats.

Sortera de nya raderna efter donatorns kvalitet innan du läser dem. De flesta av listan är oftast brus, och en kort titt på de översta raderna berättar om toppen värd resten av din morgon.

Om raderna är skrapade sidor, registrera antalet och gå vidare. Om de är riktiga webbplatser med länkar till dina pengar-sidor, följ triage-stegen.

Varför visar diffen vinster från spam?

För att diffen rapporterar vad som dykt upp i indexet, inte vad en människa valde. Spam som indexet har plockat upp ser ut exakt som en redaktionell länk tills du öppnar donatorns sida och läser den.

Hur ofta bör jag granska disavow-kandidater?

Månadsvis passar indexrytmen bättre än dagligt. En daglig granskning visar oftast samma lista igen, medan en månatlig ger varje kandidat tid att bli omkrawlad innan du dömer den. Sidan triage för spam-länkar har beslutsstegen.

Innan du litar på den första diffen

  • Den första hämtningen lästes för hand, rad för rad, för minst en sida.
  • Fältnamnen matchar konstanterna i början av skriptet.
  • En 401 och en 402 misslyckas båda högljutt, inte tyst.
  • Ögonblicksbildsmappen är backupad eller synkroniserad någonstans där du kan återställa den.
  • Någon annan än författaren har sett den första varningen och håller med om att den är värd en meddelande.

Behåll ögonblicksbildsarkivet användbart i ett år

Behåll varje daterad fil, inklusive de som ser oförändrade ut. Ett års veckovisa ögonblicksbilder tar lite diskutrymme, och det svarar på frågor som ännu inte ställts, som när en donator först dök upp.

Namnge filer konsekvent, med domänen, datumet och åtgärden. Blandade namn får diff-skriptet att välja fel par, och ett fel par ger en säker och felaktig varning.

Komprimera äldre filer en gång per kvartal om utrymme är viktigt. Behåll de tolv senaste ofkomprimerade, så att veckokörningen aldrig väntar på ett arkiv.

Hur hittar jag den första ögonblicksbilden där en donator dök upp?

Sortera de daterade filerna efter namn, sök sedan i varje fil efter donatordomänen tills du hittar första träffen. En kort loop gör detta på några rader, och resultatet är bara så bra som namngivningen du hållit från början.

Vad ska jag ta bort, och vad ska jag behålla?

Behåll varje ögonblicksbild som ett beslut baserades på, plus den första och sista av varje månad. Ta bort resten först efter att arkivet har kontrollerats, eftersom en borttagen fil inte kan svara på en fråga senare.

Skicka diffen dit folk redan läser

En diff som landar i en oläst mapp har inget värde. Delat är bättre än privat. Posta resultatet till kanalen som ditt team redan tittar på, och håll meddelandet kort nog att agera på med ett snabbt ögonkast.

Ett bra meddelande namnger domänen, antalet förlorade och vunna rader, och första steget. Det lämnar ut den fullständiga listan, som hör hemma i den bifogade filen.

Tystnad under en lugn vecka är en del av designen. Om inget har ändrats behöver ingen påminnelse om att inget har ändrats. Behåll det så. Kanalen förblir läsbar för nästa riktiga varning.

Vad ska meddelandet innehålla?

Tre saker: donatorns eller rivalens namn, de två antalen och en länk till den sparade filen. När en poäng är bifogad, lägg till den högsta Domain Rating bland de nya raderna, eftersom en stark domän ändrar prioritet mer än tio svaga.

Vem får felnotifikationen?

Någon som kan fixa jobbet, inte bara någon som läser meddelandena. En 401 behöver en ny nyckel, och en 402 behöver en påfyllning från kontosidan. Varken löses genom att vänta på nästa måndag.

Att utöka det

Byt refdomains mot backlinks när varningen behöver donatorns URL och ankar text. Behåll samma kostnad på två krediter i åtanke.

Lägg till bulk_dr för att poängsätta varje ny domän, till en kredit per anrop upp till 2 000 domäner. Då kan ditt meddelande säga "3 nya, bästa DR 72" istället för en blott lista.

För Google Sheets fungerar samma frågestreck i Apps Script med UrlFetchApp. Och för konkurrenter, använd trösklarna från konkurrenters backlink-varningar.