ازگر میں درخواست کی کوششوں کو کیسے نافذ کریں

تبصرے: 0

ویب سے ڈیٹا نکالنے کے لئے ویب سکریپنگ ایک موثر طریقہ ہے۔ بہت سے ڈویلپرز ویب سکریپنگ پروجیکٹس کو انجام دینے کے لئے ازگر کی درخواستوں کی لائبریری کو استعمال کرنے کو ترجیح دیتے ہیں کیونکہ یہ آسان اور موثر ہے۔ تاہم ، جیسا کہ یہ بہت اچھا ہے ، درخواست کی لائبریری کی اپنی حدود ہیں۔ ویب سکریپنگ میں ایک عام مسئلہ جس کا ہم سامنا کرسکتے ہیں وہ ناکام درخواستوں ہے ، جو اکثر غیر مستحکم ڈیٹا نکالنے کا باعث بنتے ہیں۔ اس مضمون میں ، ہم ازگر میں درخواست کی کوششوں کو نافذ کرنے کے عمل سے گزریں گے ، لہذا آپ HTTP کی غلطیوں کو سنبھال سکتے ہیں اور اپنے ویب سکریپنگ اسکرپٹس کو مستحکم اور قابل اعتماد رکھ سکتے ہیں۔

درخواستوں کی لائبریری سے شروعات کرنا

آئیے پہلے اپنا ماحول قائم کریں۔ اس بات کو یقینی بنائیں کہ آپ نے ازگر انسٹال کیا ہے اور اپنی پسند کا کوئی IDE ہے۔ پھر درخواستوں کی لائبریری کو انسٹال کریں اگر آپ کے پاس پہلے سے موجود نہیں ہے۔

pip install requests

ایک بار انسٹال ہونے کے بعد ، آئیے ازگر کے درخواستوں کے ماڈیول کا استعمال کرتے ہوئے مثال ڈاٹ کام پر ایک درخواست بھیجیں۔ یہاں ایک سادہ سا فنکشن ہے جو صرف وہی کرتا ہے:

import requests

def send_request(url):
    """
   مخصوص URL کو ایک HTTP GET درخواست بھیجتا ہے اور ردعمل کی حیثیت کا کوڈ پرنٹ کرتا ہے۔
    
    Parameters:
        url (str): درخواست بھیجنے کے لئے یو آر ایل۔
    """
    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 کی درخواست مکمل ہوگئی۔ یہ سرور کا یہ کہنے کا طریقہ ہے ، "یہاں سب کچھ اچھا ہے ، آپ کی درخواست کامیابی تھی"۔

یہ اسٹیٹس کوڈ BOT کی کھوج میں اور اس بات کی نشاندہی کرنے میں بھی کردار ادا کرسکتے ہیں کہ جب BOT جیسے طرز عمل کی وجہ سے رسائی محدود ہے۔

ذیل میں HTTP غلطی والے کوڈوں کا ایک تیز رینڈاؤن ہے جو بنیادی طور پر BOT کا پتہ لگانے اور توثیق کے امور کی وجہ سے ہوتا ہے۔

  1. 429 بہت ساری درخواستیں: یہ اسٹیٹس کوڈ اس بات کی نشاندہی کرتا ہے کہ صارف نے ایک مقررہ وقت میں بہت زیادہ درخواستیں بھیجی ہیں ("شرح کو محدود کرنا")۔ جب بوٹس پہلے سے طے شدہ درخواست کی حدود سے تجاوز کرتے ہیں تو یہ ایک عام جواب ہے۔
  2. 403 ممنوع: جب سرور درخواست کو پورا کرنے سے انکار کرتا ہے تو یہ کوڈ واپس کردیا جاتا ہے۔ یہ اس وقت ہوسکتا ہے جب سرور کو شبہ ہے کہ درخواست صارف کے ایجنٹ یا دیگر معیارات پر مبنی بوٹ سے آرہی ہے۔
  3. 401 غیر مجاز: یہ حیثیت استعمال کی جاسکتی ہے اگر رسائی میں توثیق کی ضرورت ہو جو BOT کے پاس نہیں ہے۔
  4. 503 سروس دستیاب نہیں: بعض اوقات اس بات کی نشاندہی کرنے کے لئے استعمال کیا جاتا ہے کہ سرور عارضی طور پر درخواست کو سنبھالنے سے قاصر ہے ، جو خودکار ٹریفک اسپائکس کے دوران ہوسکتا ہے۔

ازگر میں دوبارہ کوشش کرنے کا طریقہ کار

آئیے اب درخواستوں کی لائبریری کے ساتھ HTTP کی درخواست حاصل کرنے کے لئے ازگر میں ایک سادہ دوبارہ کوشش کا طریقہ کار لکھتے ہیں۔ ایسے اوقات ہوتے ہیں جب نیٹ ورک کی درخواستیں کچھ نیٹ ورک کی پریشانی یا سرور اوورلوڈ کی وجہ سے ناکام ہوجاتی ہیں۔ لہذا اگر ہماری درخواست ناکام ہوجاتی ہے تو ، ہمیں ان درخواستوں کی دوبارہ کوشش کرنی چاہئے۔

بنیادی دوبارہ کوشش کرنے کا طریقہ کار

فنکشن بھیجنا_request_with_basic_retry_mechanism http کو ایک دیئے گئے URL سے درخواستیں حاصل کرتا ہے جس میں ایک بنیادی دوبارہ کوشش کرنے والے میکانزم کی جگہ ہوتی ہے جو صرف اس صورت میں دوبارہ کوشش کرے گی جب کسی نیٹ ورک یا رعایت کی استثنا جیسے رابطے کی خرابی کا سامنا کرنا پڑتا ہے۔ یہ زیادہ سے زیادہ وقت کی زیادہ سے زیادہ درخواست کی درخواست کی کوشش کرے گا۔ اگر تمام کوششیں اس طرح کی رعایت کے ساتھ ناکام ہوجاتی ہیں تو ، اس سے آخری سامنا کرنا پڑتا ہے۔

