स्क्रैपिंग के लिए रोटेटिंग प्रॉक्सी: सेटअप और जाल
रोटेटिंग प्रॉक्सी उस IP पते को बदलती है जहां से आपका ट्रैफ़िक निकलता है, या तो हर रिक्वेस्ट पर या एक तय अंतराल के बाद। यह वेब स्क्रैपिंग के सबसे आम उपकरणों में से एक है, और सबसे ज़्यादा गलत तरीके से इस्तेमाल होने वाले उपकरणों में से भी। बहुत कम रोटेट करें तो एक ही पता रेट-लिमिट हो जाता है। बहुत ज़्यादा रोटेट करें तो ट्रैफ़िक किसी विज़िटर जैसा बिल्कुल नहीं दिखता। यह गाइड दो रोटेशन मॉडल समझाती है, मृत प्रॉक्सी के लिए retries वाला काम करने वाला Python सेटअप दिखाती है, और बताती है कि प्रॉक्सी फ़ील्ड कैप्चा सॉल्विंग में कैसे फिट होता है।
रोटेटिंग बनाम स्टिकी सेशन
रोटेटिंग प्रॉक्सी सेवा पते बांटने के दो तरीके अपनाती है:
- प्रति-रिक्वेस्ट रोटेशन। हर रिक्वेस्ट को एक नया एग्ज़िट पता मिलता है। यह असंबंधित कई पेजों के बड़े क्रॉल के लिए ठीक है, जहां किसी पेज को पिछले पेज की ज़रूरत नहीं।
- स्टिकी सेशन। एक पता तय समय के लिए रखा जाता है, अक्सर कुछ मिनट, या जब तक आप उसे छोड़ें नहीं। यह उस किसी भी चीज़ के लिए ठीक है जिसे स्टेट चाहिए: लॉगिन, शॉपिंग कार्ट, या पेजिनेटेड सूची जहां कुकीज़ मायने रखती हैं।
एक असली विज़िटर पूरी विज़िट के लिए एक पता रखता है। स्टिकी सेशन उस व्यवहार की नकल करते हैं, इसलिए जब साइट कुकीज़ या सेशन इस्तेमाल करती है तो वे आम तौर पर बेहतर डिफ़ॉल्ट होते हैं। स्टेटलेस क्रॉलिंग के लिए प्रति-रिक्वेस्ट रोटेशन इस्तेमाल करें।
Python में एक बुनियादी रोटेटिंग पूल
नीचे का उदाहरण प्रॉक्सी URL का एक पूल रखता है, उनमें बारी-बारी से घूमता है, और एक के विफल होने पर आगे बढ़ जाता है। क्रेडेंशियल environment variables में रखें, सोर्स कोड में कभी नहीं।
import itertools
import os
import requests
# प्रॉक्सी URL environment से आते हैं, उदाहरण के लिए:
# PROXY_POOL="http://user:pass@203.0.113.10:8080,http://user:pass@203.0.113.11:8080"
PROXIES = [p.strip() for p in os.environ.get("PROXY_POOL", "").split(",") if p.strip()]
rotation = itertools.cycle(PROXIES)
def fetch(url: str, max_tries: int = 3) -> requests.Response:
last_error = None
for _ in range(max_tries):
proxy = next(rotation)
try:
r = requests.get(
url,
proxies={"http": proxy, "https": proxy},
timeout=30,
)
if r.status_code == 407: # प्रॉक्सी प्रमाणीकरण विफल
raise requests.RequestException("proxy auth rejected")
return r
except requests.RequestException as exc:
last_error = exc # मृत या धीमी प्रॉक्सी: अगली आज़माएं
raise RuntimeError(f"all attempts failed for {url}: {last_error}")
यहां दो बातें मायने रखती हैं। पहली, मृत प्रॉक्सी को उसी पते पर नहीं, किसी दूसरे पते पर रिट्राई करना चाहिए। दूसरी, प्रमाणीकरण एरर से विफल होने वाली रिक्वेस्ट को रुककर रिपोर्ट होना चाहिए, न कि पूरे पूल को खर्च कर देना चाहिए।
प्रॉक्सी की स्थिति पर नज़र रखें
सादा राउंड रॉबिन ऐसी प्रॉक्सी को ट्रैफ़िक भेजता रहता है जो विफल होने लगी है। हर पते के लिए एक सरल स्कोर रखें: हाल की विफलताएं गिनें, और सीमा पार होने पर पते को कुछ समय के cool-down के लिए पूल से हटा दें। बाद में उसे वापस लाएं और दोबारा देखें। फिर आपका स्क्रैपर अपनी रिक्वेस्ट पूल के स्वस्थ हिस्से पर खर्च करता है।
हर नतीजे के साथ इस्तेमाल की गई प्रॉक्सी लॉग करें। जब कोई साइट ब्लॉक लौटाने लगे, तो आप जानना चाहेंगे कि ज़िम्मेदार एक पता है, एक क्षेत्र है, या पूरा पूल।
पूल की गति तय करें
रोटेशन लोड को पतों में बांटता है, पर हर पते की भी एक दर होती है। हर पते के लिए प्रति-पता देरी और पूरे पूल में प्रति सेकंड रिक्वेस्ट की वैश्विक सीमा तय करें। रोटेशन ज़्यादा ट्रैफ़िक भेजने का लाइसेंस नहीं है। यह एक तरीका है जिससे एक पते का ट्रैफ़िक उचित सीमा में रहे।
आम गलतियां
ज़्यादातर रोटेशन समस्याएं कुछ आदतों से आती हैं। लॉगिन या चेकआउट फ़्लो के बीच पता बदलने से सेशन टूटता है और साइट को शक होता है। 429 रिस्पॉन्स साइट की रेट लिमिट है, टूटी हुई प्रॉक्सी नहीं, इसलिए नए पते पर जाकर तुरंत रिट्राई करने से समस्या बस फैलती है। हर रिक्वेस्ट पर पता बदलना और वही कुकीज़ रखना भी असंगत है, क्योंकि कुकीज़ एक अलग विज़िटर को जारी हुई थीं। और आखिर में, जिस पूल की कभी जांच न हो, वह चुपचाप मृत पतों से भर जाता है, और आपकी एरर दर बिना साफ़ कारण के बढ़ जाती है। पूल की समय-समय पर जांच करें और जो विफल हो उसे हटाएं।
प्रॉक्सी और कैप्चा सॉल्विंग
कुछ कैप्चा टास्क उस प्रॉक्सी का उपयोग कर सकते हैं जो आपका स्क्रैपर करता है। आप उसे वैकल्पिक proxy फ़ील्ड में देते हैं, http://user:pass@host:port के फ़ॉर्मेट में, और सॉल्व उसी नेटवर्क पथ से होता है जिससे आपकी पेज रिक्वेस्ट जाती है। Proxyless टास्क इस फ़ील्ड को पूरी तरह छोड़ देते हैं। कौन सा चुनना है, यह इस पर निर्भर है कि साइट कैप्चा को नेटवर्क पते से बांधती है या नहीं, और इस व्यापार-विनिमय को प्रॉक्सी बनाम प्रॉक्सीलेस कैप्चा में समझाया गया है।
दो व्यावहारिक बातें:
- जब साइट पता जांचती हो, तो पेज रिक्वेस्ट और कैप्चा सॉल्व दोनों के लिए एक ही प्रॉक्सी इस्तेमाल करें। पते मिलाने से टोकन विफल हो सकता है।
- टोकन जल्दी समाप्त होते हैं। फॉर्म सबमिट करने से ठीक पहले टोकन मांगें, बहुत पहले नहीं। देखें कैप्चा टोकन की समाप्ति।
Scarnox पर आज का लाइव कैप्चा टाइप PopularCaptcha है। PopularCaptcha Python गाइड रिक्वेस्ट और लौटे टोकन को सबमिट करने का तरीका दिखाती है।
अपनी प्रॉक्सी चुनना
आप जिस प्रकार के पते रोटेट करते हैं, वह रोटेशन जितना ही मायने रखता है। डेटासेंटर पते तेज़ और प्रति रिक्वेस्ट सस्ते होते हैं, पर अक्सर कम स्कोर होते हैं। रेज़िडेंशियल पते बेहतर स्कोर करते हैं और धीमे होते हैं। रेज़िडेंशियल बनाम डेटासेंटर प्रॉक्सी गाइड उनकी गहराई से तुलना करती है, और वहां की सलाह यहां आप जो पूल बनाते हैं उस पर भी लागू होती है।
ज़िम्मेदारी से स्क्रैप करें
- आप जिन साइटों को स्क्रैप करते हैं उनकी
robots.txtऔर शर्तें पढ़ें। - प्रॉक्सी का उपयोग वैध ट्रैफ़िक बांटने के लिए करें, उस प्रतिबंध को पार करने के लिए नहीं जो मालिक ने लगाया है।
- केवल ऐसी प्रॉक्सी सेवाएं इस्तेमाल करें जिनके पते सहमति से हासिल किए गए हों। ऐसे लोगों के उपकरणों से ट्रैफ़िक रूट करना स्वीकार्य नहीं है जिन्होंने इसकी सहमति नहीं दी।
- क्रेडेंशियल कोड और लॉग से बाहर रखें।
अगले कदम
- रेज़िडेंशियल बनाम डेटासेंटर प्रॉक्सी
- बिना ब्लॉक हुए स्क्रैप करें
- प्रॉक्सी बनाम प्रॉक्सीलेस कैप्चा
- उत्पादन में टिकने वाले retries और एरर हैंडलिंग
मुफ्त ट्रायल क्रेडिट के साथ शुरू करें, कार्ड की ज़रूरत नहीं: खाता बनाएं और अपनी प्रॉक्सी के साथ PopularCaptcha फ्लो आज़माएं। मौजूदा दरों के लिए प्राइसिंग पेज देखें।