Resep

Pencari backlink dalam Python: daftar prospek dalam empat puluh baris

Temukan domain yang menautkan ke kompetitor Anda tetapi tidak ke Anda, beri skor dalam satu panggilan, dan urutkan CSV. Contoh kerja dengan angka hipotetis ada di bawah ini.

Meja bengkel dengan alat drafting dan benang merah yang menghubungkan titik-titik di atas kertas

Logika sebelum kode

Tiga panggilan menyelesaikan tugas. intersect menerima dua hingga sepuluh domain dan mengembalikan domain yang menautkan ke beberapa di antaranya. refdomains pada situs Anda sendiri memberikan himpunan yang akan dikurangi. bulk_dr kemudian memberi skor pada sisa domain.

Biaya per eksekusi sangat kecil, dan perhitungan ini layak dilakukan sekali. Dua kredit untuk intersect, dua untuk daftar Anda sendiri, dan satu untuk memberi skor hingga 2.000 domain. Lima kredit senilai $0,0005.

Urutan penting. Kurangi sebelum memberi skor.

Orang sering memberi skor semuanya terlebih dahulu dan memfilter kemudian. Itu terbalik. Memberi skor biayanya kecil, tetapi membuang banyak waktu ketika CSV memiliki lima puluh ribu baris. Potong daftar berdasarkan tumpang tindih terlebih dahulu, minta DR pada kandidat yang tersisa, dan simpan semuanya dalam kamus biasa agar eksekusi berikutnya dapat menggunakan hasil kemarin.

prospects.py

Domain dalam RIVALS adalah placeholder. Nama field dibaca dengan .get, jadi periksa satu baris mentah dari eksekusi Anda sendiri sebelum mengandalkan kolom tertentu.

python
import csv, json, os, urllib.request as u, urllib.parse as p
KEY = os.environ['LZ_KEY']
ME = 'mysite.example'
RIVALS = ['rival-a.example', 'rival-b.example', 'rival-c.example']
def get(**kw):
    q = p.urlencode(kw)
    with u.urlopen(f'https://linkzoid.pro/api.php?{q}&key={KEY}', timeout=30) as r:
        d = json.load(r)
    if not d['ok']:
        raise SystemExit(d)
    return d
gap = get(action='intersect', q=','.join(RIVALS), per=1000)['rows']
mine = {r.get('domain') for r in get(action='refdomains', q=ME, per=1000)['rows']}
fresh = [r.get('domain') for r in gap if r.get('domain') not in mine]
scores = get(action='bulk_dr', domains=','.join(fresh[:2000]))['rows']
with open('prospects.csv', 'w', newline='') as f:
    wr = csv.writer(f)
    for row in scores:
        wr.writerow([row.get('domain'), row.get('dr')])
print(len(fresh), 'candidates')

Contoh kerja, angka hipotetis

Eksekusi fiktif untuk blog niche kecil; hasil Anda akan berbeda
LangkahBaris keluarKredit
intersect dari 3 kompetitor640 domain2
Dikurangi domain penunjuk milik Anda sendiriSisa 4102
bulk_dr pada 410 domain410 diberi skor1
Pertahankan DR 20 dan di atasnyasekitar 1200
Periksa manual 30 teratas30 halaman dibuka0

Dari CSV ke outreach, tanpa spam

01

Urutkan berdasarkan tumpang tindih

Domain yang menautkan ke dua atau tiga kompetitor Anda adalah kandidat yang memiliki alasan topical untuk menautkan ke Anda. Letakkan di urutan pertama.

02

Buka tiga puluh secara manual

Lihat halaman yang menautkan ke kompetitor. Apakah itu daftar sumber daya, ulasan, atau berita? Hanya sebagian yang menerima entri baru.

03

Tulis satu baris alasan

Sebutkan apa yang halaman Anda tambahkan yang tidak dimiliki halaman kompetitor. Jika Anda tidak bisa mengatakannya dalam satu kalimat, lewati situs tersebut.

04

Catat apa yang Anda kirim

Tambahkan kolom untuk tanggal, kontak, dan hasil ke CSV yang sama, dan commit. Kuartal depan Anda akan berterima kasih pada diri sendiri.

Kesalahan dan perbaikan

Skrip prospeksi sering gagal di beberapa tempat yang sama
KesalahanMengapa ini merugikanPerbaikan
Mengurutkan hanya berdasarkan DRDirektori besar dan scraper muncul di urutan teratasUrutkan berdasarkan jumlah tumpang tindih terlebih dahulu, DR kedua
Mengirim ke semua di atas ambang batasTerlihat seperti spam, menguras goodwillBuka 30 teratas secara manual
URL-encoding secara manualKoma dan miring membebani queryGunakan urllib.parse.urlencode
Mengirim 3.000 domain dalam satu panggilanMelebihi batas 2.000Potong daftar, satu kredit per potongan
Mempercayai DR sebagai kualitasIni adalah hitungan skala log dari domain penunjukAnggap sebagai kunci urut, bukan vonis
Dua semak kecil dan satu pohon ek besar yang berbagi sinar matahari di taman

