कैसे पायथन में अनुरोध को लागू करने के लिए

टिप्पणियाँ: 0

वेब स्क्रैपिंग वेब से डेटा निकालने के लिए एक प्रभावी तरीका है। कई डेवलपर्स वेब स्क्रैपिंग प्रोजेक्ट्स को ले जाने के लिए पायथन रिक्वेस्ट लाइब्रेरी का उपयोग करना पसंद करते हैं क्योंकि यह सरल और प्रभावी है। हालांकि, जैसा कि यह है, अनुरोध पुस्तकालय की अपनी सीमाएं हैं। वेब स्क्रैपिंग में हम एक विशिष्ट समस्या का सामना कर सकते हैं, यह विफल अनुरोध है, जो अक्सर अस्थिर डेटा निष्कर्षण की ओर ले जाता है। इस लेख में, हम पायथन में अनुरोध रिट्रीज को लागू करने की प्रक्रिया से गुजरेंगे, ताकि आप HTTP त्रुटियों को संभाल सकें और अपनी वेब स्क्रैपिंग स्क्रिप्ट को स्थिर और विश्वसनीय रख सकें।

अनुरोधों के साथ शुरू हो रहा है लाइब्रेरी

आइए पहले हमारे वातावरण को सेट करें। सुनिश्चित करें कि आपके पास पायथन स्थापित है और अपनी पसंद का कोई भी आईडीई है। फिर अनुरोध लाइब्रेरी स्थापित करें यदि आपके पास यह पहले से ही नहीं है।

pip install requests

एक बार स्थापित होने के बाद, आइए पायथन के अनुरोध मॉड्यूल का उपयोग करके Example.com पर एक अनुरोध भेजें। यहाँ एक सरल कार्य है जो बस यही करता है:

import requests

def send_request(url):
    """
   निर्दिष्ट URL के लिए HTTP GET अनुरोध भेजता है और प्रतिक्रिया स्थिति कोड प्रिंट करता है।
    
    Parameters:
        url (str): अनुरोध भेजने के लिए URL।
    """
    response = requests.get(url)
    print('Response Status Code: ', response.status_code)

send_request('https://example.com')

कोड आउटपुट नीचे दिखाया गया है:

How to implement request retries in Python.png

आइए उन्हें बेहतर समझने के लिए HTTP स्टेटस कोड पर करीब से नज़र डालें।

HTTP स्थिति कोड को समझना

सर्वर अनुरोध के परिणाम को इंगित करने वाले स्टेटस कोड के साथ HTTP अनुरोध का जवाब देता है। यहाँ एक त्वरित रंडन है:

  1. 1xx (सूचनात्मक): अनुरोध प्राप्त किया गया था और जारी किया गया था।
  2. 2xx (सफलता): अनुरोध प्राप्त, समझा और स्वीकार किया गया था।
    • 200 ओके: अनुरोध सफल रहा। यह HTTP स्थिति कोड का हरे रंग की रोशनी है।
  3. 3xx (पुनर्निर्देशन): अनुरोध को पूरा करने के लिए आगे की कार्रवाई की आवश्यकता है।
  4. 4xx (क्लाइंट त्रुटि): अनुरोध के साथ एक त्रुटि थी, अक्सर क्लाइंट-साइड पर कुछ के कारण।
  5. 5xx (सर्वर त्रुटि): सर्वर इसके अंत में एक त्रुटि के कारण एक वैध अनुरोध को पूरा करने में विफल रहा।
    • 500 आंतरिक सर्वर त्रुटि: सर्वर अनुरोध को पूरा करने में असमर्थ था। यह इंगित करता है कि सर्वर को एक अप्रत्याशित स्थिति का सामना करना पड़ा जिसने इसे अनुरोध को पूरा करने से रोक दिया। यह HTTP स्टेटस कोड लाल ट्रैफ़िक लाइट के बराबर है।
    • 504 गेटवे टाइमआउट: सर्वर को समय पर अपस्ट्रीम सर्वर से प्रतिक्रिया नहीं मिली। यह HTTP स्टेटस कोड वेटिंग रूम टाइमआउट ट्रैफिक लाइट के बराबर है।