import requests
import time

def send_request_with_basic_retry_mechanism(url, max_retries=2):
    """
  ایک بنیادی دوبارہ کوشش کرنے والے میکانزم کے ساتھ یو آر ایل کو ایک HTTP حاصل کریں درخواست بھیجتا ہے۔
    
    Parameters:
        url (str): درخواست بھیجنے کے لئے یو آر ایل۔
        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')

ایڈوانس ریٹری میکانزم

آئیے اب منظرناموں کو سنبھالنے کے لئے بنیادی کوشش کرنے والے بنیادی طریقہ کار کو اپناتے ہیں جہاں ہم جس ویب سائٹ کو کھرچنے کی کوشش کر رہے ہیں وہ بوٹ کا پتہ لگانے کے طریقہ کار کو نافذ کرنے کی کوشش کر رہے ہیں جس کے نتیجے میں مسدود ہوسکتا ہے۔ اس طرح کے منظرناموں کو حل کرنے کے ل we ، ہمیں متعدد بار درخواست کو تندہی سے دوبارہ کوشش کرنے کی ضرورت ہے ، کیونکہ وہ صرف بوٹ کا پتہ لگانے والے بلاکس نہیں ہوسکتے ہیں بلکہ یہ نیٹ ورک یا سرور کی پریشانیوں کی وجہ سے بھی ہوسکتے ہیں۔

مندرجہ ذیل فنکشن کو بھیجنا_request_with_advance_retry_mechanism ، اختیاری دوبارہ کوشش کرنے کی کوششوں اور دوبارہ کوشش میں تاخیر کے ساتھ فراہم کردہ URL کو ایک HTTP حاصل کرنے کی درخواست بھیجتا ہے۔ یہ کوششوں کی مخصوص تعداد کے لئے متعدد بار درخواست بھیجنے کی کوشش کرتا ہے اور اگر درخواست کو کامیابی کے ساتھ جواب مل جاتا ہے تو جوابی حیثیت کا کوڈ پرنٹ کرتا ہے۔ اگر درخواست کے آپریشن کے دوران اس کا سامنا کرنا پڑتا ہے تو ، یہ غلطی کے پیغام کو پرنٹ کرتا ہے اور اسے دوبارہ آزماتا ہے۔ یہ ہر کوشش کے مابین مخصوص کوششوں میں تاخیر کا انتظار کرتا ہے۔ اگر دوبارہ کوششوں کی مخصوص تعداد کے بعد بھی درخواست ناکام ہوجاتی ہے تو ، اس سے آخری رعایت کا سامنا کرنا پڑتا ہے۔

تاخیر کا پیرامیٹر اہم ہے کیونکہ یہ قریبی وقفے پر متعدد درخواستوں کے ساتھ سرور پر بمباری سے گریز کرتا ہے۔ اس کے بجائے ، یہ سرور کا انتظار کرتا ہے کہ درخواست پر کارروائی کے ل enough کافی وقت ہو ، جس سے سرور یہ سوچے کہ انسان اور بوٹ نہیں درخواستیں دے رہا ہے۔ لہذا ، سرور اوورلوڈ یا سرور کے سست ردعمل سے بچنے کے لئے دوبارہ کوشش کرنے والے میکانزم میں تاخیر ہونی چاہئے جو اینٹی بوٹ میکانزم کو متحرک کرسکتی ہے۔

import requests
import time

def send_request_with_advance_retry_mechanism(url, max_retries=3, delay=1):
    """
  اعلی درجے کی دوبارہ کوشش کرنے والے طریقہ کار کے ساتھ مخصوص URL کو HTTP GET GET درخواست بھیجتا ہے۔
    
    Parameters:
        url (str): درخواست بھیجنے کے لئے یو آر ایل۔
        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 GET درخواست بھیجتا ہے۔

    Parameters:
        url (str): درخواست بھیجنے کے لئے یو آر ایل۔
        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  # 404 غلطیوں کے لئے لوپ سے باہر نکلیں
            
            # چیک کریں کہ آیا ردعمل کے متن کی لمبائی مخصوص کم سے کم مواد کی لمبائی سے کم ہے یا نہیں
            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 بہت ساری درخواستوں کے لئے ، گھومنے والی پراکسیوں کا استعمال آپ کی درخواستوں کو تقسیم کرنے اور شرح کو محدود کرنے سے بچنے میں مدد کرسکتا ہے۔

نیچے دیئے گئے کوڈ پراکسیوں کے استعمال کے ساتھ ساتھ ایک اعلی درجے کی دوبارہ کوشش کی حکمت عملی بھی نافذ کرتا ہے۔ اس طرح ، ہم ازگر کی درخواستوں کی دوبارہ کوشش کرنے والے طریقہ کار کو نافذ کرسکتے ہیں۔ اعلی معیار کے ویب سکریپنگ پراکسیوں کا استعمال بھی ضروری ہے۔ ان پراکسیوں میں پراکسی گردش اور قابل اعتماد تالاب کے ل a ایک اچھا الگورتھم ہونا چاہئے۔

import requests
import time

def send_request_with_advance_retry_mechanism(url, max_retries=3, delay=1, min_content_length=10):
    """
  اعلی درجے کی دوبارہ کوشش کرنے والے طریقہ کار کے ساتھ مخصوص URL کو HTTP GET GET درخواست بھیجتا ہے۔

    Parameters:
        url (str): درخواست بھیجنے کے لئے یو آر ایل۔
        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 تبصرے