Skip to content
Advanced / 7 min read

Cara Membangun Rotator Proxy Rank Tracker dengan Proxy Residensial IPRoyal dan Python

Panduan berbasis kode untuk mengarahkan rank tracker Python melalui proxy SOCKS5 residensial IPRoyal, dengan penargetan negara, sesi lengket, batas konkurensi, dan penanganan percobaan ulang untuk pemeriksaan SERP per negara yang andal.

SOCKS5 HTTP(S) Web Scraping Pemantauan SEO

Ringkasan

Rank tracker melakukan satu hal berulang kali: menanyakan mesin pencari dari lokasi tertentu dan mencatat di mana domain muncul. Pola itu cepat rusak tanpa proxy. Mesin pencari melokalkan hasil berdasarkan IP peminta, dan mereka membatasi atau memblokir IP yang menanyakan mereka dalam volume besar.

Tutorial ini menunjukkan cara menjalankan rank tracker Python melalui proxy residensial IPRoyal melalui SOCKS5: membangun URL proxy, menjaga sesi tetap lengket saat Anda membutuhkan penomoran halaman, merotasi saat tidak, dan menangani kegagalan yang akan Anda lihat di produksi.

IPRoyal menawarkan proxy residensial, ISP, dan pusat data melalui HTTP, SOCKS5, dan terowongan gaya Shadowsocks, mengiklankan kumpulan 32M+ IP, dan menagih lalu lintas residensial dengan sistem bayar sesuai pemakaian dengan paket bulanan tetap tersedia pada beberapa produk. Host gateway, port, nama pengguna, dan kata sandi ada di dasbor IPRoyal Anda.

Jenis proxy mana yang cocok untuk rank tracking?

Jenis proxy Terbaik untuk rank tracking Kelebihan/kekurangan
Residensial (rotasi) SERP tingkat negara dan kota; kumpulan 32M+ yang besar menyebarkan volume permintaan Respons lebih lambat; IP keluar berubah antar permintaan
ISP (residensial statis) Pemeriksaan yang dapat diulang dari alamat yang sama Jejak lokasi lebih kecil daripada residensial
Pusat data Pekerjaan ringan bervolume tinggi yang bukan scraping SERP Cepat dan murah, tetapi mudah di-fingerprint oleh mesin pencari

Rotasi vs sesi lengket

  • Rotasi setiap permintaan ketika Anda hanya membutuhkan satu halaman hasil per kata kunci.
  • Pertahankan sesi lengket (beberapa menit hingga sekitar 30 menit) ketika Anda mengikuti penomoran halaman, memperluas blok pertanyaan terkait, atau membutuhkan IP keluar yang sama untuk urutan permintaan.
  • Targetkan negara yang cocok dengan lokal yang Anda laporkan. Pemeriksaan peringkat de-DE melalui IP keluar AS bukanlah pemeriksaan peringkat Jerman.

Penargetan sesi dan negara dikendalikan melalui nama pengguna proxy atau subdomain gateway. Salin pola yang tepat dari dasbor IPRoyal Anda daripada menebak; kode di bawah ini menggunakan placeholder -session- dan -country- yang umum terlihat.

Prasyarat

  • Python 3.9 atau lebih baru
  • Ekstra SOCKS untuk Requests: pip install "requests[socks]"
  • Host gateway, port, nama pengguna, dan kata sandi IPRoyal dari dasbor Anda
  • File kata kunci dengan satu baris per kata kunci: kueri, kode negara, dan lokal

Langkah-langkah

  1. Ekspor kredensial Anda sehingga tidak pernah berada di file sumber.
export IPROYAL_HOST="gateway-host-from-dashboard"
export IPROYAL_PORT="gateway-port-from-dashboard"
export IPROYAL_USER="your-username"
export IPROYAL_PASS="your-password"

Di Windows PowerShell, gunakan $env:IPROYAL_HOST = "..." sebagai gantinya.

  1. Bangun URL proxy per permintaan, dengan penargetan negara dan sesi opsional. Gunakan skema socks5h sehingga DNS diselesaikan di proxy, bukan di mesin Anda.
import os
import random
import string
import time

import requests

PROXY_HOST = os.environ['IPROYAL_HOST']
PROXY_PORT = os.environ['IPROYAL_PORT']
PROXY_USER = os.environ['IPROYAL_USER']
PROXY_PASS = os.environ['IPROYAL_PASS']

LOCALE_HEADERS = {
    'en-US': {'Accept-Language': 'en-US,en;q=0.9'},
    'de-DE': {'Accept-Language': 'de-DE,de;q=0.9'},
    'ja-JP': {'Accept-Language': 'ja-JP,ja;q=0.9'},
}


def new_session_id() -> str:
    """Token pendek dan unik yang digunakan untuk menyematkan sesi lengket."""
    return ''.join(random.choices(string.ascii_lowercase + string.digits, k=8))


def proxy_url(country: str, session_id: str | None = None) -> str:
    user = PROXY_USER
    if session_id:
        user = f'{user}-session-{session_id}'
    if country:
        user = f'{user}-country-{country.lower()}'
    return f'socks5h://{user}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}'
  1. Bungkus permintaan dalam percobaan ulang dengan backoff eksponensial. Satu pemeriksaan yang gagal tidak boleh membatalkan proses 2.000 kata kunci.
