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 को यह तय करने का मौका देता है कि आप उसका इस्तेमाल कैसे करते हैं। ये चीज़ें ढूँढें:
- footer में developer या API सेक्शन,
- pages की सूची के लिए
sitemap.xml, - page के
<head>में RSS या Atom links, - bulk exports के लिए "data" या "download" page।
अगर इनमें से कोई आपकी ज़रूरत पूरी करता है, तो उसे इस्तेमाल करें। 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 लगभग हमेशा करता है। कुछ आदतें बड़ा फ़र्क डालती हैं:
- हर site के लिए एक request rate चुनें और उसी पर टिकें, full speed पर न दौड़ें।
- Timing एकदम नियमित न लगे, इसके लिए थोड़ा random jitter जोड़ें।
- 429 या captcha page दिखे तो कुछ देर रुकें और backoff करें।
- अगर site का load चिंता का विषय है तो काम व्यस्त समय से बाहर चलाएँ।
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 ट्रिगर करने का सबसे आसान तरीका है। काम की योजना पहले बनाएँ:
- प्राथमिकता तय करें। तय करें कौन-से pages अक्सर बदलते हैं और कौन-से कम। अक्सर बदलने वालों को बार-बार crawl करें, बाकी को कम।
- Sitemap की तारीखें इस्तेमाल करें। कई sitemaps में
lastmodvalue होती है। वे URLs छोड़ दें जो आपकी पिछली visit के बाद नहीं बदले। - Incremental crawl करें। हर URL के लिए आखिरी सफल fetch सेव करें, और विफलता के बाद पहले page से शुरू करने के बजाय वहीं से जारी करें।
- Load बाँटें। बड़ी list को batches में बाँटें और पूरे दिन में चलाएँ, एक साथ नहीं।
ऐसी योजना requests की संख्या घटाती है, जो आपके पास सबसे बड़ा leverage है।
योजना को एक छोटी config file या table में लिखें: हर site, हर section, refresh interval और हर एक के लिए दैनिक request budget। Budget खत्म होने पर job अगली window तक रुक जाए। Budget को सुझाव नहीं, बल्कि सख़्त सीमा मानना ही वह चीज़ है जो crawler को उस traffic pattern में जाने से रोकती है जो captcha ट्रिगर करता है। हर few हफ़्तों में budget की समीक्षा करें, क्योंकि जो site बढ़ती है उसका traffic भी बढ़ सकता है, और पिछली तिमाही में जो विनम्र था, अब शायद न हो।
ज़िम्मेदारी से scrape करें
- शुरू करने से पहले
robots.txtऔर terms of service जाँचें, और जो वे कहते हैं उसका सम्मान करें। - Request rate कम रखें, और जब site संकेत दे कि वह संघर्ष कर रही है, तब रुकें।
- वह personal data इकट्ठा न करें जिसे रखने का आपके पास कोई कारण नहीं है, और जब उसकी ज़रूरत न रहे तो उसे मिटा दें।
- Copyrighted content को बड़े पैमाने पर दोबारा प्रकाशित न करें। Data का इस्तेमाल विश्लेषण, तुलना या अपने product के लिए करें, और जहाँ उचित हो वहाँ स्रोत का श्रेय दें।
- अगर आपको ज़्यादा volume चाहिए तो site owner से संपर्क करें। वे feed दे सकते हैं।