हमारे उदाहरण में, स्थिति कोड 200 का अर्थ है https://example.com का अनुरोध पूरा हो गया। यह सर्वर का कहने का तरीका है, "यहां सब कुछ अच्छा है, आपका अनुरोध एक सफलता थी"।

ये स्थिति कोड बॉट का पता लगाने में भी भूमिका निभा सकते हैं और यह संकेत देते हैं कि बॉट जैसे व्यवहार के कारण पहुंच कब प्रतिबंधित है।

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

  1. 429 बहुत अधिक अनुरोध: यह स्थिति कोड इंगित करता है कि उपयोगकर्ता ने किसी निश्चित समय ("दर सीमित") में बहुत सारे अनुरोध भेजे हैं। यह एक सामान्य प्रतिक्रिया है जब बॉट पूर्वनिर्धारित अनुरोध सीमा से अधिक हो जाते हैं।
  2. 403 निषिद्ध: यह कोड तब वापस आ जाता है जब सर्वर अनुरोध को पूरा करने से इनकार कर देता है। यह तब हो सकता है जब सर्वर को संदेह है कि अनुरोध उपयोगकर्ता-एजेंट या अन्य मानदंडों के आधार पर बॉट से आ रहा है।
  3. 401 अनधिकृत: इस स्थिति का उपयोग किया जा सकता है यदि एक्सेस को प्रमाणीकरण की आवश्यकता होती है जो कि बॉट के पास नहीं है।
  4. 503 सेवा अनुपलब्ध: कभी -कभी यह इंगित करने के लिए उपयोग किया जाता है कि सर्वर अस्थायी रूप से अनुरोध को संभालने में असमर्थ है, जो स्वचालित ट्रैफ़िक स्पाइक्स के दौरान हो सकता है।

पायथन में रिट्री मैकेनिज्म को लागू करना

आइए अब HTTP को अनुरोध लाइब्रेरी के साथ अनुरोध करने के लिए पायथन में एक सरल रिट्री तंत्र लिखें। ऐसे समय होते हैं जब नेटवर्क अनुरोध कुछ नेटवर्क समस्या या सर्वर अधिभार के कारण विफल हो जाते हैं। इसलिए यदि हमारा अनुरोध विफल हो जाता है, तो हमें इन अनुरोधों को पुनः प्राप्त करना चाहिए।

बुनियादी रिट्री मैकेनिज्म

फ़ंक्शन send_request_with_basic_retry_mechanism HTTP को किसी दिए गए URL को एक बुनियादी रिट्री तंत्र के साथ अनुरोध करता है, जो केवल तभी पुन: प्रयास करेगा जब कोई नेटवर्क या अनुरोध अपवाद जैसे कनेक्शन त्रुटि का सामना करना पड़ता है। यह अधिकतम MAX_RERTRIES के अनुरोध को पुनः प्राप्त करेगा। यदि सभी इस तरह के अपवाद के साथ विफल हो जाते हैं, तो यह अंतिम सामना अपवाद को बढ़ाता है।

import requests
import time

def send_request_with_basic_retry_mechanism(url, max_retries=2):
    """
    एक बुनियादी रिट्री तंत्र के साथ एक URL के लिए एक HTTP GET अनुरोध भेजता है।
    
    Parameters:
        url (str): अनुरोध भेजने के लिए URL।
        max_retries (int): अनुरोध को पुनः प्राप्त करने के लिए अधिकतम संख्या।

    Raises:
        requests.RequestException: यदि सभी पुनर्विचार विफल हो जाते हैं तो अंतिम अपवाद उठाता है।

    """
    for attempt in range(max_retries):
        try:
            response = requests.get(url)
            print('Response status: ', response.status_code)
            break  # बाहर निकलें लूप यदि सफल अनुरोध करें
        except requests.RequestException as error:
            print(f"Attempt {attempt+1} failed:", error)
            if attempt < max_retries - 1:
                print(f"Retrying...")
                time.sleep(delay)  # पुन: प्रयास करने से पहले प्रतीक्षा करें
            else:
                print("Max retries exceeded.")
                # अंतिम अपवाद को फिर से बढ़ाएं यदि मैक्स रिट्रीज़ पहुंच गया
                raise
                send_request_with_basic_retry_mechanism('https://example.com')

