Scrapy डाउनलोडर मिडलवेयर में solvethree का उपयोग करें

solvethree द्वारापढ़ने में 5 मिनट

केवल उन अनुरोधों के लिए CAPTCHA हल करने हेतु async डाउनलोडर मिडलवेयर का उपयोग करें जिन्हें आपका स्पाइडर स्पष्ट रूप से चिह्नित करता है। सिंक्रोनस solvethree SDK को वर्कर थ्रेड में चलाएँ, फिर टोकन, प्रॉक्सी और लौटाई गई ब्राउज़र पहचान वाला FormRequest लौटाएँ।

उदाहरण एक कॉन्फ़िगर किए गए reCAPTCHA Enterprise फ़ॉर्म एंडपॉइंट को संभालता है। यह चुनौतियों का पता नहीं लगाता और न ही यह खोजता है कि कोई भी वेबसाइट अपना टोकन किस तरह चाहती है।

इस पेज पर

मिडलवेयर सक्षम करने से पहले लक्ष्य कॉन्फ़िगर करें

  • Scrapy 2.19+, Python 3.10+ और आधिकारिक solvethree Python SDK का उपयोग करें। SDK सिंक्रोनस है; इसमें नेटिव async क्लाइंट नहीं है।
  • कंसोल में अपने वर्कस्पेस के लिए सक्रिय साइट प्रोफ़ाइल बनाएँ। होस्टनेम और ऐक्शन भेजने से प्रोफ़ाइल नहीं बनती। साइट प्रोफ़ाइल सेटअप देखें।
  • TARGET_URL को फ़ॉर्म सबमिशन के सटीक URL पर, SOLVETHREE_PROXY को इस एप्लिकेशन अनुरोध के लिए उपयोग की जाने वाली प्रॉक्सी पर, और SOLVETHREE_API_KEY को अपने वर्कस्पेस की कुंजी पर सेट करें। कुंजी सर्वर-साइड रखें।
  • नीचे दिखाए अनुसार AsyncioSelectorReactor सक्षम करें और मिडलवेयर को प्राथमिकता 740 पर रजिस्टर करें। इससे यह 750 पर मौजूद HttpProxyMiddleware से पहले आता है।

केवल स्पष्ट रूप से चिह्नित अनुरोधों के लिए CAPTCHA हल करें

Scrapy · केवल स्पष्ट रूप से चिह्नित फ़ॉर्म अनुरोधों को हल करें
# middlewares.py; Scrapy 2.19+, Python 3.10+, official solvethree SDK.
import asyncio
import os
from urllib.parse import urlsplit
from scrapy.http import FormRequest
from solvethree import Solvethree

class CaptchaMiddleware:
    async def process_request(self, request):
        if not request.meta.get("solvethree_form") or request.meta.get("solvethree_applied"):
            return None
        target = os.environ["TARGET_URL"]
        if request.url != target:
            raise ValueError("Only the configured form target may use this middleware")
        proxy = os.environ["SOLVETHREE_PROXY"]
        def solve():
            return Solvethree(os.environ["SOLVETHREE_API_KEY"]).solve({
                "site": urlsplit(target).hostname, "action": "login", "proxy": proxy,
                "requestId": request.meta["solvethree_request_id"],
            }, timeout=180)
        result = await asyncio.to_thread(solve)
        solution = result["solution"]
        fields = dict(request.meta["solvethree_fields"])
        fields["g-recaptcha-response"] = solution["token"]
        meta = {**request.meta, "proxy": proxy, "solvethree_applied": True,
                "dont_retry": True, "dont_redirect": True}
        return FormRequest(target, formdata=fields, callback=request.callback,
            errback=request.errback, headers={"User-Agent": solution["userAgent"],
                "sec-ch-ua": solution["secChUa"]}, meta=meta, dont_filter=True)

# settings.py:
# TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
# DOWNLOADER_MIDDLEWARES = {"myproject.middlewares.CaptchaMiddleware": 740}
# The spider first loads its form/CSRF data with the same proxy and cookiejar.
# Then yield a Request(TARGET_URL, callback=your_result_handler, meta={
#     "solvethree_form": True, "solvethree_request_id": one_saved_logical_job_id,
#     "solvethree_fields": {"csrf": token_from_the_form, "email": "your-test-value"},
#     "cookiejar": your_cookiejar_id,
# })
# Inspect the final response in your_result_handler; a ready task is not that response.

मिडलवेयर का process_request मेथड केवल request लेता है, अप्रचलित spider आर्ग्युमेंट नहीं। अचिह्नित अनुरोध बिना बदलाव आगे बढ़ते हैं। चिह्नित अनुरोध का TARGET_URL से बिल्कुल मेल खाना ज़रूरी है; बेमेल होने पर दूसरे एंडपॉइंट को टोकन भेजने के बजाय त्रुटि उत्पन्न होती है।

asyncio.to_thread सिंक्रोनस SDK के नेटवर्क कॉल और पोलिंग को इवेंट-लूप थ्रेड से बाहर रखता है। केवल process_request को async घोषित करने से ऐसा नहीं होगा। SDK टास्क बनाता है और तैयार परिणाम की प्रतीक्षा करता है या अपवाद उत्पन्न करता है; इसके बाद मिडलवेयर फ़ॉर्म सबमिशन बनाता है।

