ویب اسکریپنگ اور ایجنٹس

AI کرالرز اور ایجنٹس میں HTTP 429 اور کلاؤڈ فلیئر 520 غلطیوں کا حل

فوری جواب: خرابی HTTP 429 درخواستوں کی حد (Rate Limit) سے تجاوز کو ظاہر کرتی ہے، جسے ڈیکوریلیٹڈ جٹر (Decorrelated Jitter) بیک آف اور رہائشی پراکسیز کے ذریعے حل کیا جاتا ہے۔ جب کہ کلاؤڈ فلیئر 520 خرابی ("Web Server Returned an Unknown Error") کرالر کے شدید دباؤ کے تحت اوریجن سرور کے کریش ہونے یا نامکمل TCP RST بھیجنے پر پیش آتی ہے۔

1. تعارف: خود مختار AI ویب کرالرز کی کمزوریاں

جب خود مختار AI ایجنٹس چیٹ انٹرفیس سے ملٹی اسٹیپ ریزننگ سسٹمز میں تبدیل ہو رہے ہیں، تو سب سے بڑی رکاوٹ نیٹ ورک کا عدم استحکام اور ایج سیکیورٹی (Edge CDN) ہے۔

پروڈکشن ایجنٹس ہر منٹ ہزاروں HTTP کالز بھیجتے ہیں۔ پرانے اسکریپرز کے مقابلے میں AI ایجنٹس کو ضرورت ہوتی ہے:

  1. انتہائی کم تاخیر کے ساتھ ہم وقت ساز ڈیٹا کا حصول۔
  2. جدید جاوا اسکرپٹ پر عمل درآمد۔
  3. ٹارگٹڈ مارک ڈاؤن کی صفائی تاکہ ٹوکن ضائع نہ ہوں۔

لیکن کلاؤڈ فلیئر اور ڈیٹا ڈوم جیسے سیکیورٹی سسٹم دو اہم خرابیاں پیدا کرتے ہیں:

  • HTTP 429 Too Many Requests: درخواستوں کی حد ختم ہونا۔
  • HTTP 520 Web Server Returned an Unknown Error: اوریجن سرور کا کلاؤڈ فلیئر سے رابطہ منقطع ہونا۔

2. HTTP 429 کی وجوہات

یہ خرابی تین درجات پر جنم لیتی ہے:

  1. پہلا درجہ: ایج ڈبلیو اے ایف (Cloudflare / DataDome): پائتھون کی JA4 فنگر پرنٹ اور براؤزر یوزر ایجنٹ میں فرق دیکھ کر بلاک کرنا۔
  2. دوسرا درجہ: API گیٹ وے (Kong, Envoy, Nginx): ٹوکن بکٹ اور لیکی بکٹ الگورتھم۔
  3. تیسرا درجہ: اوریجنل ویب سرور: ڈیٹا بیس پر ضرورت سے زیادہ بوجھ۔

اہم ہیڈرز: Retry-After, RateLimit-Limit, RateLimit-Remaining اور RateLimit-Reset۔


3. کلاؤڈ فلیئر 520 کی حقیقت

520 کوڈ کلاؤڈ فلیئر کی مخصوص خرابی ہے جو اوریجن سرور کی ناکامی کو ظاہر کرتی ہے:

  1. سرور پروسیس کریش (OOM / SIGSEGV): میموری ختم ہونے سے سرور کا بند ہونا اور TCP RST سگنل جانا۔
  2. Keep-Alive ٹائم آؤٹ کا فرق: کلاؤڈ فلیئر 15 سیکنڈ تک کنکشن رکھتا ہے، جبکہ سرور کا ٹائم آؤٹ 5 سیکنڈ ہو تو خرابی پیدا ہوتی ہے۔
  3. ہیڈر کا بڑا سائز (>16KB): ضرورت سے زیادہ کوکیز کا اخراج۔
  4. خالی جواب: سرور بغیر کسی ڈیٹا کے کنکشن کاٹ دے۔