def fetch_serp(query: str, country: str, locale: str,
               session_id: str | None = None, attempts: int = 3) -> str | None:
    proxy = proxy_url(country, session_id)
    proxies = {'http': proxy, 'https': proxy}
    headers = {
        'User-Agent': 'Mozilla/5.0 (compatible; RankTracker/1.0)',
        **LOCALE_HEADERS.get(locale, {}),
    }

    for attempt in range(1, attempts + 1):
        try:
            response = requests.get(
                'https://your-permitted-search-endpoint/search',
                params={'q': query, 'hl': locale},
                proxies=proxies,
                headers=headers,
                timeout=30,
            )
            response.raise_for_status()
            return response.text
        except requests.RequestException as exc:
            print(f'attempt {attempt} failed for {query!r}: {exc}')
            time.sleep(2 ** attempt)

    return None

Arahkan URL ke antarmuka pencarian yang diizinkan untuk Anda kueri, seperti API resmi atau sumber data yang Anda izinkan sendiri. Scraping mesin pencari dapat melanggar ketentuan layanannya, jadi konfirmasi sebelum Anda menskalakan alur kerja.

  1. Tetapkan satu sesi lengket per kata kunci sehingga penomoran halaman dan permintaan lanjutan menggunakan kembali IP keluar yang sama.
def check_keyword(row: dict) -> dict:
    session_id = new_session_id()
    html = fetch_serp(row['query'], row['country'], row['locale'], session_id=session_id)
    return {
        'query': row['query'],
        'country': row['country'],
        'position': rank_position(html, row['domain']) if html else None,
        'status': 'ok' if html else 'failed',
    }
  1. Ekstrak posisi dengan parser yang sudah Anda gunakan.
def rank_position(html: str | None, domain: str) -> int | None:
    if not html:
        return None
    # Parse dengan lxml, selectolax, atau BeautifulSoup, cocokkan URL hasil
    # dengan `domain`, dan kembalikan indeks berbasis 1 dari kecocokan pertama.
    ...
  1. Batasi konkurensi. Kumpulan residensial besar tetapi tidak terbatas, dan menghantam endpoint dari banyak IP sekaligus adalah rute tercepat untuk diblokir.
from concurrent.futures import ThreadPoolExecutor


def run_batch(keywords: list[dict], workers: int = 8) -> list[dict]:
    with ThreadPoolExecutor(max_workers=workers) as pool:
        return list(pool.map(check_keyword, keywords))
  • Mulai dengan 5-8 pekerja dan naikkan jumlahnya hanya selama tingkat keberhasilan Anda tetap di atas sekitar 95%.
  • Tambahkan jitter acak kecil di antara percobaan ulang agar percobaan ulang tidak tiba secara bersamaan.
  1. Simpan HTML mentah untuk jangka waktu singkat sehingga Anda dapat mengurai ulang riwayat tanpa melakukan scraping lagi.
import json
from pathlib import Path


def save_result(result: dict) -> None:
    out = Path('rank-results')
    out.mkdir(exist_ok=True)
    name = result['query'][:40].replace('/', '_')
    with (out / f'{name}.json').open('w', encoding='utf-8') as handle:
        json.dump(result, handle, ensure_ascii=False)
  1. Jadwalkan proses dan catat konfigurasi proxy mana yang menghasilkan setiap hasil. Ketika peringkat berubah, Anda ingin tahu apakah SERP berubah atau proxinya.
# Contoh entri cron: jalankan tracker pada 06:00 dan 18:00 waktu lokal
0 6,18 * * * cd /srv/rank-tracker && /usr/bin/python3 track.py >> logs/rank.log 2>&1

Pemecahan Masalah

  • 407 Proxy Authentication Required: nama pengguna atau kata sandi salah, atau karakter khusus dalam kata sandi tidak dikodekan. Lakukan percent-encode pada @, :, /, dan # sebelum menempatkan kata sandi di URL.
  • Missing dependencies for SOCKS support: Requests membutuhkan ekstra SOCKS. Jalankan pip install "requests[socks]" di lingkungan virtual yang sama dengan skrip Anda.
  • Hasil menunjukkan negara yang salah: penargetan negara adalah bagian dari nama pengguna proxy. Cetak proxy_url(...) untuk satu kata kunci dan konfirmasi kode negara yang diharapkan muncul sebelum menyalahkan mesin pencari.
  • Setiap permintaan menggunakan IP yang sama: Anda menggunakan kembali ID sesi. Hilangkan komponen sesi untuk membiarkan penyedia merotasi.
  • Seluruh negara tiba-tiba diblokir: turunkan konkurensi untuk negara itu, rotasi lebih agresif, dan periksa apakah endpoint mulai mengembalikan halaman persetujuan atau captcha alih-alih hasil.
  • Lebih lambat dari yang diharapkan: perutean residensial menambah latensi. Naikkan timeout menjadi 30-45 detik untuk proxy residensial atau ISP dan simpan proxy pusat data untuk pekerjaan non-SERP.

Ringkasan

Rank tracking berhasil atau gagal pada kebersihan proxy. Gunakan proxy residensial atau ISP IPRoyal dengan skema socks5h untuk DNS jarak jauh, sematkan sesi per kata kunci ketika Anda membutuhkan kontinuitas, rotasi ketika tidak, dan batasi konkurensi agar kumpulan tetap berfungsi. Dengan percobaan ulang, penyimpanan respons mentah, dan log proxy yang digunakan, Anda dapat membedakan perubahan peringkat nyata dari artefak proxy.