अग्रिम रिट्री तंत्र

आइए अब उन परिदृश्यों को संभालने के लिए बेसिक रिट्री मैकेनिज्म को अनुकूलित करें जहां हम जिस वेबसाइट को बॉट डिटेक्शन मैकेनिज्म को स्क्रैप करने की कोशिश कर रहे हैं, उसके परिणामस्वरूप ब्लॉकिंग हो सकती है। इस तरह के परिदृश्यों को संबोधित करने के लिए, हमें कई बार अनुरोध को फिर से प्राप्त करने की आवश्यकता है, क्योंकि वे केवल बॉट डिटेक्शन ब्लॉक नहीं हो सकते हैं, बल्कि नेटवर्क या सर्वर समस्याओं के कारण भी हो सकते हैं।

नीचे फ़ंक्शन Send_Request_with_advance_retry_mechanism वैकल्पिक रिट्री प्रयासों के साथ प्रदान किए गए URL को HTTP GET अनुरोध भेजता है और देरी को पुनः प्राप्त करता है। यह अनुरोधों की निर्दिष्ट संख्या के लिए कई बार अनुरोध भेजने की कोशिश करता है और यदि अनुरोध को सफलतापूर्वक प्रतिक्रिया मिलती है तो प्रतिक्रिया स्थिति कोड को प्रिंट करता है। यदि यह अनुरोध ऑपरेशन के दौरान एक त्रुटि का सामना करता है, तो यह त्रुटि संदेश को प्रिंट करता है और इसे वापस ले जाता है। यह प्रत्येक प्रयास के बीच निर्दिष्ट रिट्री देरी का इंतजार करता है। यदि अनुरोध रिट्री प्रयासों की निर्दिष्ट संख्या के बाद भी विफल हो जाता है, तो यह अंतिम सामना किए गए अपवाद को बढ़ाता है।

विलंब पैरामीटर महत्वपूर्ण है क्योंकि यह एक करीबी अंतराल पर कई अनुरोधों के साथ सर्वर पर बमबारी करने से बचता है। इसके बजाय, यह सर्वर के पास अनुरोध को संसाधित करने के लिए पर्याप्त समय होने का इंतजार करता है, जिससे सर्वर को लगता है कि एक मानव और बॉट नहीं अनुरोध कर रहा है। तो, सर्वर अधिभार या धीमी सर्वर प्रतिक्रिया से बचने के लिए रिट्री तंत्र को देरी होनी चाहिए जो एंटी-बॉट तंत्र को ट्रिगर कर सकती है।

import requests
import time

def send_request_with_advance_retry_mechanism(url, max_retries=3, delay=1):
    """
   एक उन्नत रिट्री तंत्र के साथ निर्दिष्ट URL के लिए एक HTTP GET अनुरोध भेजता है।
    
    Parameters:
        url (str): अनुरोध भेजने के लिए URL।
        max_retries (int): अनुरोध को पुनः प्राप्त करने के लिए अधिकतम संख्या। डिफ़ॉल्ट 3 है।
        delay (int): रिट्रीज के बीच देरी (सेकंड में)। डिफ़ॉल्ट 1 है।
    Raises:
        requests.RequestException: यदि सभी पुनर्विचार विफल हो जाते हैं तो अंतिम अपवाद उठाता है।
    """
    for attempt in range(max_retries):
        try:
            response = requests.get(url)
         # 4xx या 5xx स्थिति कोड के लिए एक अपवाद बढ़ाएं
            response.raise_for_status()
            print('Response Status Code:', response.status_code)
        except requests.RequestException as e:
           # प्रिंट त्रुटि संदेश और प्रयास संख्या यदि अनुरोध विफल हो जाता है
            print(f"Attempt {attempt+1} failed:", e)
            if attempt < max_retries - 1:
              # रिट्री मैसेज प्रिंट करें और रिट्री करने से पहले प्रतीक्षा करें
                print(f"Retrying in {delay} seconds...")
                time.sleep(delay)
            else:
               # यदि मैक्स रिट्रीज़ पार हो जाता है, तो संदेश प्रिंट करें और अपवाद को फिर से बढ़ाएं
                print("Max retries exceeded.")
                raise

