Python गाइड · 2 मिनट पढ़ें

Python अनुरोधों और प्रॉक्सी के साथ वेब स्क्रैपिंग

एक व्यावहारिक स्क्रैपिंग वर्कफ़्लो जो अनुरोधों और BeautifulSoup पर आधारित है, एक प्रमाणित प्रॉक्सी के माध्यम से रूट किया गया है ताकि आपकी मूल IP छिपी रहे और आपका क्रॉलर दर सीमाओं को सहन कर सके। पूर्ण चलाने योग्य कोड शामिल है।

एक स्क्रैपर एक सत्र है, न कि प्राप्तियों का लूप

एक स्क्रैपर जो दस मिनट के लिए काम करता है और एक जो घंटों तक चलता है, के बीच का अंतर लगभग कभी भी पार्सिंग नहीं होता — यह इस पर निर्भर करता है कि आप अनुरोध कैसे करते हैं। एक नासमझ for url in urls: requests.get(url) हर बार एक नया TCP कनेक्शन खोलता है, कोई वास्तविक हेडर नहीं भेजता, कोई कुकीज़ नहीं रखता, और एक IP से लक्ष्य पर लगातार हमला करता है जब तक कि उसे एक 429 या एक ब्लॉक नहीं मिल जाता।

समाधान एक requests.Session और एक प्रॉक्सी है। एक सत्र कनेक्शनों को पूल करता है और कुकीज़ को बनाए रखता है, इसलिए पृष्ठों का एक झोंका तेज़ होता है और एक सुसंगत क्लाइंट की तरह दिखता है। एक authenticated proxy आपके असली पते को एक डेटा सेंटर के निकास से बदल देता है, इसलिए साइट कभी भी आपके मूल IP को नहीं देखती और एक ही ब्लॉक किया गया पता पूरे काम को समाप्त नहीं करता। s4m प्रॉक्सीज़ पोर्ट 1080 पर SOCKS5 और पोर्ट 3128 पर HTTP बोलते हैं, दोनों को USER:PASS के साथ प्रमाणित किया गया है — उपयोग करें socks5h:// ताकि DNS दूरस्थ रूप से हल किया जा सके और होस्टनाम कभी लीक न हो। फेंकने योग्य प्रयोगों के लिए, free public proxy list एक अलग, अपने जोखिम पर उपयोग करने वाला पूल है।

एक मजबूत अनुरोध स्क्रैपर

सत्र, यथार्थवादी हेडर, बैकऑफ़ के साथ पुनः प्रयास, प्रॉक्सी रोटेशन और BeautifulSoup पार्सिंग एक फ़ाइल में। USER:PASS को अपने क्रेडेंशियल्स से बदलें।

python
import random
import time
import requests
from bs4 import BeautifulSoup
from requests.exceptions import RequestException

USER, PASS, HOST = "USER", "PASS", "proxy.s4m.online"
POOL = [
    f"socks5h://{USER}:{PASS}@{HOST}:1080",  # needs requests[socks]
    f"http://{USER}:{PASS}@{HOST}:3128",
]

HEADERS = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36",
    "Accept-Language": "en-US,en;q=0.9",
}

def make_session(proxy):
    s = requests.Session()
    s.headers.update(HEADERS)
    s.proxies = {"http": proxy, "https": proxy}
    return s

def fetch(url, retries=4):
    for attempt in range(1, retries + 1):
        proxy = random.choice(POOL)
        try:
            s = make_session(proxy)
            r = s.get(url, timeout=(5, 20))
            if r.status_code == 429:
                raise RequestException("rate limited")
            r.raise_for_status()
            return r
        except RequestException as e:
            wait = 2 ** attempt + random.random()  # exponential backoff
            print(f"[{attempt}/{retries}] {proxy} -> {e}; sleeping {wait:.1f}s")
            time.sleep(wait)
    raise SystemExit(f"giving up on {url}")

html = fetch("https://quotes.toscrape.com/").text
soup = BeautifulSoup(html, "html.parser")
for q in soup.select(".quote"):
    text = q.select_one(".text").get_text(strip=True)
    who = q.select_one(".author").get_text(strip=True)
    print(f"{who}: {text}")

एक क्रॉलर को जीवित रखने के लिए क्या आवश्यक है

चार आदतें जो आपके द्वारा चुने गए पार्सर से अधिक महत्वपूर्ण हैं।

एक वास्तविक User-Agent भेजें

डिफ़ॉल्ट python-requests UA एक तात्कालिक झंडा है। सामान्य ब्राउज़र यूजर-एजेंट और एक Accept-Language हेडर सेट करें ताकि अनुरोध सामान्य ट्रैफ़िक के साथ मिश्रित हो जाएं।

पीछे हटें, अंधाधुंध पुनः प्रयास न करें

429 या टाइमआउट पर, पुनः प्रयास करने से पहले एक्सपोनेंशियल बैकऑफ और जिटर के साथ सोएं। तंग पुनः प्रयास लूप केवल ब्लॉक को गहरा करते हैं और प्रॉक्सी ट्रैफ़िक को जलाते हैं।

