Ernsttabel

Checker voor slechte backlinks: diff snapshots in SQLite

Geen enkel script kan een link voor jou toxisch noemen. Het kan je wel vertellen welke verwijzende domeinen nieuw zijn, welke zijn verdwenen en welke opvallend genoeg zijn om met de hand te lezen.

Stenen kluis met kleitabletten en een koperen liniaal die datapunten meet

Ernsttabel voor nieuwe verwijzende domeinen

Onze eigen vuistregels voor triage, geen definitie van Google
NiveauSignaalActie
NegerenNieuw domein, DR boven 30, anchor is je merk of een blote URLLog het, ga verder
Kijk50 of meer nieuwe domeinen in een week van één TLD dat je nooit hebt doeldOpen er tien
Kijk goedZelfde exact-match anchor op 20 of meer nieuwe domeinenControleer de anchor cloud, vind de bron
HandelenBetaald ogende netwerk of gehackte pagina's die naar je verwijzenDocumenteer het; overweeg een disavow-bestand alleen als je ook een handmatige actie hebt
WachtenEen domein is deze maand verdwenenControleer opnieuw na de volgende maandelijkse refresh

Waarom diff in plaats van één scan

Eén snapshot vertelt je wat er is. Een diff vertelt je wat is veranderd, en daar komen de problemen naar voren.

Google heeft al jaren gezegd, sinds de Penguin 4.0-release in september 2016 en opnieuw in de link spam-update van december 2022, dat het spammy links meestal negeert in plaats van ze te straffen. SpamBrain doet dat werk. Dus een overstroming van rommel is vaker ruis dan een dreiging, en de diff bespaart je vooral dat je reageert op ruis.

Houd je eigen geschiedenis bij. Suites overschrijven die van henzelf.

Bouw de geschiedenis tabel in vier stappen

De diff werkt alleen als elke run in dezelfde tabel komt, in dezelfde vorm. Deze stappen zorgen ervoor dat dat zo blijft.

01

Maak de tabel één keer aan

Voer een create-if-not-exists statement uit met de kolommen die je nodig hebt: de dag, het domein en de score. Houd het in het script, zodat een nieuwe machine dezelfde tabel opnieuw bouwt zonder handmatige stappen.

02

Voeg één rij per domein per dag in

Gebruik een geparametriseerde insert en commit één keer per run. Eén commit voorkomt dat een crash een halve dag in het bestand achterlaat.

03

Bescherm tegen een tweede run

Verwijder de rijen van die dag voordat je invoegt, of voeg een unieke sleutel toe op dag en domein. Een herhaling op dezelfde dag vervangt dan de rijen in plaats van ze te verdubbelen.

04

Vergelijk met de vorige dag op bestand

Kies de meest recente eerdere datum met een max(day) filter, niet de datum van gisteren. De vergelijking blijft correct wanneer een week is overgeslagen.

diff.py

Twee tabellen zouden netter zijn. Eén is genoeg voor een hobby-setup: een rij per domein per snapshotdatum.

python
import json, sqlite3, sys, datetime
db = sqlite3.connect('links.db')
db.execute('create table if not exists snap(day text, dom text, dr int)')
rows = json.load(open(sys.argv[1]))
day = datetime.date.today().isoformat()
db.executemany('insert into snap values (?,?,?)',
               [(day, r.get('domain'), r.get('dr')) for r in rows])
db.commit()
prev = db.execute('select max(day) from snap where day < ?', (day,)).fetchone()[0]
if prev:
    new = db.execute('select dom from snap where day=? except select dom from snap where day=?', (day, prev)).fetchall()
    gone = db.execute('select dom from snap where day=? except select dom from snap where day=?', (prev, day)).fetchall()
    print(len(new), 'new,', len(gone), 'gone')

Probleemoplossing van de diff

