Przeglądaj URL backlink checker bez luk ani pętli
Wierszy na wywołanie, stron na zapytanie i sztywny sufit na poziomie 50 000. Oto pętla, która respektuje wszystkie trzy parametry i informuje, kiedy należy zakończyć działanie.

Do 1000 wierszy zwracanych jest w jednym wywołaniu. Każde wywołanie jest rozliczane raz, niezależnie od liczby wierszy. Głęboka paginacja jest ograniczona do 50 000 wierszy, co stanowi 50 wywołań po 1000 wierszy każde.
Dlaczego sortowanie poprzedza paginację
Paginacja nieposortowanej listy to przyczyna powstawania duplikatów. Zawsze wysyłaj sort i order razem z page i per, aby strona 3 oznaczała to samo przy każdym żądaniu w ramach danego uruchomienia.
Pobranie refdomains kosztuje 2 kredyty za wywołanie, więc 50 wywołań to 100 kredytów, czyli jeden cent. Nawet najgorszy scenariusz jest tani; prawdziwym kosztem jest pętla, która nie kończy działania.
Wybieranie kolumny sortowania
Wybór kolumny do sortowania zależy od pytania. Największe wartości na początku to zwykle wybór przy audytach, ponieważ sufit wtedy odcina długie ogony, a nie część, która Cię interesuje.
Sortuj według pola, które nie ma znaczenia dla Twojego pytania, a odcięcie może usunąć wiersze, które chciałeś uzyskać. Pobierz najpierw po dziesięć wierszy dla każdej kandydującej kolumny sortowania i sprawdź, która część przetrwa przy suficie.
Zapisz wybór w raporcie, aby kolejna osoba wiedziała, dlaczego odcięcie nastąpiło właśnie w tym miejscu.
Rekordy, które zmieniają się podczas uruchomienia
Dane nie zmieniają się podczas uruchomienia, chyba że miesięczna odbudowa indeksu nastąpi w jego trakcie. Rzadkie, ale realne. Zadanie nocne, które pokrywa się z początkiem miesiąca, może zwrócić jedną stronę ze starego indeksu, a kolejną z nowego, więc zapisuj czas rozpoczęcia w logach i porównuj wyniki.
Zapisz czas rozpoczęcia na początku logu i numer strony przy każdym wierszu. Następnie niezgodność w outputcie wskaże na problem z czasem, a nie na błąd parsowania.
Jeśli zadanie jest zaplanowane, unikaj czasu rozpoczęcia tuż przed prawdopodobną odbudową. Twoje logi pokazują odbudowę jako przesunięcie w sumach między dwoma uruchomieniami, które w innym aspekcie są zgodne, więc zapisuj sumy w każdym wierszu logu.
Uruchomienie, które obejmuje odbudowę, nie jest domyślnie błędne. Jest tylko niespójne, więc oznacz takie uruchomienia w logach i ponów pobranie odpowiedniego fragmentu, gdy ma to znaczenie dla raportu.
Pętla paginacji, która się zatrzymuje
TypeScript dla workera na Node 20. Zatrzymuje się przy pierwszej krótkiej stronie, przy suficie lub przy dowolnym ok, który nie jest prawdą.
const BASE = "https://seomasters.dev/api.php";
const CAP = 50_000;
const PER = 1000;
export async function pullAll(domain: string, key: string) {
const rows: unknown[] = [];
for (let page = 1; rows.length < CAP; page++) {
const u = new URL(BASE);
u.search = new URLSearchParams({
action: "refdomains", q: domain,
page: String(page), per: String(PER),
sort: "dr", order: "desc",
}).toString();
const res = await fetch(u, { headers: { Authorization: `Bearer ${key}` } });
if (res.status === 401 || res.status === 402) throw new Error(`stop: HTTP ${res.status}`);
const body = await res.json();
if (!body.ok) throw new Error(JSON.stringify(body).slice(0, 300));
const chunk = findRows(body); // see note below
rows.push(...chunk);
if (chunk.length < PER) break; // short page means we are done
}
return rows;
}Rozwiązywanie problemów z uruchomieniem paginacji
| Co widzisz | Prawdopodobna przyczyna | Co zrobić |
|---|---|---|
| Strona 51 zwraca pustą odpowiedź lub błąd | Osiągnięto limit 50 000 | Zawęż wyniki innym działaniem lub innym sort, a następnie scalaj po id |
| Ten sam domen na dwóch stronach | Zapytanie bez sortowania lub odbudowa indeksu w trakcie działania | Wyślij sort i order; usuń duplikaty po kluczu domenowym |
| Mniej wierszy niż suma w dashboardzie | Suma dotyczy całego grafu, pobranie jest ograniczone | Pokaż "top 50 000" w UI |
| Pętla nigdy się nie kończy | Warunek sprawdza tylko rows.length | Przerwij przy krótkiej stronie, jak wyżej |
| Rachunek wyższy niż oczekiwano | Ponów próbę przy każdym kodzie innym niż 200 | Ponów próbę tylko przy błędach sieci, zobacz błędy |

