Scarnox · Blog

scraping करते समय captcha से कैसे बचें (नियम तोड़े बिना)

ज़्यादातर captcha scraping के दौरान उस traffic की प्रतिक्रिया होते हैं जो automated लगता है। इन्हें रोकने का सबसे सस्ता तरीका है उन्हें ट्रिगर न होने देना। इसका मतलब है पहले किसी वैध data source को ढूँढना, site के नियमों से पूछना कि आप क्या कर सकते हैं, कम और धीमे requests भेजना, और एक ही page दो बार न लाना। Captcha solve करना उन मामलों के लिए fallback है जिन्हें आप टाल नहीं सकते, योजना नहीं।

पहले किसी official API या feed की जाँच करें

Scrape होने वाली कई sites पहले से ऐसा तरीका देती हैं जिससे captcha के बिना वही data मिल जाए: public API, data export, RSS या sitemap feed, या partner program। Official source ज़्यादा भरोसेमंद होता है, बिना सूचना के कम बदलता है, और site owner को यह तय करने का मौका देता है कि आप उसका इस्तेमाल कैसे करते हैं। ये चीज़ें ढूँढें:

अगर इनमें से कोई आपकी ज़रूरत पूरी करता है, तो उसे इस्तेमाल करें। HTML माँगे बिना आप ज़्यादातर captcha से बच जाएँगे।

robots.txt और उसकी माँगी गई rate का सम्मान करें

robots.txt बताता है कि automated clients किन paths को fetch कर सकते हैं और कभी-कभी requests के बीच कितना इंतज़ार करना है। Python की standard library इसे आपके लिए पढ़ सकती है:

import time
from urllib.robotparser import RobotFileParser
import requests

USER_AGENT = "ExampleBot/1.0 (+https://example.com/bot)"

parser = RobotFileParser()
parser.set_url("https://example.com/robots.txt")
parser.read()

delay = parser.crawl_delay(USER_AGENT) or 5  # सावधानी के तौर पर 5 सेकंड का fallback
urls = [
    "https://example.com/products?page=1",
    "https://example.com/products?page=2",
]

last_request = 0.0
for url in urls:
    if not parser.can_fetch(USER_AGENT, url):
        print("skipped by robots.txt:", url)
        continue
    wait = delay - (time.monotonic() - last_request)
    if wait > 0:
        time.sleep(wait)
    resp = requests.get(url, headers={"User-Agent": USER_AGENT}, timeout=30)
    last_request = time.monotonic()
    print(url, resp.status_code)

अगर robots.txt किसी path को मना करता है, तो ईमानदार जवाब है उसे छोड़ देना या owner से पूछना। Browser से उसके आसपास से निकलने से site ने जो माँगा है, वह नहीं बदलता।

धीमे चलें और requests फैलाएँ

स्थिर, मध्यम गति शायद ही कभी challenge ट्रिगर करती है, जबकि burst लगभग हमेशा करता है। कुछ आदतें बड़ा फ़र्क डालती हैं:

Cache करें और दोबारा fetch न करें

हर request जो आप नहीं करते, वह एक request है जिसे site को संभालना नहीं पड़ता। जो pages आप लाते हैं उन्हें उनकी तारीख और body के hash के साथ सेव करें, और सामग्री बदलने की संभावना होने पर ही दोबारा लाएँ। If-Modified-Since या ETag headers वाले conditional requests, server के समर्थन करने पर, उसे सस्ते में "not modified" लौटाने देते हैं।

Sessions दोबारा इस्तेमाल करें, सामान्य headers भेजें

जो session requests के बीच cookies रखता है, वह हर बार नए सिरे से शुरू होने वाली script से ज़्यादा visitor जैसा व्यवहार करता है। हर site के लिए requests.Session() इस्तेमाल करें, और एक साफ़, ईमानदार User-Agent भेजें जिसमें आपका bot और संपर्क हो। किसी नियम को पार करने के लिए browser होने का दिखावा न करें। अगर किसी site को content दिखाने के लिए JavaScript चाहिए, तो उन pages के लिए browser tool इस्तेमाल करें, और वही rate limits रखें।

जब captcha फिर भी दिखे

कुछ sites चाहे आप कितनी भी सावधानी बरतें, captcha दिखाएँगी। उसे code में पहचानें और उस job को रोक दें, page पर हथौड़ा न चलाएँ। पहचान और PopularCaptcha के लिए वैकल्पिक solve के बारे में web scraping captchas में बताया गया है।

Crawl की योजना शुरू करने से पहले बनाएँ

जो crawl हर दिन सब कुछ fetch करता है, वह captcha ट्रिगर करने का सबसे आसान तरीका है। काम की योजना पहले बनाएँ:

ऐसी योजना requests की संख्या घटाती है, जो आपके पास सबसे बड़ा leverage है।

योजना को एक छोटी config file या table में लिखें: हर site, हर section, refresh interval और हर एक के लिए दैनिक request budget। Budget खत्म होने पर job अगली window तक रुक जाए। Budget को सुझाव नहीं, बल्कि सख़्त सीमा मानना ही वह चीज़ है जो crawler को उस traffic pattern में जाने से रोकती है जो captcha ट्रिगर करता है। हर few हफ़्तों में budget की समीक्षा करें, क्योंकि जो site बढ़ती है उसका traffic भी बढ़ सकता है, और पिछली तिमाही में जो विनम्र था, अब शायद न हो।

ज़िम्मेदारी से scrape करें

अगले कदम