4. الگورتھمک حل: Decorrelated Jitter اور سرکٹ بریکر

بار بار بلا سوچے سمجھے دوبارہ کوشش کرنا تھنڈرنگ ہرڈ (Thundering Herd) مسئلے کو جنم دیتا ہے۔ AWS کی تجویز کردہ بہترین تکنیک Decorrelated Jitter ہے:

# Decorrelated Jitter فارمولا:
sleep = min(cap, random.uniform(base, previous_delay * 3.0))

پائتھون کا مکمل کوڈ برائے سرکٹ بریکر

import asyncio, random, time, aiohttp
from urllib.parse import urlparse

class ResilientAgentCrawler:
    def __init__(self, base_delay=1.0, max_delay=60.0, max_retries=5, threshold=4, cooldown=30.0):
        self.base_delay = base_delay
        self.max_delay = max_delay
        self.max_retries = max_retries
        self.threshold = threshold
        self.cooldown = cooldown
        self.failures = {}
        self.opened_at = {}

    def _is_open(self, domain):
        t = self.opened_at.get(domain)
        if not t: return False
        if time.monotonic() - t > self.cooldown:
            del self.opened_at[domain]
            self.failures[domain] = 0
            return False
        return True

    async def fetch(self, session, url):
        domain = urlparse(url).netloc
        if self._is_open(domain):
            raise RuntimeError(f"سرکٹ بریکر فعال ہے: {domain}")

        delay = self.base_delay
        for attempt in range(1, self.max_retries + 1):
            try:
                async with session.get(url) as resp:
                    if resp.status == 200:
                        self.failures[domain] = 0
                        return await resp.text()
                    elif resp.status == 429:
                        retry_after = resp.headers.get("Retry-After")
                        wait = float(retry_after) if retry_after else random.uniform(self.base_delay, delay * 3.0)
                        delay = min(self.max_delay, wait)
                        await asyncio.sleep(delay)
                    elif resp.status in (520, 502, 503, 504):
                        self.failures[domain] = self.failures.get(domain, 0) + 1
                        if self.failures[domain] >= self.threshold:
                            self.opened_at[domain] = time.monotonic()
                        delay = min(self.max_delay, random.uniform(self.base_delay, delay * 3.0))
                        await asyncio.sleep(delay)
                    else:
                        resp.raise_for_status()
            except Exception as e:
                if attempt == self.max_retries: raise e
                await asyncio.sleep(delay)

5. براؤزر فنگر پرنٹ کی نقالی بذریعہ curl_cffi

2026 میں محض User-Agent بدلنا ناکافی ہے۔ کروم کے اصلی TLS اور HTTP/2 کی نقالی کے لیے curl_cffi اپنائیں:

from curl_cffi.requests import AsyncSession

async def fetch_stealth(url: str):
    async with AsyncSession(impersonate="chrome124") as s:
        res = await s.get(url, timeout=15)
        return res.text

6. پراکسی نیٹ ورکس اور اوریجن سرور کی ترتیب

  • روٹیٹنگ رہائشی پراکسیز: درخواستوں کو لاکھوں اصلی رہائشی آئی پیز پر تقسیم کرنا۔
  • موبائل پراکسیز (4G/5G بمعہ CGNAT): سب سے مؤثر طریقہ کیونکہ آئی پی عام صارفین کے ساتھ مشترک ہوتا ہے۔
  • اینجن ایکس سرور کنفیگریشن:
http {
    keepalive_timeout 75s;
    keepalive_requests 10000;
    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
}

7. نتیجہ

AI کرالرز کی پائیداری کے رہنما اصول:

  1. Decorrelated Jitter سے درخواستوں کے تصادم کو روکیں۔
  2. curl_cffi کے ذریعے اصلی براؤزر کے دستخط نقل کریں۔
  3. اوریجن سرور پر Keep-Alive کو 75 سیکنڈ پر مقرر کریں۔
  4. سرکٹ بریکر کے ذریعے ٹوکن بجٹ کا ضیاع روکیں۔
→ تمام مضامین
0 / 4