आपका एप्लिकेशन वास्तव में जो फ़ॉर्म सबमिट करता है, उससे मेल रखें

  1. 1.

    सही ऐक्शन और टोकन फ़ील्ड सेट करें

    उदाहरण login ऐक्शन का उपयोग करता है और solution.token को g-recaptcha-response में रखता है। इन्हें लक्ष्य के इंटीग्रेशन के अनुरूप बदलें। टास्क का site, TARGET_URL के होस्टनेम से निकाला जाता है; reCAPTCHA टास्क type या url फ़ील्ड नहीं लेते। recaptchaType छोड़ने पर enterprise-v3 चुना जाता है।

  2. 2.

    मौजूदा फ़ॉर्म फ़ील्ड दें

    स्पाइडर को solvethree_fields में एंडपॉइंट की आवश्यक फ़ील्ड भरनी चाहिए, जिनमें उसका मौजूदा CSRF मान भी शामिल हो। मिडलवेयर उन फ़ील्ड को कॉपी करता है और टोकन जोड़ता है; वह फ़ॉर्म लोड नहीं करता और न ही छिपे हुए इनपुट निकालता है।

  3. 3.

    सेशन को एकसमान रखें

    शुरुआती फ़ॉर्म उसी प्रॉक्सी और ब्राउज़र पहचान से लोड करें जिसकी एप्लिकेशन को आवश्यकता है। चिह्नित अनुरोध के मेटाडेटा में उसकी cookiejar ID दें। लौटाया गया FormRequest उस cookiejar को बनाए रखता है और solution.userAgent तथा solution.secChUa का उपयोग करता है, लेकिन उदाहरण पहले के सेशन को तैयार या ठीक नहीं करता।

  4. 4.

    एप्लिकेशन रिस्पॉन्स संभालें

    ऐसा कॉलबैक दें जो जाँचे कि फ़ॉर्म सबमिशन सफल हुआ या नहीं, और अनुरोध विफलताओं के लिए errback दें। टास्क तैयार होने का अर्थ है कि समाधान जनरेट हो गया, यह नहीं कि वेबसाइट ने उसके बाद का अनुरोध स्वीकार कर लिया।

यह उदाहरण जानबूझकर CAPTCHA समाधान और सबमिशन के लिए एक ही प्रॉक्सी का उपयोग करता है। CAPTCHA हल होने के बाद इसे किसी असंबंधित प्रॉक्सी से न बदलें। साथ ही, User-Agent या क्लाइंट हिंट को दोबारा लिखने वाले किसी भी कस्टम डाउनलोडर मिडलवेयर की जाँच करें: उसे समाधान के साथ लौटाई गई पहचान को ओवरराइट नहीं करना चाहिए।

दोबारा प्रयास से नया CAPTCHA समाधान शुरू न होने दें

चिह्नित अनुरोध को yield करने से पहले solvethree_request_id सहेजें और उस तार्किक CAPTCHA समाधान के लिए उसे बनाए रखें। requestId में 1–64 ASCII अक्षर, अंक, अंडरस्कोर या हाइफ़न स्वीकार किए जाते हैं। बिल्कुल समान टास्क इनपुट के साथ इसका दोबारा उपयोग करने पर मौजूदा टास्क रिकवर होता है; ID बनाए रखते हुए इनपुट बदलने पर टकराव होता है।

लौटाया गया FormRequest, solvethree_applied सेट करता है ताकि वह दूसरा CAPTCHA समाधान शुरू न करे। वह dont_retry और dont_redirect भी सेट करता है, जिससे उस सबमिशन के लिए अपने-आप होने वाले पुनः प्रयास और रीडायरेक्ट रुकते हैं। ये फ़्लैग आपके अपने कॉलबैक या जॉब रनर को दूसरा अनुरोध शुरू करने से नहीं रोकते, इसलिए यह निर्णय स्पष्ट रूप से लें।

CAPTCHA हल करने की कॉल टाइमआउट हो जाती है।

पता करें कि टास्क पहले ही बन चुका था या नहीं। कनेक्शन टाइमआउट यह साबित नहीं करता कि टास्क बनाना विफल हुआ।

यह आज़माएँ: नया लॉजिकल सॉल्व बनाने से पहले ज्ञात टास्क प्राप्त करें या सहेजे गए requestId और हूबहू समान टास्क इनपुट से उसे पुनः प्राप्त करें।

सॉल्विंग परिणाम लौटाने के बजाय अपवाद उठाती है।

HTTP अनुरोध की त्रुटि और टास्क की अंतिम विफलता में अंतर करें। विफल टास्क के लिए errorCode और error की जाँच करें।

यह आज़माएँ: उसी चिह्नित अनुरोध को बार-बार yield करने के बजाय विफलता को संभालें। दोबारा कोशिश करने से पहले अमान्य इनपुट ठीक करें; विफल टास्क की पोलिंग जारी नहीं रहनी चाहिए।

वेबसाइट सबमिट किया गया फ़ॉर्म अस्वीकार कर देती है।

पहले भेजे जा रहे टोकन फ़ील्ड, CSRF फ़ील्ड, कुकी, प्रॉक्सी और ब्राउज़र पहचान की जाँच करें।

यह आज़माएँ: एक और सॉल्व के लिए भुगतान करने से पहले एप्लिकेशन का अनुरोध ठीक करें। फ़ील्ड में solution.token होना चाहिए, न कि टास्क ID या पुराना टोकन।

अपना पहला टास्क चलाएँ।

$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।

वर्कस्पेस बनाएँ
Scrapy डाउनलोडर मिडलवेयर में solvethree का उपयोग करें · solvethree