# उदाहरण उपयोग
send_request_with_advance_retry_mechanism('https://httpbin.org/status/404')

इस कार्यान्वयन की कमियां हैं:

  • 4xx और 5xx रेंज से संबंधित सभी स्टेटस कोड को फिर से प्राप्त किया जाता है। हालांकि, 404 (नहीं मिला) स्थिति कोड के परिणामस्वरूप अनुरोधों को फिर से प्राप्त करने की आवश्यकता नहीं है।
  • कुछ बॉट डिटेक्शन सेवाएं 200 (ओके) की स्थिति कोड के साथ प्रतिक्रिया कर सकती हैं, लेकिन प्रतिक्रिया सामग्री भिन्न हो सकती है। इस स्थिति को वर्तमान कार्यान्वयन में संभाला नहीं गया है। सामग्री लंबाई सत्यापन को लागू करने से इस मुद्दे को संबोधित किया जा सकता है।

यहां कमियों को संबोधित करने वाली टिप्पणियों के साथ सही कोड है:

import requests
import time

def send_request_with_advance_retry_mechanism(url, max_retries=3, delay=1, min_content_length=10):
    """
    एक उन्नत रिट्री तंत्र के साथ निर्दिष्ट URL के लिए एक HTTP GET अनुरोध भेजता है।

    Parameters:
        url (str): अनुरोध भेजने के लिए URL।
        max_retries (int): अनुरोध को पुनः प्राप्त करने के लिए अधिकतम संख्या। डिफ़ॉल्ट 3 है।
        delay (int): रिट्रीज के बीच देरी (सेकंड में)। डिफ़ॉल्ट 1 है।
        min_content_length (int): मान्य पर विचार करने के लिए प्रतिक्रिया सामग्री की न्यूनतम लंबाई। डिफ़ॉल्ट 10 है।

    Raises:
        requests.RequestException: यदि सभी पुनर्विचार विफल हो जाते हैं तो अंतिम अपवाद उठाता है।
    """
    for attempt in range(max_retries):
        try:
            response = requests.get(url)
           # 4xx या 5xx स्थिति कोड के लिए एक अपवाद बढ़ाएं
            response.raise_for_status()
            
            # जाँच करें कि क्या प्रतिक्रिया स्थिति कोड 404 है
            if response.status_code == 404:
                print("404 Error: Not Found")
                break  # Exit loop for 404 errors
            
           # जाँच करें कि क्या प्रतिक्रिया पाठ की लंबाई निर्दिष्ट न्यूनतम सामग्री लंबाई से कम है
            if len(response.text) < min_content_length:
                print("Response text length is less than specified minimum. Retrying...")
                time.sleep(delay)
                continue # अनुरोध करें
            
            print('Response Status Code:', response.status_code)
           # यदि शर्तें पूरी होती हैं, तो लूप से बाहर निकलें
            break
            
        except requests.RequestException as e:
            print(f"Attempt {attempt+1} failed:", e)
            if attempt < max_retries - 1:
                print(f"Retrying in {delay} seconds...")
                time.sleep(delay)
            else:
                print("Max retries exceeded.")
                # अंतिम अपवाद को फिर से बढ़ाएं यदि मैक्स रिट्रीज़ पहुंच गया
                raise

# उदाहरण उपयोग
send_request_with_advance_retry_mechanism('https://httpbin.org/status/404')