Odczytywanie wierszy bez zgadywania nazw pól
Powyższa pomoc findRows jest celowo pozostawiona otwarta. Wykonaj jedno rzeczywiste wywołanie, spójrz na JSON i napisz accessor na podstawie tego, co widzisz, a nie tego, co obiecywał samouczek.
Dla tańszego odpowiednika tego zadania, oceniania wielu domen naraz bez żadnej paginacji, przeczytaj skrypt DR masowy.
Zablokuj jedną odpowiedź jako fixture
Następnie zablokuj ją za pomocą testu. Zapisz jedną odpowiedź jako plik fixture i sprawdź liczbę wierszy oraz klucze pierwszego wiersza, aby przyszła zmiana spowodowała błąd w CI, a nie w wykresie klienta.
Przechowuj fixture w kontrolce wersji obok testu, aby recenzent widział kształt, którego oczekuje kod, bez konieczności uruchamiania czegokolwiek.
Gdy API doda później nowe pole, różnica w fixture powie Ci, czy Twój accessor to zauważył, czy też cicho to zignorował.
Nazwij fixture zgodnie z zapytaniem, z którego pochodzi, np. akcją, domeną i sortowaniem. Plik o nazwie response1.json nic nie mówi następnemu czytelnikowi o tym, co dowodzi.
Policz przechowywane wiersze
Porównaj zapisane wiersze z sumą zgłoszoną przez pętlę. Luka oznacza, że strona została pominięta, a powtórzenie oznacza, że strona została pobrana dwukrotnie i zinsertowana jako jeden wiersz.
Uruchamiaj to sprawdzenie po każdym pobraniu testowym, nie tylko po pierwszym. Odchylenia w liczbie to zwykle pierwszy objaw zmiany sortowania lub odbudowy w trakcie działania.
Przechowuj liczbę w tym samym wierszu logu co numer strony, aby oba można było odczytać jednym rzutem oka.
Podział pracy powyżej limitu
Niektóre pytania wykraczają poza limit. Dla list powyżej limitu podziel problem, zamiast paginować intensywniej. Pobierz top 50 000 według jednego sortowania, a następnie zadaj inne pytania dotyczący najcięższych domen, ponieważ również kosztują 2 kredyty i odpowiadają na inne pytania. Intensywniejsza paginacja nigdy nie przejdzie przez odcięcie.
Pobierz top 50 000 według jednego sortowania
Traktuj limit jako fakt API. Pobierz top 50 000 wierszy według jednego sortowania, zapisz je i oznacz wynik jako górny fragment w każdym raporcie.
Dashboard, który pokazuje ograniczoną sumę jako pełną sumę, myli czytających. Etykieta nic nie kosztuje, a raport url backlink checker czyta się bardziej uczciwie z jej użyciem.
Zdecyduj o rozmiarze fragmentu przed uruchomieniem i zapisz go w nagłówku raportu, aby liczba nigdy nie wyglądała na większą, niż jest. Linia nagłówka nic nie kosztuje, a czytelnik, który później znajdzie brakujący wiersz, Ci za to podziękuje.
Zadaj ciężkim domenom inne pytanie
anchors i toppages odpowiadają na inne pytania, np. który anchor text dominuje lub które strony przyciągają linki. Dla domeny przekraczającej limit te odpowiedzi mogą mieć większe znaczenie niż kolejna strona tej samej listy.
Przechowuj ich wyniki w osobnych tabelach, kluczowanych domeną, aby późniejsze pobranie tej samej domeny mogło je zastąpić bez dotknięcia wierszy górnego fragmentu.
Każde dodatkowe działanie kosztuje własne kredyty, więc oceń to przed uruchomieniem, a nie po otrzymaniu rachunku.
Krótka lista najcięższych domen, pobierana raz w miesiącu, często daje bardziej użyteczny kontekst niż dłuższa lista pobierana codziennie.
Scalanie po kluczu domenowym
Gdy dwa pobrania się nakładają, scalaj je po kluczu domenowym i zachowaj nowszy znacznik czasu. Scalanie nie zależy wtedy od tego, które pobranie zakończyło się pierwsze.
Zaloguj, które pobranie wygrało dla każdego wiersza. Jeśli liczba zmienia się między dwoma raportami, ten log powie Ci, czy zmienił się indeks, czy scalanie.
Zachowaj scalanie w jednej funkcji z testem, ponieważ jest to jedyne miejsce, gdzie spotykają się dwa pobrania.
Wznawianie po awarii
Awarie się zdarzają. Wdrożenie restartuje workera, laptop przechodzi w tryb uśpienia, VPN się łączy i pętla umiera na stronie 31 z 50.
Zapisuj stronę po każdym wywołaniu
Persistuj ostatnią ukończoną liczbę stron po każdym wywołaniu. Uruchom ponownie od tej liczby plus jeden, a nie od początku, i zapłacisz 2 kredyty za stronę zamiast ponownie kupować całe pobranie.
Zapisz go po sparsowaniu odpowiedzi, a nie przed. Stronę, której nie udało się odczytać, należy pobrać ponownie, a zapisany numer strony musi zawsze oznaczać wiersze, które posiadasz.
Zapis, który odbywa się raz na minutę zamiast przy każdym wywołaniu, pozostawia okno, w którym awaria może powtórzyć wydatek kredytów. Zapisuj małe, aby było tanio wykonywać go przy każdym razem.
Zaloguj również czas trwania każdego zapisu oraz czas każdego wywołania. Zapis, który dorównuje czasowo wywołaniu, wskazuje na warstwę magazynową, co warto naprawić przed wzrostem pętli.
Upsert po kluczu domenowym
Zachowaj zapis idempotentny. Upsertuj każdy wiersz po kluczu domenowym, aby strona pobrana dwukrotnie pozostawiła jeden wiersz, a nie dwa.
Używaj tego samego klucza w każdej ścieżce zapisu, w tym w skrypcie naprawczym ręcznym. Dwie ścieżki zapisu z dwoma kluczami to sposób, w jaki duplikaty przetrwają wznawianie.
Skrypt naprawczy jest często pisany w pośpiechu po nieudanym uruchomieniu. Wtedy wkrada się drugi klucz, więc przeglądaj go tak starannie jak główną pętlę.
Odrzuć wznawianie, gdy zmieniło się sortowanie
Zaloguj sortowanie i order wraz z numerem strony. Jeśli ktoś zmieni sort między awarią a restartem, zapisany numer strony nie oznacza już tego samego fragmentu. Odrzuć wznawianie i zacznij od czysta.
Przechowuj mały rekord wznawiania z sortowaniem, order, stroną i czasem. Pętla odczytuje ten rekord jako pierwszy i odmawia kontynuacji, jeśli któreś pole nie pasuje już do żądania, które ma zostać wykonane.
Odrzucone wznawianie nie jest błędem. To pętla mówiąca, że zapisana strona nie oznacza już tych samych wierszy, a rozpoczęcie od czysta to tańszy błąd.
Uruchamianie pętli w produkcji
- 1
Zacznij od małej domeny
Uruchom pętlę dla domeny z kilkuset wierszami, aby zadziałało zatrzymanie przy krótkiej stronie i zobaczyłeś, jak działa ścieżka wyjścia.
- 2
Sprawdź jedną stronę okiem
Otwórz jedną zapisaną odpowiedź i potwierdź, że accessor nadal odczytuje wiersze. Nie ufaj parsowaniu, którego nie widziałeś.
- 3
Zachowaj limity w konfiguracji
Umieść limit i rozmiar strony w jednym pliku konfiguracyjnym, aby zmiana pojawiła się w recenzji i nie ukrywała się wewnątrz funkcji.
- 4
Zaloguj powód zakończenia pętli
Zapisz, czy uruchomienie zakończyło się na krótkiej stronie, na suficie czy na błędzie. Te trzy zakończenia oznaczają różne rzeczy dla tego, kto czyta logi.