SymptoomWaarschijnlijke oorzaakOplossing
Honderden 'verdwenen' in één nachtIndex refresh wisselde de steekproefVergelijk maandelijks, niet dagelijks
Elk domein ziet er nieuw uitTabel was leeg of day-formaat is gewijzigdControleer select distinct day
DR-kolom allemaal NULLRijveldnaam verschilt van drPrint één ruwe rij en pas aan
Duplicaten na een herhalingZelfde dag twee keer ingevoerdVerwijder die dag eerst, of voeg een unieke sleutel toe
Aantal lager dan totalPaginering stopte te vroegLos de lus op in het Actions runbook
Tuinman die varens observeert met een loep om groeipatronen te vergelijken

Drempelwaarden kiezen op basis van je eigen geschiedenis

Een drempelwaarde die je uit een blogpost kopieert is een gok over iemands andere site. Een checker voor slechte backlinks is alleen zo nuttig als zijn limieten, en je eigen geschiedenis vertelt je wat normaal is voor jouw domein.

Begin met een paar maanden loggen zonder ergens op te reageren. Laat het rustig worden. Schrijf dan de typische wekelijkse schommeling op. Pas daarna stel je de limieten in de ernsttabel in.

Begin met een baseline

Registreer aantallen nieuw en verdwenen voor elke run zonder erop te reageren. Een paar maanden rustig loggen geeft je een bereik dat bij jouw domein hoort en dat van niemand anders.

Zodra de baseline bestaat, springt één slechte week eruit en kun je het verschil verklaren zonder te gokken. Dat is het hele punt van de baseline.

Kies één alarm per signaal

Elk signaal in de tabel krijgt één drempelwaarde, één eigenaar en één actie. Een signaal met drie alarms is een signaal dat niemand leest, en de alarms worden samen genegeerd.

Schrijf het alarm naast het signaal in de code, zodat de tabel op deze pagina en het script nooit van mening verschillen.

Bekijk de limieten elk kwartaal opnieuw

Je site groeit, en zo ook je normaal. Controleer de limieten elke drie maanden opnieuw en schrijf de reden naast elke wijziging, zodat de geschiedenis zichzelf later verklaart.

Vuurtorenwachter die de horizon scant met een telescoop en een anker op de werktafel

De ernsttabel in de praktijk lezen

De tabel is een triage-hulp, geen oordeel. Elke rij vertelt je waar je moet kijken, en de actiekolom houdt je tegen om in paniek een disavow-bestand te pakken.

Werk van bovenaf. De meeste weken eindigen bij Negeren of Kijk. Een Kijk-rij begint met een paar minuten lezen, en een Kijk goed-rij begint met een langere review van de anchors. Sla rijen niet over omdat de week druk was. Een overgeslagen rij is de week waarop de overstroming onopgemerkt blijft.

Steekproef voordat je besluit

Open tien van de gemarkeerde domeinen en lees de pagina's. Een overstroming die blijkt een directory scraper te zijn, is een ander probleem dan een overstroming van ongerelateerde blogs, en alleen de pagina's maken ze uit elkaar.

Registreer wat je hebt besloten

Houd één regel per beslaking bij: het domein, het niveau, wat je hebt gecontroleerd en wat je hebt gedaan. De volgende persoon die de log leest, inclusief toekomstige jij, krijgt de redenering zonder vergadering.

Een maandelijkse samenvatting van die regels kost weinig tijd en is een goed eerste concept van een review.

Wat dit je niet kan vertellen

Het kan niet bewijzen dat een link je schaadt. Niemand buiten Google kan dat, en het rapport voor handmatige acties in Search Console is de enige plek waar een straf wordt vermeld.

Het kan ook geen links zien die jonger zijn dan de laatste refresh. Vraag voor frisser bewijs de mensen die de verwijzende site runnen, of lees je serverlogs voor de referrers. Onze notitie over timing gaat dieper in.

Als je de anchors kant wilt, kost anchor_cloud 2 credits en groepeert tekst op frequentie, wat de snelste manier is om een exact-match ophoping te spotten.

Links die aankomen tussen refreshes

