Kembali ke blog

Penyebab dan Solusi Data Proxy yang Dikembalikan Salah

Menganalisis penyebab umum proxy mengembalikan data salah: mulai dari *caching* hingga masalah geolokasi. Solusi praktis untuk setiap kasus.

📅12 Desember 2025
```html

Proxy Mengembalikan Data yang Salah: Penyebab dan Solusi

Anda telah menyiapkan parser, memulai pengumpulan data, tetapi hasilnya adalah harga dari wilayah lain, konten yang sudah usang, atau bahkan halaman orang lain. Mari kita bahas mengapa proxy dapat mengembalikan data yang salah dan bagaimana cara memperbaikinya.

1. Caching di Sisi Proxy

Penyebab paling umum data usang adalah caching. Beberapa server proxy menyimpan respons situs web untuk mengurangi beban dan mempercepat operasi. Akibatnya, Anda menerima data berusia seminggu alih-alih data terkini.

Cara Mengenali Masalah

  • Data tidak berubah pada permintaan berulang
  • Harga atau ketersediaan produk tidak sesuai dengan kenyataan
  • Header Age dalam respons menunjukkan nilai yang besar

Solusi

Tambahkan header yang melarang caching:

import requests

headers = {
    'Cache-Control': 'no-cache, no-store, must-revalidate',
    'Pragma': 'no-cache',
    'Expires': '0'
}

response = requests.get(
    'https://example.com/prices',
    proxies={'http': proxy, 'https': proxy},
    headers=headers
)

Jika penyedia masih melakukan caching — tambahkan parameter acak ke URL:

import time

url = f'https://example.com/prices?_nocache={int(time.time())}'

2. Ketidaksesuaian Geolokasi

Anda meminta proxy dari Jerman, tetapi menerima harga dalam rubel. Atau sebaliknya — Anda memerlukan data Rusia, tetapi situs menampilkan konten untuk AS. Ini terjadi karena beberapa alasan.

Mengapa Geolokasi Tidak Cocok

Penyebab Deskripsi
Basis data GeoIP usang IP baru saja pindah ke wilayah lain, tetapi basis data belum diperbarui
Situs menggunakan basis datanya sendiri Situs target menentukan geografi secara berbeda dari penyedia proxy
Cookie dari sesi sebelumnya Situs mengingat wilayah Anda dari kunjungan sebelumnya
Accept-Language Header bahasa tidak sesuai dengan geografi proxy

Solusi

Sinkronkan semua parameter permintaan dengan geolokasi yang diinginkan:

# Untuk parsing situs Jerman
headers = {
    'Accept-Language': 'de-DE,de;q=0.9,en;q=0.8',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...'
}

# Sesi bersih tanpa cookie
session = requests.Session()
session.cookies.clear()

response = session.get(
    'https://example.de/preise',
    proxies={'http': german_proxy, 'https': german_proxy},
    headers=headers
)

Sebelum melakukan parsing, periksa geolokasi IP yang sebenarnya:

def check_proxy_geo(proxy):
    response = requests.get(
        'http://ip-api.com/json/',
        proxies={'http': proxy, 'https': proxy},
        timeout=10
    )
    data = response.json()
    return data.get('country'), data.get('city')

3. Masalah dengan Rotasi IP

Saat menggunakan proxy residensial dengan rotasi IP otomatis, IP berubah di antara permintaan. Ini berguna untuk menghindari batasan, tetapi menimbulkan masalah ketika konsistensi data diperlukan.

Gejala Umum

  • Paginasi mengembalikan duplikat atau melewatkan item
  • Keranjang belanja dibersihkan di antara permintaan
  • Otentikasi terputus di tengah sesi
  • Pengujian A/B situs web menampilkan versi halaman yang berbeda

Solusi: Sesi Lengket (Sticky Sessions)

Sebagian besar penyedia proxy mendukung "sesi lengket" — IP dipertahankan untuk jangka waktu tertentu. Biasanya ini dikonfigurasi melalui parameter dalam string koneksi:

# Contoh format dengan ID sesi (sintaks tergantung pada penyedia)
proxy = 'http://user-session-abc123:pass@gate.provider.com:7777'

# Semua permintaan dengan ID sesi yang sama akan melalui IP yang sama
for page in range(1, 10):
    response = requests.get(
        f'https://example.com/catalog?page={page}',
        proxies={'http': proxy, 'https': proxy}
    )

Penting: Sesi lengket biasanya bertahan 1-30 menit. Rencanakan pengumpulan data Anda sehingga permintaan terkait berada dalam jendela waktu ini.

4. Gangguan Sesi dan Cookie

Situs modern sangat bergantung pada cookie untuk personalisasi. Jika parser Anda tidak menanganinya dengan benar, Anda akan menerima data yang salah — atau bahkan diblokir.

Kesalahan Umum

  1. Mengabaikan Set-Cookie — situs tidak dapat melacak sesi
  2. Menggunakan kembali cookie dengan IP yang berbeda — perilaku yang mencurigakan
  3. Tidak adanya permintaan awal — langsung mengakses halaman internal tanpa "masuk" melalui halaman utama

Pendekatan yang Benar

import requests

def create_browser_session(proxy):
    session = requests.Session()
    session.proxies = {'http': proxy, 'https': proxy}
    
    # Mensimulasikan kunjungan pertama — mendapatkan cookie
    session.get('https://example.com/', headers={
        'User-Agent': 'Mozilla/5.0...',
        'Accept': 'text/html,application/xhtml+xml...',
        'Accept-Language': 'en-US,en;q=0.9'
    })
    
    # Sekarang dapat melakukan parsing dengan sesi yang valid
    return session

session = create_browser_session(proxy)
data = session.get('https://example.com/api/prices').json()

5. Kesalahan Pengkodean dan Kompresi

Terkadang data yang diterima benar, tetapi ditampilkan secara tidak benar karena masalah pengkodean atau kompresi. Ini sangat relevan saat bekerja dengan aksara Kiril atau bahasa Asia.

Gejala

  • Karakter aneh alih-alih teks: Цена alih-alih «Цена»
  • Respons kosong saat gzip diaktifkan
  • Sampah biner alih-alih HTML

Solusi

import requests

response = requests.get(url, proxies=proxies)

# Cara 1: Deteksi otomatis pengkodean
response.encoding = response.apparent_encoding
text = response.text

# Cara 2: Memaksa pengkodean
text = response.content.decode('utf-8')

# Cara 3: Menonaktifkan kompresi (jika proxy merusak gzip)
headers = {'Accept-Encoding': 'identity'}
response = requests.get(url, proxies=proxies, headers=headers)

6. Pemblokiran Tersembunyi dan Captcha

Tidak semua pemblokiran terlihat jelas. Situs mungkin mengembalikan HTTP 200, tetapi menyisipkan halaman pengganti, cache usang, atau halaman captcha di dalam HTML biasa.

Tanda Pemblokiran Tersembunyi

  • Ukuran respons terlalu kecil atau sama untuk halaman yang berbeda
  • Kata-kata: captcha, challenge, blocked, access denied ada di dalam HTML
  • Elemen yang diharapkan hilang (harga, deskripsi, tombol)
  • Pengalihan (redirect) JavaScript ke halaman lain

Validasi Respons

def is_valid_response(response, expected_markers):
    """Memeriksa apakah respons berisi data asli"""
    
    text = response.text.lower()
    
    # Pemeriksaan tanda pemblokiran
    block_signals = ['captcha', 'blocked', 'access denied', 
                     'rate limit', 'try again later']
    for signal in block_signals:
        if signal in text:
            return False, f'Diblokir: {signal}'
    
    # Pemeriksaan keberadaan data yang diharapkan
    for marker in expected_markers:
        if marker.lower() not in text:
            return False, f'Hilang: {marker}'
    
    # Pemeriksaan ukuran (terlalu kecil = halaman pengganti)
    if len(response.content) < 5000:
        return False, 'Respons terlalu kecil'
    
    return True, 'OK'

# Penggunaan
valid, reason = is_valid_response(response, ['price', 'add to cart'])
if not valid:
    print(f'Respons tidak valid: {reason}')
    # Ganti proxy, tunggu, coba lagi

Untuk situs dengan perlindungan anti-bot yang serius, proxy seluler menunjukkan tingkat kepercayaan yang lebih baik daripada pusat data.

7. Diagnosis Langkah demi Langkah

Ketika proxy mengembalikan data yang salah, gunakan algoritma ini untuk mencari penyebabnya:

Langkah 1: Isolasi Masalah

# Bandingkan respons: tanpa proxy vs dengan proxy
def compare_responses(url, proxy):
    direct = requests.get(url)
    proxied = requests.get(url, proxies={'http': proxy, 'https': proxy})
    
    print(f'Langsung:  {len(direct.content)} byte, status {direct.status_code}')
    print(f'Proxy: {len(proxied.content)} byte, status {proxied.status_code}')
    
    # Simpan kedua respons untuk perbandingan
    with open('direct.html', 'w') as f:
        f.write(direct.text)
    with open('proxied.html', 'w') as f:
        f.write(proxied.text)

Langkah 2: Periksa Header Respons

response = requests.get(url, proxies=proxies)

# Header penting untuk diagnosis
important_headers = ['content-type', 'content-encoding', 
                     'cache-control', 'age', 'x-cache', 
                     'cf-ray', 'server']

for header in important_headers:
    value = response.headers.get(header, 'tidak diatur')
    print(f'{header}: {value}')

Langkah 3: Daftar Periksa

Pemeriksaan Perintah/Metode
IP Proxy yang sebenarnya curl -x proxy:port ifconfig.me
Geolokasi IP ip-api.com/json
Caching Header Age, X-Cache
Pemblokiran Pencarian "captcha", "blocked" di HTML
Pengkodean Content-Type charset

Langkah 4: Skrip Diagnosis Lengkap

import requests
import json

def diagnose_proxy(proxy, target_url):
    report = {}
    
    # 1. Pemeriksaan fungsionalitas
    try:
        r = requests.get('http://httpbin.org/ip', 
                        proxies={'http': proxy, 'https': proxy},
                        timeout=15)
        report['proxy_ip'] = r.json().get('origin')
        report['proxy_works'] = True
    except Exception as e:
        report['proxy_works'] = False
        report['error'] = str(e)
        return report
    
    # 2. Geolokasi
    r = requests.get('http://ip-api.com/json/',
                    proxies={'http': proxy, 'https': proxy})
    geo = r.json()
    report['country'] = geo.get('country')
    report['city'] = geo.get('city')
    
    # 3. Permintaan ke situs target
    r = requests.get(target_url,
                    proxies={'http': proxy, 'https': proxy},
                    timeout=30)
    report['status_code'] = r.status_code
    report['content_length'] = len(r.content)
    report['cached'] = 'age' in r.headers or 'x-cache' in r.headers
    
    # 4. Pemeriksaan pemblokiran
    block_words = ['captcha', 'blocked', 'denied', 'cloudflare']
    report['possibly_blocked'] = any(w in r.text.lower() for w in block_words)
    
    return report

# Penggunaan
result = diagnose_proxy('http://user:pass@proxy:port', 'https://target-site.com')
print(json.dumps(result, indent=2))

Kesimpulan

Data yang salah dari proxy hampir selalu merupakan masalah yang dapat dipecahkan. Dalam kebanyakan kasus, penyebabnya adalah caching, ketidaksesuaian geolokasi, atau penanganan sesi yang salah. Gunakan skrip diagnostik dalam artikel ini untuk dengan cepat menemukan sumber masalah.

Untuk tugas-tugas di mana akurasi geolokasi dan persentase pemblokiran yang rendah sangat penting, proxy residensial dengan dukungan sesi lengket adalah yang paling optimal — pelajari lebih lanjut di proxycove.com.

```