Lewati ke konten

Data backlink dalam format JSON: kredit gratis $100, tanpa kartu, masuk dengan Google.

SEOMasters.dev
SEOMasters.devDaftar

Telusuri pemeriksa backlink URL tanpa celah atau loop tak terbatas

Baris per panggilan, halaman per kueri, dan batas keras di 50.000. Berikut adalah loop yang menghormati ketiga hal tersebut dan memberi tahu Anda kapan harus berhenti.

Jembatan batu lengkung tak berujung melintasi sungai berkabut tanpa celah
Tiga angka yang perlu diingat

Hingga 1.000 baris dikembalikan per panggilan. Setiap panggilan ditagih sekali, berapa pun jumlah barisnya. Paginasi dalam dibatasi hingga 50.000 baris, yang setara dengan 50 panggilan dengan 1.000 baris masing-masing.

Mengapa pengurutan dilakukan sebelum paginasi

Paginasi atas daftar yang tidak diurutkan adalah penyebab kemunculan duplikat. Selalu kirimkan sort dan order bersama dengan page dan per, agar halaman 3 memiliki arti yang sama pada setiap permintaan dalam satu sesi.

Penarikan refdomains memakan biaya 2 kredit per panggilan, sehingga 50 panggilan menjadi 100 kredit, atau satu sen. Bahkan kasus terburuk pun murah; biaya sebenarnya adalah loop yang tidak berhenti.

Memilih kolom pengurutan

Kolom mana yang diurutkan bergantung pada pertanyaan. Urutan terbesar di awal adalah pilihan umum untuk audit, karena batas tersebut memotong ekor panjang alih-alih bagian yang Anda pedulikan.

Urutkan berdasarkan bidang yang tidak relevan dengan pertanyaan Anda, dan pemotongan dapat menghapus baris yang Anda inginkan. Tarik sepuluh baris dengan setiap kandidat pengurutan terlebih dahulu dan lihat irisan mana yang bertahan dari batas tersebut.

Tulis pilihan tersebut ke dalam laporan, agar orang berikutnya tahu mengapa pemotongan terjadi di posisi tersebut.

Catatan yang bergerak selama sesi berjalan

Data tidak bergerak selama sesi berjalan kecuali pembaruan bulanan terjadi di tengahnya. Jarang terjadi, tetapi nyata. Pekerjaan malam hari yang melintasi awal bulan dapat mengembalikan satu halaman dari indeks lama dan halaman berikutnya dari indeks baru, jadi catat waktu awal di log Anda dan bandingkan.

Tulis waktu awal di bagian atas log dan nomor halaman di setiap baris. Kemudian, ketidaksesuaian dalam output menunjukkan masalah waktu, bukan bug parsing.

Jika pekerjaan dijadwalkan, hindari waktu awal tepat sebelum pembaruan yang mungkin terjadi. Log Anda menunjukkan pembaruan sebagai pergeseran total antara dua sesi yang secara lain cocok, jadi pertahankan total di setiap baris log.

Sesi yang melintasi pembaruan tidak salah secara default. Sesi tersebut hanya tidak konsisten, jadi tandai sesi tersebut di log dan jalankan ulang irisan yang terpengaruh jika penting untuk laporan.

Loop paginasi yang berhenti

TypeScript untuk pekerja Node 20. Loop berhenti pada halaman pendek pertama, pada batas, atau pada ok yang tidak benar.

ts
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;
}

Pemecahan masalah sesi paginasi

Apa yang Anda lihatKemungkinan alasanApa yang harus dilakukan
Halaman 51 kembali kosong atau errorAnda mencapai batas 50.000Sempitkan dengan tindakan lain atau sort berbeda, lalu gabungkan berdasarkan id
Domain yang sama muncul di dua halamanKueri tidak diurutkan, atau indeks diperbarui di tengah sesiKirimkan sort dan order; hapus duplikat berdasarkan kunci domain
Baris lebih sedikit dari total di dasborTotal tersebut adalah untuk seluruh grafik, penarikan dibatasiTampilkan "top 50.000" di UI
Loop tidak pernah berakhirPengecekan kondisi hanya memeriksa rows.lengthPutus pada halaman pendek, seperti di atas
Tagihan lebih tinggi dari yang diharapkanCoba ulang pada setiap respons non-200Coba ulang hanya pada kesalahan jaringan, lihat errors
Tukang kebun memeriksa bibit unik di rumah kaca yang disinari matahari

