DataForSEO vs ett länk-API: vad som ändras i din R-pipeline
En teardown av en imaginär pipeline, steg för steg. Vi listar vad som flyttas, vad som stannar och vad du förlorar genom att begränsa källan till länkar.
CranSEO forskarlag ·

Pipelinen, etapp för etapp
Autentisera
Vår nyckel färdas som en query-parameter eller en Authorization Bearer-header. Gratisåtgärder kräver ingen, så de första cellerna i en notebook kan köras av alla.
Begäran
En GET per åtgärd, med q för domänen. Sidhantering använder page och per (10 till 5000), sortering använder sort och order.
Parsera
Varje svar är JSON med ett ok-fält. Autentiserade svar lägger till _credits, som visar kostnaden och det återstående saldot.
Lagra
Skriv tiblet och ögonblicksbildsdatumet tillsammans. Grafen uppdateras ungefär månatligen, så datumet är en del av data.
Rapportera
Rendera från den lagrade filen, inte från ett live-anrop, så att quarto-dokumentet ger samma graf imorgon.
Vad du vinner och vad du ger upp
| Orsak | Länk-API | Bredare leverantör |
|---|---|---|
| Omfattning | Backlänkar, hänvisande domäner, ankar text, toppsidor, DR | Lägger vanligtvis till SERP- och nyckelordsdata |
| Fakturering | Per anrop, 1 kredit = $0.0001, inget abonnemang | Kontrollera sin egen prislista |
| Färskhet | Ungefärlig månatlig uppdatering | Kontrollera sin egen dokumentation |
| Rader per anrop | Upp till 1,000, fakturerat en gång | Varierar per endpoint |
| Misslyckandesignaler | HTTP 401 ogiltig nyckel, HTTP 402 inget kredit | Varierar |

Feket som kostar mest i denna typ av pipeline
De flesta pipelines misslyckas på pengarna, inte koden. En loop som anropar en endpoint en gång per rad gör en billig uppgift till en dyr.
Med oss kostar ett anrop lika mycket för 10 rader eller 1,000, så regeln vänder: be om den största sidan du kan använda. Ställ in per till 1000, sortera efter vad du behöver och sluta paginera när frågan är besvarad.
Djup paginering är begränsad till 50,000 rader, vilket är en funktion för analytiker som är frestade att dra allt. Om en domän har fler länkar än det, vill du troligen ha toppages eller anchors istället.
Jämför utgifterna för din gamla loop med den version som använder ett enda anrop innan du firar. Ibland är besparingen noll eftersom den gamla leverantören redan fakturerade per begäran.
Dom över detta teardown
Begränsa källan endast om rapporten är smal
Om de flesta kolumner i ditt tibble är länkar, tar ett länk-API bort parseringskod och kostnad. Om halva kolumnerna är SERP-data, behåll din nuvarande leverantör och lägg till vår för resten.
- Behåll demo-cellerna på gratisåtgärder
- Fäst ögonblicksbildsdatumet i utdata
- Förvänta dig en månatlig rytm, inte en daglig
Frågor från teardown
Måste jag skriva om hela min pipeline?
Nej. Ersätt endast länketappen. Behåll dina SERP- och nyckordssteg där de är, skriv tiblet för länkar till sin egen fil och joina de två nedströms på domänkolumnen.
Är CORS öppet för browser notebooks?
Ja. CORS är öppet, så en Shiny-app eller en Observable-cell kan anropa gratisåtgärderna direkt. Behåll betalknappar server-side, eftersom allt i browser-kod kan läsas av besökare.
Hur testar jag felhantering billigt?
Skicka en avsiktligt felaktig nyckel för att se HTTP 401 utan att spendera något. HTTP 402-fallet dyker bara upp när saldot är tomt, så mocka det i dina tester istället för att tömma kredit.
Stämmer totalerna exakt med en annan leverantör?
Nej. Varje leverantör crawlar annorlunda och uppdateras i sin egen takt. Jämför storleksordningar och trender, och behandla DR här som en separat, in-house log-skalig mätning.
Fel, retry och de misslyckanden du kan planera för
Misslyckanden är där ett länk-API och ett bredare API ser mest lika ut. Kod lämnas ofta ofärdig där. Lägg felvägarna till jämförelsen, eftersom ett dataforseo vs länk-API-beslut ser annorlunda ut när fel är på bordet.
HTTP 401 och HTTP 402 är de två att hantera
Två statuskoder är mest betydelsefulla. HTTP 401 betyder att nyckeln saknas eller är fel, och lösningen finns i din konfiguration snarare än i dina data. HTTP 402 betyder att kreditbalansen är slut, och lösningen är en påfyllning från kontosidan, inte en kodändring.
Skriv båda som explicita grenar. En generisk catch som sväljer status och skriver en tom tabell är hur ett tyst delvis drag sker.
Timeouts och delvisa filer
En timeout är inte en statuskod, så din egen kod måste behandla det som ett misslyckande. Wrapa anropet så att en timeout stoppar körningen innan någon output skrivs.
Skriv till en tillfällig fil och byt namn på den vid framgång. En halvfärdig fil som ser komplett ut är det sämsta utfallet av en avbruten körning, eftersom ingen tänker ifrågasätta den.
Retry och pacing
Denna sida citerar ingen requests-per-second-siffra, så storlekspå pipeline:n styrs av anrop per cykel. Det är antalet som driver kostnaden, och det är det du kontrollerar.
Retry endast nätverksfel, med en paus mellan försök. Retry aldrig en 401 eller en 402, eftersom de båda kommer att misslyckas på samma sätt vid nästa försök.
Var nyckeln finns under tester
Behåll nyckeln i en miljövariabel på din maskin och i CI:s hemliga lagring, aldrig i en fil som testerna läser. Gratisåtgärderna kräver ingen nyckel, så den första körningen är säker för alla som klonar projektet.
Ställ samma fråga till varje pipeline du rör vid: vem kan läsa nyckeln, och var är den nedskriven? En nyckel som dyker upp i en loggfil är en läcka, även när notebooken i sig är privat.
Logga vad varje anrop kostade
Varje svar från ett autentiserat anrop bär credits-fältet, som visar kostnaden och det återstående saldot. Kopiera det till din logg bredvid tidsstämpeln och åtgärdens namn, så att en kostnadsfråga kan besvaras från filen snarare än från minnet.
Läs loggen en gång i månaden, inte en gång om året. En långsam ökning i kostnaden per cykel är lätt att missa i en graf och uppenbar i en kolumn med siffror.
En misslyckad körning bör också lämna sin logg kvar, med statuskoden och steget där den stannade. En logg som bara registrerar framgångar döljer raden du behövde.

