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
Agedalam 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
- Mengabaikan Set-Cookie — situs tidak dapat melacak sesi
- Menggunakan kembali cookie dengan IP yang berbeda — perilaku yang mencurigakan
- 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.