Memilih kompetitor yang berbagi pembaca Anda

Kompetitor menentukan apa yang dikembalikan oleh intersect. Pencari backlink hanya sebaik daftar yang Anda berikan. Tiga kompetitor langsung untuk pembaca yang sama memberikan tumpang tindih yang bersih, sementara penerbit besar yang merangkum segala hal memberikan ribuan tautan yang tidak mengatakan apa-apa tentang halaman Anda.

Misalkan Anda menjalankan blog kecil tentang perbaikan sepeda. Kompetitor Anda mungkin adalah dua blog perbaikan dan satu toko dengan bagian panduan yang kuat. Itu adalah set yang bagus. Tambahkan outlet nasional dan daftar akan dipenuhi halaman yang tidak akan pernah menautkan ke blog sepeda.

Dua hingga sepuluh domain adalah jendela yang diterima endpoint, jadi pilih set di dalamnya. Pertahankan daftar cukup pendek sehingga Anda dapat menyebut setiap kompetitor dari memori. Daftar pendek lebih mudah dipertahankan.

Mengapa hub raksasa mencemari set

Direktori dan agregator menautkan ke hampir semuanya. Mereka muncul di setiap intersect dan mengubur segelintir domain yang menautkan keluar karena minat nyata. Baca bagian atas daftar yang diurutkan sebelum mempercayainya.

File pengecualian sederhana memperbaiki sebagian besar masalah ini. Simpan domain yang tidak pernah Anda inginkan dalam satu file teks, satu per baris. Muat ke dalam set dan buang kecocokan sebelum panggilan scoring, sehingga kredit hanya digunakan untuk kandidat yang layak dibaca.

Memisahkan kompetitor dan situs Anda sendiri

Domain Anda sendiri seharusnya tidak menjadi kompetitor. Ini terdengar jelas, tetapi daftar yang disalin dari proyek lama sering kali membawanya bersama, dan kemudian intersect melaporkan tautan Anda sendiri kembali ke Anda.

Letakkan kompetitor dalam kamus konfigurasi di bagian atas skrip, dengan komentar mengapa masing-masing ada di sana. Bulan depan Anda akan mengingat alasannya, dan orang asing yang membaca repo juga akan begitu.

Membaca baris mentah sebelum memfilter

Kode membaca setiap field dengan .get, yang mencegah kunci yang hilang membuat eksekusi gagal. Ini juga menyembunyikan kunci yang salah. Cetak satu baris dari intersect sebelum menulis filter apa pun, dan lihat nama field serta tipe setiap nilai.

Skor yang tiba sebagai teks akan diurutkan sebagai teks, sehingga 9 muncul setelah 80. Konversi ke angka sekali, tepat setelah panggilan, dan sisa skrip dapat tetap sederhana.

Normalisasi domain sebelum membandingkan

Situs yang sama dapat muncul dengan awalan www. di satu daftar dan tanpa awalan di daftar lain. Huruf kecilkan semuanya dan hapus awalan sebelum membandingkan himpunan. Jika tidak, situs Anda sendiri bisa terlihat sebagai kandidat baru.

Miring di akhir dan spasi liar dari daftar yang disalin menyebabkan masalah yang sama. Fungsi pembersihan satu baris biayanya lebih murah daripada satu panggilan scoring yang sia-sia.

Simpan salinan ber-tanggal dari setiap eksekusi

Tulis setiap eksekusi ke file ber-tanggal, dan simpan yang sebelumnya. Anda kemudian dapat membedakan kandidat baru dari yang sudah Anda lihat, dan melihat kapan kompetitor mulai menautkan ke tempat baru.

File ber-tanggal juga merupakan cara termudah untuk mendebug hasil aneh. Buka dua file berdampingan dan perubahannya biasanya jelas.

Beri skor hanya pada yang bertahan

Panggilan massal menerima hingga 2.000 domain dengan satu kredit. Berikan kandidat hasil pengurangan, bukan seluruh intersect. Dalam contoh fiktif di atas, 640 baris dan 410 baris sama-sama memakan biaya skor dalam satu panggilan, tetapi daftar yang lebih kecil jauh lebih mudah dibaca.

Timbangan batu dengan timbangan kuningan dan batu kasar di piring terpisah

Pertanyaan sebelum menjalankan pencari

Sebagian besar pertanyaan yang diajukan orang kepada bagian ini dari pekerjaan ini berpusat pada biaya, pengurutan, dan apa yang terjadi ketika panggilan gagal.

Apakah daftar prospeksi mahal untuk dibuat?

Tidak banyak. Resep menggunakan intersect, refdomains, dan bulk_dr, sehingga lima kredit per eksekusi pada ukuran yang ditunjukkan, yaitu $0,0005. Eksekusi ulang bulan depan biayanya sama. Waktu Anda sendiri, dihabiskan untuk membaca halaman, adalah biaya sebenarnya.

Mengapa tidak mengurutkan intersect berdasarkan DR dan berhenti di situ?

DR menghitung domain penunjuk dalam skala log. Direktori besar muncul di urutan teratas terlepas dari relevansinya, jadi urutkan berdasarkan tumpang tindih terlebih dahulu dan gunakan DR sebagai pemecah seri, bukan kunci utama.