प्रॉक्सी के साथ विशिष्ट HTTP त्रुटियों को संभालना

429 बहुत सारे अनुरोधों जैसी कुछ त्रुटियों के लिए, घूर्णन प्रॉक्सी का उपयोग करने से आपके अनुरोधों को वितरित करने और दर सीमित करने से बचने में मदद मिल सकती है।

नीचे दिया गया कोड प्रॉक्सी के उपयोग के साथ एक उन्नत रिट्री रणनीति को लागू करता है। इस तरह, हम एक पायथन अनुरोधों को लागू करने के लिए लागू कर सकते हैं। उच्च गुणवत्ता वाले वेब स्क्रैपिंग प्रॉक्सी का उपयोग करना भी महत्वपूर्ण है। इन परदे के पीछे प्रॉक्सी रोटेशन और एक विश्वसनीय पूल के लिए एक अच्छा एल्गोरिथ्म होना चाहिए।

import requests
import time

def send_request_with_advance_retry_mechanism(url, max_retries=3, delay=1, min_content_length=10):
    """
    एक उन्नत रिट्री तंत्र के साथ निर्दिष्ट URL के लिए एक HTTP GET अनुरोध भेजता है।

    Parameters:
        url (str): अनुरोध भेजने के लिए URL।
        max_retries (int): अनुरोध को पुनः प्राप्त करने के लिए अधिकतम संख्या। डिफ़ॉल्ट 3 है।
        delay (int): रिट्रीज के बीच देरी (सेकंड में)। डिफ़ॉल्ट 1 है।
   
    Raises:
        requests.RequestException: यदि सभी पुनर्विचार विफल हो जाते हैं तो अंतिम अपवाद उठाता है।
    """
    
    proxies = {
        "http": "http://USER:PASS@HOST:PORT",
        "https": "https://USER:PASS@HOST:PORT"
    }
    
    for attempt in range(max_retries):
        try:
            response = requests.get(url, proxies=proxies, verify=False)
            # 4xx या 5xx स्थिति कोड के लिए एक अपवाद बढ़ाएं
            response.raise_for_status()
            
            # जाँच करें कि क्या प्रतिक्रिया स्थिति कोड 404 है
            if response.status_code == 404:
                print("404 Error: Not Found")
                break  # 404 त्रुटियों के लिए लूप से बाहर निकलें
            
          # जाँच करें कि क्या प्रतिक्रिया पाठ की लंबाई 10 वर्णों से कम है
            if len(response.text) < min_content_length:
                print("Response text length is less than 10 characters. Retrying...")
                time.sleep(delay)
                continue  # अनुरोध करें
            
            print('Response Status Code:', response.status_code)
           # यदि शर्तें पूरी होती हैं, तो लूप से बाहर निकलें
            break
            
        except requests.RequestException as e:
            print(f"Attempt {attempt+1} failed:", e)
            if attempt < max_retries - 1:
                print(f"Retrying in {delay} seconds...")
                time.sleep(delay)
            else:
                print("Max retries exceeded.")
                # अंतिम अपवाद को फिर से बढ़ाएं यदि मैक्स रिट्रीज़ पहुंच गया
                raise

send_request_with_advance_retry_mechanism('https://httpbin.org/status/404')

पायथन में अनुरोध रिट्रीज प्रभावी वेब स्क्रैपिंग के लिए महत्वपूर्ण हैं। जिन तरीकों से हमने रिट्रीज का प्रबंधन करने के लिए चर्चा की है, वे डेटा संग्रह की दक्षता और विश्वसनीयता को अवरुद्ध करने और बढ़ाने से रोकने में मदद कर सकते हैं। इन तकनीकों को लागू करने से आपकी वेब स्क्रैपिंग स्क्रिप्ट को अधिक मजबूत और बॉट प्रोटेक्शन सिस्टम द्वारा पता लगाने के लिए अतिसंवेदनशील बना देगा।

टिप्पणियाँ:

0 टिप्पणियाँ