Räkna rader över etapper
Många kostsamma pipeline-buggar är räknebuggar. En tabell förlorar rader i en join, ett filter eller en deduplicering, och grafen ser fortfarande trovärdig ut efteråt.
Skriv en räkning vid varje överlämning
Tänk på pipeline:n som en kedja av tabeller: API-svaret, det parserade tiblet, den lagrade filen och rapporten. En radräkning vid varje överlämning visar vilken etapp som förlorat rader, om någon gjorde det.
Analytiker räknar ofta bara i slutet. Då ligger orsaken tre steg bakåt, och tiblet har format om två gånger sedan dess.
En rad per domän, en rad per länk
Kornet beror på åtgärden. Ett drag av hänvisande domäner har en rad per länkande webbplats, medan ett backlink-drag har en rad per länk, och en webbplats kan skicka många av dem. Räkna vid fel korn och två korrekta siffror kommer att se ut att motsäga varandra.
Sätt kornet i filnamnet för den lagrade filen eller i en rubrikkommentar, så att nästa person inte behöver gissa. Åtgärdsglossariet listar kornet för varje åtgärd.
Paginering och taket på 50,000 rader
Paginering med page och per fungerar upp till 5000 rader per sida, men djup paginering slutar vid 50,000 rader. Ett drag som förväntar sig mer än det kommer tillbaka begränsat, och dess räkning kan se misstänkt rund ut.
Jämför antalet du fick med det totala du förväntade dig. När de skiljer sig åt, kontrollera åtgärden, dess sortering och sidstorleken innan du skyller på källan.
Ett uträknat exempel, hypotetiskt
Säg att ett hypotetiskt drag frågar efter länkande webbplatser för 30 måldomäner och returnerar 30 rader med räkningar. Joinad till poängen, behåller tabellen 27 rader. De tre saknade raderna behöver en granskning innan någon graf ritas, börja med deras nycklar.
Skriv ner dessa tre med namn, inte som en räkning ensam. En räkning säger dig att rader gick förlorade, medan namnen säger vilka nycklar att rensa.
Joinar som tyst tar bort rader
En left join behåller varje rad i vänster tabell, så en saknad poäng visas som NA snarare än som en försvunnen rad. En inner join döljer samma problem genom att ta bort raden helt.
Välj join-typ med avsikt, och räkna NA-poängen efter joinen. Den räkningen hör hemma i loggen bredvid credits-fältet.
En kort testplan innan du byter
Kör båda källorna för en cykel. Samma domäner, samma dag.
Ta 30 domäner du känner väl, dra hänvisande domänräkningar från din nuvarande leverantör och från CranSEO, och plotta dem mot varandra på log-axlar. Du bör se en grov diagonal, inte en exakt, eftersom crawls skiljer sig åt och vår uppdateras ungefär månatligen; DataForSEO, Ahrefs och Semrush ser var sin något annorlunda web.
Läs outliers, inte genomsnittet. Där vårt antal är långt under, kontrollera om domänen är ny eller nyligen flyttad. Där den är långt över, kontrollera subdomäner. Glossariet definierar vad vi räknar som en hänvisande domän, och runboken visar hur du lagrar båda dragen sida vid sida.
Första produktionskörningen
- Nyckeln läses från miljön, och ett test täcker en saknad nyckel
- Ett testanrop på en enskild domän, loggat med dess credits-fält
- Explicita grenar för HTTP 401 och HTTP 402
- En radräkning skriven vid varje etapp
- Ögonblicksbildsdatumet skrivet bredvid varje lagrad fil