निकासी को घुमाएँ, केवल पुनः प्रयास नहीं

हर प्रयास पर एक पूल से एक ताजा प्रॉक्सी चुनें ताकि एक फ्लैग किया गया IP काम को रोक न सके। मीटर किए गए डेटा सेंटर प्रॉक्सी इसे स्केल करने के लिए सस्ता बनाते हैं।

लक्ष्य का सम्मान करें

robots.txt पढ़ें, समवर्तीता को सीमित करें, और केवल वही स्क्रैप करें जो आपको करने की अनुमति है। एक विनम्र क्रॉलर भी एक कठिनाई से ब्लॉक होने वाला होता है।

एक स्क्रिप्ट से एक वास्तविक पाइपलाइन तक

एक बार जब फ़ेच लूप ठोस हो जाए, तो बाकी का काम ऑर्केस्ट्रेशन है। प्रॉक्सी URL का एक छोटा पूल रखें और प्रत्येक अनुरोध पर घुमाएँ; जब कोई लक्ष्य आक्रामक हो जाता है, तो पुनः प्रयास की संख्या बढ़ाने के बजाय पूल को बढ़ाएँ। चलते-फिरते परिणामों को बनाए रखें ताकि मध्य-चलन विफलता आपको पूरे क्रॉल की लागत न दे, और पृष्ठों के बीच एक विनम्र देरी जोड़ें ताकि आप दर सीमा के तहत रहें बजाय इसके कि इसके खिलाफ लड़ें।

जब आप तात्कालिक स्क्रिप्ट से बड़े हो जाते हैं, तो वही प्रॉक्सी एंडपॉइंट सीधे Scrapy या एक असिंक्रोनस क्लाइंट में चला जाता है — aiohttp पूल के लिए घुमाने वाले प्रॉक्सी को देखें। सब कुछ समान s4m निर्माण ब्लॉकों पर आधारित है: प्रमाणित डेटा सेंटर SOCKS5 और HTTP प्रॉक्सी, मीटर किए गए पे-एज़-यू-गो, साथ ही API और उपकरण जो निकासी IPs और पोर्ट्स की जांच करते हैं। यदि आपको केवल जल्दी से किसी देश या प्रोटोकॉल की पुष्टि करने की आवश्यकता है, तो मुफ्त सूची से शुरू करें।

FAQ

प्रश्न, उत्तरित

क्या मुझे SOCKS5 उदाहरणों के लिए PySocks की आवश्यकता है?

हाँ। अनुरोधों में SOCKS समर्थन PySocks से आता है - इसे pip install "requests[socks]" के साथ स्थापित करें। पोर्ट 3128 पर HTTP एंडपॉइंट एक स्टॉक अनुरोध स्थापना के साथ काम करता है और कोई अतिरिक्त निर्भरता नहीं है।

स्क्रैपिंग करते समय मुझे ब्लॉक होने से कैसे बचना चाहिए?

एक वास्तविक User-Agent भेजें, अपने अनुरोध की दर को थ्रॉटल करें, 429 प्रतिक्रियाओं पर बैकऑफ करें, और प्रॉक्सी पूल के माध्यम से निकासी IP को घुमाएँ। ब्लॉक्स आमतौर पर व्यवहार और IP प्रतिष्ठा के बारे में होते हैं, न कि आप जो पार्सर उपयोग करते हैं।

क्या s4m प्रॉक्सियाँ आवासीय हैं?

नहीं। s4m प्रमाणित डेटा सेंटर SOCKS5 और HTTP प्रॉक्सी बेचता है, मीटर के अनुसार भुगतान करें। अलग मुफ्त सार्वजनिक प्रॉक्सी सूची तीसरे पक्ष की है और अपने जोखिम पर उपयोग करें, केवल त्वरित परीक्षणों के लिए उपयोगी।

socks5h का उपयोग करने का कारण क्या है बजाय socks5 के?

socks5h प्रॉक्सी से DNS हल करने के लिए कहता है, इसलिए आप जो होस्टनेम स्क्रैप करते हैं वे आपकी मशीन से कभी लीक नहीं होते। साधारण socks5 पहले स्थानीय रूप से हल करता है, जो आपके लक्ष्यों को उजागर कर सकता है।

स्क्रैपिंग के लिए बनाए गए प्रॉक्सी

अनुरोधों को proxy.s4m.online पर इंगित करें, प्रमाणित डेटा सेंटर SOCKS5 और HTTP निकास के माध्यम से घुमाएं, और केवल उस ट्रैफ़िक के लिए भुगतान करें जिसका आप उपयोग करते हैं। जब भी एक लक्ष्य एक समर्पित IP की अपेक्षा करता है, एक समर्पित IP जोड़ें।

लोगों ने इस पृष्ठ को खोजकर पाया

वास्तविक खोज वाक्यांश जिनका यह पृष्ठ उत्तर देता है — लिंक किए गए वाक्यांश उस पृष्ठ को खोलते हैं जो उन्हें गहराई से कवर करता है।