Bisakah saya mengirim outreach ke semua yang ada di CSV?

Bisa, tetapi itu penggunaan daftar yang buruk. Buka halaman yang menautkan ke kompetitor, putuskan apakah entri baru cocok, dan baru kemudian tulis. CSV adalah daftar pendek, bukan daftar surat.

Berapa banyak kompetitor yang harus saya mulai?

Tiga adalah awal yang baik, dalam rentang dua hingga sepuluh yang diterima intersect. Tambahkan lebih banyak hanya jika eksekusi pertama mengembalikan terlalu sedikit baris untuk diperingkatkan.

Bagaimana jika domain saya sendiri belum memiliki domain penunjuk?

Maka pengurangan tidak menghapus apa pun, dan setiap baris intersect menjadi kandidat. Itu benar, tetapi daftarnya akan panjang. Potong berdasarkan tumpang tindih dan baca 30 teratas secara manual.

Apakah skrip memerlukan kunci berbayar?

Ya. Panggilan intersect, refdomains, dan bulk_dr dihargai berdasarkan kredit. Tindakan ringkasan gratis tidak memerlukan kunci, dan kredit pendaftaran $100 mencakup banyak eksekusi sebesar ini.

Sebelum pesan tunggal dikirim

  • Buka halaman kandidat dan konfirmasi bahwa itu menautkan ke kompetitor, bukan hanya ke daftar tautan.
  • Periksa apakah halaman tersebut cocok untuk pembaca Anda, bukan hanya kata kunci Anda.
  • Hapus domain yang sudah Anda hubungi, dan catat tanggal di sebelahnya.
  • Tulis satu kalimat tentang apa yang halaman Anda tambahkan, atau buang kandidat.
  • Kirim dalam batch kecil, agar balasan dapat benar-benar dibaca.

Menjalankan pencari secara terjadwal

Daftar prospeksi menjadi usang lebih lambat dari yang diharapkan kebanyakan orang. Bulanan sudah cukup. Tautan baru dari kompetitor muncul dengan penyegaran bulanan, sehingga eksekusi setiap beberapa minggu menangkap sebagian besar dari mereka. Eksekusi mingguan sebagian besar menghasilkan ulang file minggu lalu, itulah mengapa pencari backlink yang sama dapat berjalan tanpa pengawasan tanpa banyak kebisingan.

Irama yang masuk akal adalah bulanan untuk scoring dan melihat sekilas baris teratas setelah setiap eksekusi. Pertahankan langkah pengurangan dalam tugas yang sama, sehingga daftar tidak pernah mencakup apa yang sudah Anda miliki.

Jauhkan kunci dari file

Skrip membaca kunci dari lingkungan, sehingga tidak pernah berada di repo. Tetapkan LZ_KEY sebagai rahasia di scheduler Anda, atau ekspor dari file yang tetap di luar git.

Baris crontab dapat memanggil skrip yang sama dengan variabel yang ditetapkan di depannya. Periksa apakah file yang memegang kunci memiliki izin ketat di server.

Gagal sebelum menulis CSV

401 atau 402 harus menghentikan eksekusi, begitu juga flag ok yang bernilai false. Kode menaikkan pengecualian sebelum file dibuka, sehingga eksekusi yang gagal tidak pernah menimpa CSV kemarin dengan yang parsial.

Catat pengeluaran dengan setiap eksekusi

Setiap respons membawa _credits, sehingga cetak saldo di akhir pekerjaan. Selama beberapa bulan, baris itu memberi tahu Anda apakah jadwal biayanya sesuai rencana, dan apakah loop telah mulai mengambil ulang halaman.

Pasang dengan SQLite diff jika Anda ingin riwayatnya dalam basis data alih-alih folder file.

Sebuah kata tentang apa yang bisa dan tidak bisa dikatakan DR

DR di sini adalah round(100 kali log(ref_domains + 1) dibagi log(20.000.000, 2)). Ini naik dengan domain penunjuk dan tidak ada yang lain. Ingatlah itu. Situs bisa berada di 55 dan masih tidak berguna bagi Anda.

Gunakan untuk peringkat, lalu baca. Lihat apa yang diterbitkan situs tersebut, apakah itu menautkan ke seratus toko yang tidak terkait, dan apakah ada yang berubah baru-baru ini. Pemeriksaan itu memakan waktu satu menit per situs, dan tidak ada skrip yang menggantikannya.

Setelah daftar bersih, simpan sebagai file ber-tanggal dan jalankan ulang sebulan sekali. Buku panduan Actions menunjukkan cara menjadwalkannya, dan perbandingan n8n mencakup rute tanpa kode jika orang outreach Anda lebih menyukainya.

Catatan tingkat dan ukuran

Setiap panggilan mengembalikan hingga 1.000 baris dan ditagih sekali, sehingga paging melalui 5.000 baris intersect memakan biaya 10 kredit, atau $0,001. Pagination mendalam berhenti di 50.000 baris. Gunakan sort dan order=desc di server daripada mengurutkan daftar besar di Python setelahnya.