Alles jonger dan de laatste refresh ontbreekt aan beide kanten van de diff. Een link die verschijnt en verdwijnt binnen één refresh venster wordt helemaal niet getoond, vandaar dat de vergelijking maandelijks moet draaien.

Anchors die voor jou verkeerd lijken

Een diff ziet het domein, niet de zin rond de link. Twee identieke anchors op twee verschillende pagina's kunnen heel verschillende dingen betekenen, dus houd de anchor check als een aparte, handmatige stap.

Opslagkeuzes voor een hobby-setup

SQLite is de eenvoudigste database die nog steeds een diff-vraag beantwoordt met één query. Het leeft in één bestand, dus het past in de repo of een backup map zonder server.

Gedateerde JSON-bestanden werken ook. Het is langzamer om te queryen, maar makkelijker te openen in een teksteditor als er iets mis lijkt te zijn. Kopieer de opslag op een tweede plek voordat je opschoning doet, en houd de kopie een volledig kwartaal voordat je iets verwijdert.

Wanneer één bestand genoeg is

Eén tabel met een dag kolom dekt één site voor jaren. Het bestand blijft klein, en de queries op deze pagina hoeven niet te worden afgestemd.

Wanneer verhuizen naar een server

Zodra meerdere mensen schrijven naar dezelfde geschiedenis, wordt een bestand op één machine de bottleneck. Op dat punt is een beheerde database de eerlijke keuze, en het schema blijft hetzelfde.

Tot dan is een bestand in de repo de eenvoudigste oplossing die een laptopwisseling overleeft.

De diff koppelen aan een weekelijkse taak

Voer diff.py direct uit na de snapshot stap. Print de aantallen en exit met een niet-nul code wanneer new een limiet overschrijdt die jij hebt gekozen, zeg 200 in een week voor een kleine site. De taak wordt rood, en GitHub e-mailt je. Simpel.

Kies de limiet op basis van je eigen geschiedenis. Na twee maanden weet je of 15 nieuwe domeinen per week normaal is of een piek, en elk vast getal dat je uit een blogpost kopieert is een gok.

Rustige weken zijn de norm.

Vragen over slechte links, eerlijk beantwoord

Is er een betrouwbare checker voor slechte backlinks?
Geen enkel tool kan een link met zekerheid schadelijk labelen, omdat alleen Google weet hoe het elke één behandelt. Een script kan patronen boven water halen die het lezen waard zijn: plotselinge overstromingen, herhaalde exacte anchors, vreemde TLD's. Jij maakt de beslissing na het openen van de pagina's.
Moet ik disavowen wat de diff markeert?
Zelden. Google heeft gezegd dat het spam links grotendeels negeert, en een disavow-bestand is bedoeld voor gevallen zoals een handmatige actie of een betaalde-link rommel die jij zelf hebt gemaakt. Documenteer eerst, en controleer Search Console voordat je iets indient.
Hoe vaak moet ik het draaien?
Snapshot wekelijks, review maandelijks. De index refreshes ongeveer één keer per maand, dus een dagelijkse diff vergelijkt meestal een tabel met zichzelf. Een maandelijkse review past bij de data en houdt de ruis laag.
Welke kolommen moet de tabel bijhouden?
Houd de dag, het domein, de DR en een source kolom bij. Voeg de anchor alleen toe als je ook anchors ophaalt. Meer kolommen voelen grondig aan, maar elk extra veld is er één die kan afwijken tussen runs.
Kan ik twee suites tegen elkaar diffen?
Je kunt hun aantallen voor dezelfde site vergelijken, maar de twee resultaten zullen niet overeenkomen. Draai de diff binnen één bron, en vergelijk de richting van verandering over bronnen heen, dezelfde regel die overal op deze site van toepassing is.
Wat als een domein vertrekt en dan de volgende maand terugkomt?
Het toont als verdwenen en dan als nieuw, wat ruis is. Tel returns apart, of vergelijk drie maanden tegelijk, zodat een domein dat voor één refresh uitvalt geen review triggerd.