प्रॉक्सी गलत डेटा लौटाता है: कारण और समाधान
आपने पार्सर सेट किया, डेटा एकत्र करना शुरू किया, लेकिन परिणाम यह है: दूसरे क्षेत्र की कीमतें, पुरानी सामग्री, या पूरी तरह से एक अलग पेज। आइए समझते हैं कि प्रॉक्सी गलत डेटा क्यों लौटा सकता है और इसे कैसे ठीक किया जाए।
1. प्रॉक्सी साइड पर कैशिंग
पुरानी जानकारी का सबसे आम कारण कैशिंग है। कुछ प्रॉक्सी सर्वर लोड कम करने और गति बढ़ाने के लिए वेबसाइटों के उत्तरों को सहेज लेते हैं। नतीजतन, आपको वर्तमान डेटा के बजाय एक सप्ताह पुराना डेटा मिलता है।
समस्या को कैसे पहचानें
- दोहराए गए अनुरोधों पर डेटा नहीं बदलता है
- कीमतें या उत्पादों की उपलब्धता वास्तविकता से मेल नहीं खाती है
- उत्तर में
Ageहेडर एक बड़ा मान दिखाता है
समाधान
कैशिंग को रोकने वाले हेडर जोड़ें:
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
)
यदि प्रदाता अभी भी कैश कर रहा है, तो URL में एक यादृच्छिक पैरामीटर जोड़ें:
import time
url = f'https://example.com/prices?_nocache={int(time.time())}'
2. जियोलोकेशन का बेमेल होना
आप जर्मनी से प्रॉक्सी का अनुरोध कर रहे हैं, लेकिन रूबल में कीमतें प्राप्त कर रहे हैं। या इसके विपरीत - आपको रूसी डेटा की आवश्यकता है, लेकिन साइट यूएसए के लिए सामग्री दिखाती है। यह कई कारणों से होता है।
जियोलोकेशन क्यों मेल नहीं खाता है
| कारण | विवरण |
|---|---|
| पुरानी GeoIP डेटाबेस | आईपी हाल ही में किसी अन्य क्षेत्र में चला गया है, लेकिन डेटाबेस अभी तक अपडेट नहीं हुए हैं |
| साइट अपना डेटाबेस उपयोग करती है | लक्ष्य साइट जियोलोकेशन को प्रॉक्सी प्रदाता से अलग तरीके से निर्धारित करती है |
| पिछली सत्र की कुकीज़ | साइट ने पिछले विज़िट से आपके क्षेत्र को याद रखा है |
| Accept-Language | भाषा हेडर प्रॉक्सी के जियो से मेल नहीं खाता है |
समाधान
अनुरोध के सभी मापदंडों को वांछित जियोलोकेशन के साथ सिंक्रनाइज़ करें:
# जर्मन साइट को पार्स करने के लिए
headers = {
'Accept-Language': 'de-DE,de;q=0.9,en;q=0.8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...'
}
# कुकीज़ के बिना एक साफ़ सत्र
session = requests.Session()
session.cookies.clear()
response = session.get(
'https://example.de/preise',
proxies={'http': german_proxy, 'https': german_proxy},
headers=headers
)
पार्सिंग से पहले प्रॉक्सी के वास्तविक जियोलोकेशन की जाँच करें:
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. आईपी रोटेशन में समस्याएँ
स्वचालित आईपी रोटेशन के साथ रेजिडेंशियल प्रॉक्सी का उपयोग करते समय, आईपी हर अनुरोध के बीच बदल जाता है। यह सीमाओं को बायपास करने के लिए उपयोगी है, लेकिन डेटा की स्थिरता की आवश्यकता होने पर समस्याएं पैदा करता है।
विशिष्ट लक्षण
- पेजिनेशन डुप्लिकेट लौटाता है या आइटम छोड़ देता है
- कार्ट अनुरोधों के बीच साफ़ हो जाती है
- सत्र के बीच प्रमाणीकरण खो जाता है
- A/B परीक्षण साइटों के विभिन्न संस्करण दिखाता है
समाधान: स्टिकी सत्र
अधिकांश प्रॉक्सी प्रदाता "स्टिकी सेशन" का समर्थन करते हैं - आईपी एक निश्चित समय के लिए बनाए रखा जाता है। आमतौर पर यह कनेक्शन स्ट्रिंग में एक पैरामीटर के माध्यम से कॉन्फ़िगर किया जाता है:
# सेशन आईडी के साथ प्रारूप का उदाहरण (सिंटैक्स प्रदाता पर निर्भर करता है)
proxy = 'http://user-session-abc123:pass@gate.provider.com:7777'
# एक ही सेशन आईडी के साथ सभी अनुरोध एक ही आईपी से जाएंगे
for page in range(1, 10):
response = requests.get(
f'https://example.com/catalog?page={page}',
proxies={'http': proxy, 'https': proxy}
)
महत्वपूर्ण: स्टिकी सेशन आमतौर पर 1-30 मिनट तक रहता है। डेटा संग्रह की योजना इस तरह बनाएं कि संबंधित अनुरोध इस विंडो के भीतर फिट हों।
4. सत्रों और कुकीज़ का उल्लंघन
आधुनिक वेबसाइटें वैयक्तिकरण के लिए कुकीज़ का सक्रिय रूप से उपयोग करती हैं। यदि आपका पार्सर उन्हें ठीक से नहीं संभालता है, तो आपको गलत डेटा मिलेगा - या पूरी तरह से ब्लॉक कर दिया जाएगा।
सामान्य त्रुटियाँ
- Set-Cookie को अनदेखा करना - साइट सत्र को ट्रैक नहीं कर सकती है
- दूसरे आईपी के साथ कुकीज़ का पुन: उपयोग - संदिग्ध व्यवहार
- प्रारंभिक अनुरोध की अनुपस्थिति - मुख्य पृष्ठ के माध्यम से "लॉग इन" किए बिना सीधे आंतरिक पृष्ठ पर जाना
सही दृष्टिकोण
import requests
def create_browser_session(proxy):
session = requests.Session()
session.proxies = {'http': proxy, 'https': proxy}
# पहले विज़िट का अनुकरण करें - कुकीज़ प्राप्त करें
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'
})
# अब एक वैध सत्र के साथ पार्सिंग कर सकते हैं
return session
session = create_browser_session(proxy)
data = session.get('https://example.com/api/prices').json()
5. एन्कोडिंग और संपीड़न त्रुटियाँ
कभी-कभी डेटा सही आता है, लेकिन एन्कोडिंग या संपीड़न समस्याओं के कारण गलत तरीके से प्रदर्शित होता है। यह सिरिलिक और एशियाई भाषाओं के साथ काम करते समय विशेष रूप से प्रासंगिक है।
लक्षण
- पाठ के बजाय अजीब वर्ण:
Ценаके बजाय "Цена" - gzip चालू होने पर खाली उत्तर
- HTML के बजाय बाइनरी कचरा
समाधान
import requests
response = requests.get(url, proxies=proxies)
# तरीका 1: एन्कोडिंग का स्वचालित पता लगाना
response.encoding = response.apparent_encoding
text = response.text
# तरीका 2: एन्कोडिंग को जबरन सेट करना
text = response.content.decode('utf-8')
# तरीका 3: संपीड़न को अक्षम करना (यदि प्रॉक्सी gzip को तोड़ता है)
headers = {'Accept-Encoding': 'identity'}
response = requests.get(url, proxies=proxies, headers=headers)
6. छिपी हुई रुकावटें और कैप्चा
सभी रुकावटें स्पष्ट नहीं होती हैं। साइट HTTP 200 लौटा सकती है, लेकिन वास्तविक डेटा के बजाय एक प्लेसहोल्डर, पुराना कैश, या सामान्य HTML के अंदर एक कैप्चा पेज डाल सकती है।
छिपी हुई रुकावट के संकेत
- उत्तर का आकार संदिग्ध रूप से छोटा या विभिन्न पृष्ठों के लिए समान है
- HTML में शब्द हैं: captcha, challenge, blocked, access denied
- अपेक्षित तत्व (कीमतें, विवरण, बटन) गायब हैं
- JavaScript रीडायरेक्ट किसी अन्य पृष्ठ पर
उत्तर का सत्यापन
def is_valid_response(response, expected_markers):
"""जांचता है कि उत्तर में वास्तविक डेटा है या नहीं"""
text = response.text.lower()
# रुकावट की जाँच
block_signals = ['captcha', 'blocked', 'access denied',
'rate limit', 'try again later']
for signal in block_signals:
if signal in text:
return False, f'Blocked: {signal}'
# अपेक्षित डेटा की उपस्थिति की जाँच
for marker in expected_markers:
if marker.lower() not in text:
return False, f'Missing: {marker}'
# आकार की जाँच (बहुत छोटा = प्लेसहोल्डर)
if len(response.content) < 5000:
return False, 'Response too small'
return True, 'OK'
# उपयोग
valid, reason = is_valid_response(response, ['price', 'add to cart'])
if not valid:
print(f'Invalid response: {reason}')
# प्रॉक्सी बदलें, प्रतीक्षा करें, पुनः प्रयास करें
गंभीर बॉट सुरक्षा वाली साइटों के लिए, मोबाइल प्रॉक्सी डेटासेंटर प्रॉक्सी की तुलना में उच्च विश्वास स्तर दिखाते हैं।
7. चरण-दर-चरण निदान
जब प्रॉक्सी गलत डेटा लौटाता है, तो कारण खोजने के लिए इस एल्गोरिथम का उपयोग करें:
चरण 1: समस्या को अलग करें
# प्रॉक्सी के बिना बनाम प्रॉक्सी के साथ उत्तरों की तुलना करें
def compare_responses(url, proxy):
direct = requests.get(url)
proxied = requests.get(url, proxies={'http': proxy, 'https': proxy})
print(f'Direct: {len(direct.content)} bytes, status {direct.status_code}')
print(f'Proxied: {len(proxied.content)} bytes, status {proxied.status_code}')
# तुलना के लिए दोनों उत्तर सहेजें
with open('direct.html', 'w') as f:
f.write(direct.text)
with open('proxied.html', 'w') as f:
f.write(proxied.text)
चरण 2: उत्तर हेडर की जाँच करें
response = requests.get(url, proxies=proxies)
# निदान के लिए मुख्य हेडर
important_headers = ['content-type', 'content-encoding',
'cache-control', 'age', 'x-cache',
'cf-ray', 'server']
for header in important_headers:
value = response.headers.get(header, 'not set')
print(f'{header}: {value}')
चरण 3: जाँच सूची
| जाँच | कमांड/विधि |
|---|---|
| प्रॉक्सी का वास्तविक आईपी | curl -x proxy:port ifconfig.me |
| आईपी का जियोलोकेशन | ip-api.com/json |
| कैशिंग | Age, X-Cache हेडर |
| रुकावट | HTML में 'captcha', 'blocked' खोजना |
| एन्कोडिंग | Content-Type charset |
चरण 4: पूर्ण निदान स्क्रिप्ट
import requests
import json
def diagnose_proxy(proxy, target_url):
report = {}
# 1. कार्यक्षमता की जाँच
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. जियोलोकेशन
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. लक्ष्य साइट पर अनुरोध
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. रुकावट की जाँच
block_words = ['captcha', 'blocked', 'denied', 'cloudflare']
report['possibly_blocked'] = any(w in r.text.lower() for w in block_words)
return report
# उपयोग
result = diagnose_proxy('http://user:pass@proxy:port', 'https://target-site.com')
print(json.dumps(result, indent=2))
निष्कर्ष
प्रॉक्सी से गलत डेटा मिलना लगभग हमेशा हल करने योग्य समस्या होती है। अधिकांश मामलों में, कारण कैशिंग, जियोलोकेशन का बेमेल होना, या सत्रों के साथ गलत तरीके से काम करना होता है। समस्या के स्रोत को तेज़ी से खोजने के लिए इस लेख से निदान स्क्रिप्ट का उपयोग करें।
उन कार्यों के लिए जहाँ जियोलोकेशन की सटीकता और कम रुकावट दर महत्वपूर्ण है, स्टिकी सेशन के साथ रेजिडेंशियल प्रॉक्सी सबसे अच्छे हैं - अधिक जानकारी proxycove.com पर देखें।