Membaca baris tanpa menebak nama bidang

Fitur findRows di atas sengaja dibiarkan terbuka. Lakukan satu panggilan nyata, lihat JSON-nya, dan tulis aksesornya berdasarkan apa yang Anda lihat, bukan apa yang dijanjikan tutorial.

Untuk sepupu yang lebih murah dari pekerjaan ini, yaitu menilai banyak domain sekaligus tanpa paginasi sama sekali, baca skrip DR massal.

Bekukan satu respons sebagai fixture

Lalu bekukan dengan tes. Simpan satu respons sebagai file fixture dan assert pada jumlah baris dan kunci baris pertama, agar perubahan di masa depan gagal di CI dan bukan di grafik pelanggan.

Simpan fixture dalam kontrol versi di sebelah tes, agar reviewer melihat bentuk yang diharapkan kode tanpa menjalankan apa pun.

Ketika API menambahkan bidang di kemudian hari, perbedaan fixture memberi tahu Anda apakah akses Anda memperhatikannya atau mengabaikannya secara diam-diam.

Beri nama fixture berdasarkan kueri asalnya, seperti tindakan, domain, dan pengurutan. File bernama response1.json tidak memberi tahu pembaca berikutnya apa pun tentang apa yang dibuktikannya.

Hitung baris yang Anda simpan

Bandingkan baris yang Anda simpan dengan total yang dilaporkan loop. Celah berarti halaman terlewat, dan pengulangan berarti halaman diambil dua kali dan di-upsert menjadi satu baris.

Jalankan pemeriksaan ini setelah setiap penarikan tes, bukan hanya setelah yang pertama. Drift dalam hitungan biasanya merupakan gejala pertama dari pengurutan yang berubah atau pembaruan yang terjadi di tengah sesi.

Simpan hitungan di baris log yang sama dengan nomor halaman, agar keduanya dapat dibaca bersama sekilas.

Membagi pekerjaan di atas batas

Beberapa pertanyaan melampaui batas. Untuk daftar di atas batas, pecahkan masalahnya daripada mempaginasi lebih keras. Tarik 50.000 teratas dengan satu pengurutan, lalu minta tindakan lain tentang pemain utama, karena itu juga memakan biaya 2 kredit dan menjawab pertanyaan berbeda. Paginasi lebih keras tidak pernah melewati batas.

Tarik 50.000 teratas dengan satu pengurutan

Anggap batas sebagai fakta API. Tarik 50.000 baris teratas dengan satu pengurutan, simpan, dan beri label hasil sebagai irisan teratas dalam laporan apa pun.

Dasbor yang menampilkan hitungan terbatas seolah-olah itu adalah total keseluruhan menyesatkan orang yang membacanya. Labelnya tidak memakan biaya apa pun, dan laporan pemeriksa url backlink akan lebih jujur dengan label tersebut.

Tentukan ukuran irisan sebelum sesi berjalan dan tulis di header laporan, agar angka tidak pernah terlihat lebih besar dari aslinya. Baris header tidak memakan biaya apa pun, dan pembaca yang menemukan baris yang hilang nanti akan berterima kasih kepada Anda.

Ajukan pertanyaan berbeda kepada pemain utama

anchors dan toppages menjawab pertanyaan lain, seperti teks anchor mana yang mendominasi atau halaman mana yang menarik tautan. Untuk domain yang melampaui batas, jawaban tersebut bisa lebih penting daripada halaman berikutnya dari daftar yang sama.

Simpan hasilnya di tabel terpisah, dikunci berdasarkan domain, agar penarikan domain yang sama di kemudian hari dapat menggantinya tanpa menyentuh baris irisan teratas.

Setiap tindakan tambahan memakan biaya kreditnya sendiri, jadi hargai sebelum sesi berjalan, bukan setelah tagihan tiba.

