इसके लिए captcha solver:
Scrapy
Job को फ़ेल होने देने के बजाय run के अंदर ही challenge को हल करें। एक काम करता Python उदाहरण, और वे तीन बातें जो तय करती हैं कि आपका token स्वीकार होगा या नहीं।
# middlewares.py
import time
import requests
CAPTCHANO_KEY = "cn-YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {CAPTCHANO_KEY}"}
def solve(task: dict) -> dict:
"""Block until solved; returns e.g. {"token": "...", "userAgent": "..."}."""
r = requests.post(
"https://api.captchano.com/v1/solve",
params={"wait": 60},
json=task,
headers=HEADERS,
timeout=75,
)
data = r.json()
# A solve can outlast the 60 s wait: poll the task until it finishes.
while data.get("status") in ("queued", "solving"):
time.sleep(5)
data = requests.get(
f"https://api.captchano.com/v1/task/{data['id']}",
headers=HEADERS,
timeout=30,
).json()
if data.get("status") != "ready":
raise RuntimeError(data.get("error") or data)
return data["solution"]
class CaptchaNoMiddleware:
def process_response(self, request, response, spider):
sitekey = response.css("[data-sitekey]::attr(data-sitekey)").get()
if not sitekey:
return response
solution = solve({"type": "recaptcha_v2", "sitekey": sitekey, "url": response.url})
return request.replace(
method="POST",
body=f"g-recaptcha-response={solution['token']}",
headers={"Content-Type": "application/x-www-form-urlencoded"},
dont_filter=True,
)Token स्वीकार होगा या नहीं, यह किन बातों पर निर्भर है
- अपना proxy साथ भेजें। Token उसी exit IP के पीछे बनना चाहिए जो उसे submit करता है। Session-graded सिस्टम के लिए यह अनिवार्य है, केवल ऑप्टिमाइज़ेशन नहीं।
- User agent मिलाएँ। Turnstile और कई anti-bot सिस्टम token को एक user agent से बाँध देते हैं। हम इस्तेमाल किया गया user agent लौटाते हैं ताकि आप उसे बिल्कुल वैसा ही दोहरा सकें।
- देर से request करें। Token लगभग 120 सेकंड में expire हो जाते हैं। जब आप submit करने के लिए तैयार हों, तभी token माँगें।
Blocking या polling
उदाहरण में ?wait=60 का इस्तेमाल है, इसलिए call पूरा solve लौटाता है और आपका Scrapy स्टेप सीधा-सादा रहता है। अगर आप कनेक्शन खुला नहीं रखना चाहते, तो यह parameter हटा दें, लौटाया गया id रख लें, और हर पाँच सेकंड में GET /v1/task/{id} poll करें। जिस token का आपने भुगतान किया है वह दस मिनट तक प्राप्त किया जा सकता है, इसलिए कनेक्शन टूटने पर भी आपका solve बेकार नहीं जाता।
लागत
हर सफल reCAPTCHA v2 solve के लिए $0.00598, असफल solve पर कभी चार्ज नहीं। हर challenge टाइप के लिए कीमतें देखें, या पूरे request फ़ॉर्मेट के लिए API reference देखें।
Scrapy में solve कैसे फ़िट होता है
Scrapy में कोई browser नहीं होता, इसलिए captcha को downloader middleware में संभाला जाता है: response में challenge पहचानें, solve करें, और token या cookie के साथ request को दोबारा भेजें।
- 01process_response में पहचानें
Response body में data-sitekey या कोई जाना-पहचाना challenge पेज देखें।
- 02Solve करें
sitekey, response.url और request.meta के proxy के साथ API को call करें।
- 03Token के साथ retry करें
Token वाला FormRequest लौटाएँ, या solve की गई cookie के साथ मूल request।
- 04Cookie jar बनाए रखें
Scrapy के cookie middleware को अगले requests के लिए clear हुआ session रखने दें।
Token को पेज में कैसे डालें
Middleware token को फ़ॉर्म डेटा में जोड़ता है या लौटाई गई cookie सेट करता है, फिर एक नया Request लौटाता है।
इंटीग्रेशन आमतौर पर कहाँ गलत होते हैं
Middleware में synchronous HTTP call हर request को रोक देता है। Solve के लिए async client या thread का इस्तेमाल करें।
अगर कोई proxy middleware हर request पर IP बदलता है, तो retry के लिए IP फ़िक्स कर दें ताकि वह solve से मेल खाए।
हर URL के लिए retries की सीमा तय करें। जो पेज हर बार challenge दिखाता है, वह आपको धीमा होने के लिए कह रहा है।
Scrapy captcha: अक्सर पूछे सवाल
क्या Scrapy JavaScript challenges solve कर सकता है?
Scrapy JavaScript नहीं चलाता। Token challenges के लिए आपको सिर्फ़ sitekey और URL चाहिए; DataDome जैसे session-graded सिस्टम के लिए आप challenge URL भेजते हैं और एक cookie पाते हैं जिसे Scrapy दोबारा इस्तेमाल कर सकता है।
क्या मुझे इसके बजाय scrapy-playwright इस्तेमाल करना चाहिए?
सिर्फ़ तब, जब पेज को अपना कंटेंट render करने के लिए JavaScript चाहिए। Token-आधारित captcha के लिए middleware वाला तरीका हर request पर browser चलाने से हल्का और तेज़ है।
Middleware कहाँ रखा जाए?
Proxy middleware के बाद और retry middleware से पहले, ताकि उसे वह proxy दिखे जो इस्तेमाल होगा और उसकी अपनी retries दो बार न गिनी जाएँ।
बार-बार के solves का भुगतान करने से कैसे बचूँ?
Requests के बीच cookies रखें और crawl की रफ़्तार नियंत्रित करें। एक clear हुआ session अक्सर कई पेजों तक clear रहता है, और बिलिंग सिर्फ़ सफल solves पर होती है।
उपयोगी गाइड
बनाने के लिए तैयार?
3 दिन के free trial से शुरू करें, फिर ट्रैफ़िक बढ़ने के साथ हर सफल solve के हिसाब से भुगतान करें। Trial के लिए कार्ड की ज़रूरत नहीं।