Daftar pendek domain terberat, yang ditarik sebulan sekali, sering memberikan konteks yang lebih berguna daripada daftar panjang yang ditarik setiap malam.

Gabungkan berdasarkan kunci domain

Ketika dua penarikan tumpang tindih, gabungkan berdasarkan kunci domain dan pertahankan timestamp yang lebih baru. Penggabungan kemudian tidak bergantung pada penarikan mana yang selesai terlebih dahulu.

Log penarikan mana yang menang untuk setiap baris. Jika angka bergerak antara dua laporan, log tersebut memberi tahu Anda apakah indeks atau penggabungan yang berubah.

Simpan penggabungan dalam satu fungsi dengan tes, karena itu adalah satu-satunya tempat di mana dua penarian bertemu.

Melanjutkan setelah crash

Crash terjadi. Deployment memulai ulang pekerja, laptop tidur, VPN putus, dan loop mati di halaman 31 dari 50.

Simpan halaman setelah setiap panggilan

Persist nomor halaman terakhir yang selesai setelah setiap panggilan. Mulai ulang dari nomor tersebut ditambah satu, bukan dari awal, dan Anda membayar 2 kredit per halaman alih-alih membeli ulang penarikan keseluruhan.

Simpan setelah respons diparsing, bukan sebelum. Halaman yang gagal Anda baca harus diambil lagi, dan nomor halaman yang disimpan harus selalu berarti baris yang Anda miliki.

Penyimpanan yang terjadi sekali per menit alih-alih sekali per panggilan meninggalkan jendela di mana crash dapat mengulang pengeluaran kredit. Simpan tulisannya kecil, agar murah untuk dilakukan setiap kali.

Log berapa lama setiap penyimpanan berlangsung serta berapa lama setiap panggilan berlangsung. Penyimpanan yang bersaing dengan panggilan itu sendiri menunjukkan lapisan penyimpanan, dan itu layak diperbaiki sebelum loop berkembang.

Upsert berdasarkan kunci domain

Pertahankan penulisan idempoten. Upsert setiap baris berdasarkan kunci domainnya, agar halaman yang diambil dua kali meninggalkan satu baris, bukan dua.

Gunakan kunci yang sama di setiap jalur penulisan, termasuk skrip perbaikan manual. Dua jalur penulisan dengan dua kunci adalah bagaimana duplikat bertahan setelah resume.

Skrip perbaikan sering ditulis terburu-buru, setelah sesi gagal. Saat itulah kunci kedua menyusup, jadi tinjau dengan hati-hati seperti loop utama.

Tolak resume ketika pengurutan berubah

Log pengurutan dan pesanan bersama dengan nomor halaman. Jika seseorang mengubah sort antara crash dan restart, nomor halaman yang disimpan tidak lagi berarti irisan yang sama. Tolak resume dan mulai dari awal.

Simpan catatan resume kecil dengan pengurutan, pesanan, halaman, dan waktu. Loop membaca catatan tersebut terlebih dahulu, dan menolak untuk melanjutkan jika ada bidang yang tidak lagi cocok dengan permintaan yang akan dibuatnya.

Resume yang ditolak bukan kegagalan. Itu adalah loop yang mengatakan halaman yang disimpan tidak lagi berarti baris yang sama, dan memulai dari awal adalah kesalahan yang lebih murah.

Menjalankan loop di produksi

  1. 1

    Mulai dengan domain kecil

    Jalankan loop terhadap domain dengan beberapa ratus baris, agar berhenti halaman pendek memicu dan Anda melihat jalur keluar bekerja.

  2. 2

    Periksa satu halaman secara manual

    Buka satu respons yang disimpan dan konfirmasi bahwa aksesornya masih membaca baris. Jangan percaya parsing yang belum Anda lihat.

  3. 3

    Simpan batas dalam konfigurasi

    Letakkan batas dan ukuran halaman dalam satu file konfigurasi, agar perubahan muncul dalam tinjauan dan tidak tersembunyi di dalam fungsi.

  4. 4

    Log alasan loop berakhir

    Catat apakah sesi berakhir pada halaman pendek, pada batas, atau pada error. Tiga akhir tersebut berarti hal berbeda bagi siapa pun yang membaca log.