بازگشت به وبلاگ

چگونه زمان‌بندی و منطق تلاش مجدد را برای پروکسی تنظیم کنیم: حفاظت از داده‌ها در هنگام تجزیه و تحلیل

بیاموزید چگونه زمان‌سنجی و منطق تلاش مجدد را برای پروکسی به درستی تنظیم کنید تا از دست دادن داده‌ها در هنگام پارسینگ، اتوماسیون و کار با حساب‌های تبلیغاتی جلوگیری کنید.

📅۸ اسفند ۱۴۰۴
```html

هنگامی که با پروکسی برای پارسینگ بازارها، اتوماسیون شبکه‌های اجتماعی یا جمع‌آوری داده‌ها کار می‌کنید، رایج‌ترین مشکل، درخواست‌های معلق و داده‌های از دست رفته است. سرور پروکسی ممکن است به موقع پاسخ ندهد، اتصال ممکن است قطع شود و اسکریپت شما ممکن است برای چند دقیقه معلق بماند. در نتیجه، شما زمان، داده‌ها و پول خود را از دست می‌دهید.

در این راهنما، من نشان می‌دهم که چگونه به درستی timeout (زمان انتظار) و منطق retry (منطق تلاش مجدد) را برای کار با پروکسی تنظیم کنید. شما خواهید آموخت که چه مقادیر تایم‌اوتی برای وظایف مختلف استفاده کنید، چگونه به‌طور خودکار در صورت بروز خطاها دوباره متصل شوید و چگونه هیچ درخواست را از دست ندهید. این مقاله هم برای کسانی که کد را به زبان Python می‌نویسند و هم برای کسانی که از ابزارهای آماده پارسینگ استفاده می‌کنند مناسب است.

چرا timeout در کار با پروکسی حیاتی است

فرض کنید: شما یک پارسر قیمت با Wildberries برای 10,000 محصول راه‌اندازی کرده‌اید. اسکریپت از طریق پروکسی کار می‌کند تا از مسدود شدن جلوگیری کند. همه چیز خوب پیش می‌رود، اما در درخواست 523، سرور پروکسی دیگر پاسخ نمی‌دهد — ممکن است بارگذاری شده باشد یا به‌طور موقت در دسترس نباشد. بدون تنظیم تایم‌اوت، اسکریپت شما برای پاسخ به‌طور نامحدود منتظر خواهد ماند (یا تا زمانی که تایم‌اوت سیستم در 2-5 دقیقه به پایان برسد). در نهایت، پارسینگ متوقف می‌شود، شما زمان را از دست می‌دهید و تا زمانی که مشکل را متوجه شوید، ممکن است چند ساعت گذشته باشد.

Timeout (زمان انتظار) — حداکثر زمان انتظار برای دریافت پاسخ از سرور است. اگر سرور در این زمان پاسخ ندهد، درخواست قطع می‌شود و شما می‌توانید یا تلاش را از طریق پروکسی دیگری تکرار کنید یا خطا را در لاگ ثبت کنید. این موضوع به‌ویژه در کار با پروکسی اهمیت دارد، زیرا:

  • سرورهای پروکسی ممکن است ناپایدار باشند — به‌ویژه پروکسی‌های عمومی یا ارزان. حتی پروکسی‌های مسکونی با کیفیت گاهی اوقات به دلیل قطع اتصال کاربر واقعی از اینترنت، ارتباط را از دست می‌دهند.
  • سایت هدف ممکن است IP را مسدود کند — اگر پروکسی در لیست مسدود شده باشد، به‌طور کلی پاسخ نخواهد داد یا بسیار دیر پاسخ خواهد داد (با ارسال کپچا یا ریدایرکت).
  • تاخیرهای شبکه غیرقابل پیش‌بینی هستند — به‌ویژه هنگام استفاده از پروکسی‌های کشورهای دیگر. درخواست ممکن است از چندین گره میانی عبور کند.
  • عملیات‌های انبوه به ثبات نیاز دارند — اگر شما 100,000 صفحه را پارس می‌کنید یا 50 حساب اینستاگرام را مدیریت می‌کنید، حتی 1% درخواست‌های معلق = 1000 عملیات از دست رفته است.

بدون تایم‌اوت‌های به درستی تنظیم شده، اسکریپت شما زمان را صرف انتظار برای پروکسی‌های غیرقابل دسترس می‌کند به جای اینکه به پروکسی‌های کارآمد سوئیچ کند. این موضوع به‌طور مستقیم بر سرعت کار و ثبات نتیجه تأثیر می‌گذارد.

انواع تایم‌اوت‌ها: connect، read و total timeout

سه نوع اصلی تایم‌اوت وجود دارد که باید به‌طور جداگانه درک و تنظیم شوند. بسیاری از توسعه‌دهندگان مبتدی و کاربران پارسرها فقط یک تایم‌اوت کلی تنظیم می‌کنند که منجر به مشکلات می‌شود.

1. Connect timeout (تایم‌اوت اتصال)

این زمان اختصاص داده شده برای برقراری اتصال با سرور پروکسی است. اگر در این زمان اتصال برقرار نشود — درخواست قطع می‌شود. Connect timeout مسئول دست دادن اولیه (TCP handshake) بین کلاینت شما و پروکسی است.

زمانی که فعال می‌شود: سرور پروکسی در دسترس نیست، بارگذاری شده است یا IP توسط فایروال مسدود شده است.

مقادیر توصیه شده:

  • برای پروکسی‌های دیتا سنتر سریع: 3-5 ثانیه
  • برای پروکسی‌های مسکونی: 5-10 ثانیه
  • برای پروکسی‌های موبایل: 10-15 ثانیه (اینترنت موبایل کندتر است)

2. Read timeout (تایم‌اوت خواندن)

این زمان انتظار برای دریافت پاسخ از سرور هدف پس از برقراری اتصال با پروکسی است. اگر سرور در این زمان داده‌ها را ارسال نکند — درخواست قطع می‌شود. Read timeout از موقعیت‌هایی که سرور درخواست را پذیرفته اما «معلق» شده و پاسخ نمی‌دهد، محافظت می‌کند.

زمانی که فعال می‌شود: سایت هدف به آرامی درخواست را پردازش می‌کند، بارگذاری شده است یا به‌طور عمدی درخواست‌های مشکوک را کند می‌کند.

مقادیر توصیه شده:

  • برای پارسینگ صفحات ساده (HTML): 10-15 ثانیه
  • برای پارسینگ با رندرینگ JavaScript: 30-60 ثانیه
  • برای درخواست‌های API: 5-10 ثانیه
  • برای دانلود فایل‌های بزرگ: 120+ ثانیه

3. Total timeout (تایم‌اوت کلی)

این حداکثر زمان برای انجام کل درخواست از ابتدا تا انتها، شامل اتصال، ارسال درخواست، دریافت و خواندن پاسخ است. Total timeout یک «قطع‌کننده اضطراری» است که تضمین می‌کند هیچ درخواست بیش از زمان تعیین شده انجام نشود.

زمانی که استفاده می‌شود: زمانی که برای شما مهم است که هر درخواست در چارچوب زمانی دقیقی قرار گیرد (به‌عنوان مثال، هنگام پارسینگ در زمان واقعی برای آربیتراژ).

فرمول: Total timeout = Connect timeout + Read timeout + 20-30% ذخیره

مهم: همه کتابخانه‌ها و ابزارها از تنظیم جداگانه connect و read تایم‌اوت‌ها پشتیبانی نمی‌کنند. به‌عنوان مثال، کتابخانه requests در Python اجازه می‌دهد هر دو مقدار را به‌صورت یک تاپل مشخص کنید: timeout=(5, 15)، که در آن 5 — connect و 15 — read است.

مقادیر بهینه تایم‌اوت‌ها برای وظایف مختلف

مقادیر صحیح تایم‌اوت‌ها به وظیفه شما، نوع پروکسی و سایت هدف بستگی دارد. تایم‌اوت‌های بسیار کوتاه منجر به تعداد زیادی خطای کاذب می‌شود (پروکسی کار می‌کند، اما شما آن را رد می‌کنید). تایم‌اوت‌های بسیار طولانی نیز منجر به از دست دادن زمان در انتظار پروکسی‌های مرده می‌شود.

وظیفه Connect timeout Read timeout توضیحات
پارسینگ Wildberries، Ozon 5-7 ثانیه 15-20 ثانیه بازارها ممکن است صفحات با تعداد زیادی محصول را به آرامی بارگذاری کنند
پارسینگ Avito، Yandex.Market 5-7 ثانیه 10-15 ثانیه معمولاً سایت‌های سریع، اما ممکن است IP‌های مشکوک را مسدود کنند
اتوماسیون اینستاگرام، TikTok 7-10 ثانیه 20-30 ثانیه از پروکسی‌های موبایل استفاده کنید — آن‌ها کندتر هستند، اما پایدارترند
کار با Facebook Ads API 5 ثانیه 10-15 ثانیه API معمولاً سریع هستند، اما ممکن است در صورت محدودیت نرخ کند شوند
پارسینگ از طریق Selenium/Puppeteer 10 ثانیه 60-120 ثانیه رندرینگ JavaScript به زمان نیاز دارد، به‌ویژه در پروکسی‌های کند
بررسی انبوه پروکسی 3-5 ثانیه 5-7 ثانیه بررسی سریع در دسترس بودن، پروکسی‌های کند رد می‌شوند

نکته: با تایم‌اوت‌های محافظه‌کارانه (طولانی‌تر) شروع کنید و به تدریج آن‌ها را کاهش دهید، در حالی که لاگ‌های خطا را تجزیه و تحلیل می‌کنید. اگر تعداد زیادی خطای تایم‌اوت را در پروکسی‌های کارآمد مشاهده می‌کنید — مقادیر را افزایش دهید. اگر اسکریپت به دلیل پروکسی‌های کند متوقف می‌شود — مقادیر را کاهش دهید.

منطق retry: چگونه به درستی تلاش‌های مجدد را تنظیم کنیم

تایم‌اوت مشکل درخواست‌های معلق را حل می‌کند، اما مشکل از دست دادن داده‌ها را حل نمی‌کند. اگر پروکسی پاسخ ندهد — شما فقط یک خطا دریافت می‌کنید و این درخواست را از دست می‌دهید. به همین دلیل، منطق retry (منطق تلاش مجدد) حیاتی است.

منطق retry — تکرار خودکار درخواست در صورت بروز خطا است. اصول اصلی تنظیم صحیح آن:

1. تعیین کنید کدام خطاها نیاز به تکرار دارند

همه خطاها نیاز به تکرار ندارند. به‌عنوان مثال:

  • نیاز به تکرار: Timeout، Connection refused، Proxy error، 502/503/504 (خطاهای موقتی سرور)، Rate limiting (429)
  • نیاز به تکرار ندارد: 404 (صفحه پیدا نشد)، 403 (دسترسی به‌طور دائمی ممنوع)، 401 (احراز هویت نادرست)، خطاهای اعتبارسنجی داده‌ها

2. تعداد تلاش‌ها را تنظیم کنید

تعداد بهینه retry به اهمیت داده‌ها بستگی دارد:

  • برای وظایف غیرحیاتی (پارسینگ برای تحلیل): 2-3 تلاش
  • برای وظایف مهم (نظارت بر قیمت‌های رقبا): 3-5 تلاش
  • برای وظایف حیاتی (کار با حساب‌های تبلیغاتی): 5-10 تلاش

3. از exponential backoff (تاخیر نمایی) استفاده کنید

درخواست را به‌طور فوری تکرار نکنید — این می‌تواند مشکل را تشدید کند (به‌عنوان مثال، اگر سرور بارگذاری شده است). از تاخیر افزایشی بین تلاش‌ها استفاده کنید:

  • تلاش اول: بلافاصله
  • تلاش دوم: پس از 1-2 ثانیه
  • تلاش سوم: پس از 4-5 ثانیه
  • تلاش چهارم: پس از 10-15 ثانیه

فرمول: تاخیر = تاخیر_پایه * (2 ^ شماره_تلاش). به‌عنوان مثال: 1 ثانیه، 2 ثانیه، 4 ثانیه، 8 ثانیه، 16 ثانیه.

4. چرخش پروکسی در تلاش‌های مجدد

مهم‌ترین قانون: در تلاش مجدد از پروکسی دیگری از مجموعه خود استفاده کنید. اگر یک پروکسی نتوانست درخواست را انجام دهد، احتمال اینکه در تکرار موفق شود بسیار کم است. اما یک پروکسی دیگر با احتمال زیاد موفق خواهد بود.

این موضوع به‌ویژه در کار با پروکسی‌های مسکونی اهمیت دارد، جایی که شما مجموعه‌ای از صدها یا هزاران آدرس IP دارید. در هر تلاش مجدد یک IP تصادفی جدید از مجموعه بگیرید.

مثال‌هایی از تنظیم timeout و retry در Python

بیایید به مثال‌های عملی پیاده‌سازی timeout و منطق retry در Python با استفاده از کتابخانه‌های محبوب بپردازیم.

مثال 1: تنظیم پایه با requests

کتابخانه requests — محبوب‌ترین کتابخانه برای درخواست‌های HTTP در Python است. اینگونه می‌توانید timeout و retry ساده را تنظیم کنید:

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

# تنظیم منطق retry
retry_strategy = Retry(
    total=5,  # حداکثر 5 تلاش
    backoff_factor=1,  # تاخیر: 1، 2، 4، 8، 16 ثانیه
    status_forcelist=[429, 500, 502, 503, 504],  # کدهای خطا برای retry
    allowed_methods=["HEAD", "GET", "POST", "PUT", "DELETE"]
)

adapter = HTTPAdapter(max_retries=retry_strategy)
session = requests.Session()
session.mount("http://", adapter)
session.mount("https://", adapter)

# تنظیم پروکسی
proxies = {
    'http': 'http://username:password@proxy.example.com:8080',
    'https': 'http://username:password@proxy.example.com:8080'
}

# انجام درخواست با timeout
try:
    response = session.get(
        'https://www.wildberries.ru/catalog/electronics',
        proxies=proxies,
        timeout=(5, 15)  # connect timeout 5 ثانیه، read timeout 15 ثانیه
    )
    print(f"موفقیت! وضعیت: {response.status_code}")
    print(f"اندازه پاسخ: {len(response.content)} بایت")
except requests.exceptions.Timeout:
    print("خطا: تایم‌اوت تجاوز کرد")
except requests.exceptions.ProxyError:
    print("خطا: مشکل با پروکسی")
except requests.exceptions.RequestException as e:
    print(f"خطای درخواست: {e}")

در این مثال، ما retry خودکار را در سطح جلسه تنظیم کردیم. در صورت بروز خطاهای 429، 500، 502، 503، 504، کتابخانه به‌طور خودکار درخواست را تا 5 بار با تاخیر نمایی تکرار خواهد کرد.

مثال 2: چرخش پروکسی در تلاش‌های مجدد

مثال پیشرفته‌تری با چرخش پروکسی از مجموعه در هر تلاش:

import requests
import random
import time

# مجموعه پروکسی (آن را با پروکسی‌های واقعی خود جایگزین کنید)
PROXY_POOL = [
    'http://user:pass@proxy1.example.com:8080',
    'http://user:pass@proxy2.example.com:8080',
    'http://user:pass@proxy3.example.com:8080',
    'http://user:pass@proxy4.example.com:8080',
]

def make_request_with_retry(url, max_retries=5, base_delay=1):
    """
    انجام درخواست با retry و چرخش پروکسی
    """
    for attempt in range(max_retries):
        # انتخاب یک پروکسی تصادفی از مجموعه
        proxy = random.choice(PROXY_POOL)
        proxies = {'http': proxy, 'https': proxy}
        
        try:
            response = requests.get(
                url,
                proxies=proxies,
                timeout=(5, 15),
                headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
            )
            
            # بررسی کد وضعیت
            if response.status_code == 200:
                return response
            elif response.status_code in [429, 500, 502, 503, 504]:
                # خطای موقتی - تکرار
                print(f"تلاش {attempt + 1}: کد {response.status_code}, تکرار...")
            else:
                # خطای دائمی - متوقف کردن
                print(f"خطا {response.status_code}, متوقف کردن تلاش‌ها")
                return None
                
        except (requests.exceptions.Timeout, 
                requests.exceptions.ProxyError,
                requests.exceptions.ConnectionError) as e:
            print(f"تلاش {attempt + 1}: خطا {type(e).__name__}, تکرار...")
        
        # اگر این آخرین تلاش نیست - با تاخیر نمایی منتظر بمانید
        if attempt < max_retries - 1:
            delay = base_delay * (2 ** attempt)
            print(f"انتظار {delay} ثانیه قبل از تلاش بعدی...")
            time.sleep(delay)
    
    print("تمام تلاش‌ها به پایان رسید")
    return None

# استفاده
result = make_request_with_retry('https://www.ozon.ru/category/smartfony-15502/')
if result:
    print(f"موفقیت! {len(result.content)} بایت داده دریافت شد")
else:
    print("نتوانستیم درخواست را انجام دهیم")

این کد در هر تلاش یک پروکسی جدید تصادفی از مجموعه انتخاب می‌کند که احتمال موفقیت درخواست را به‌طور قابل توجهی افزایش می‌دهد.

مثال 3: استفاده از کتابخانه tenacity

برای مدیریت منعطف‌تر منطق retry می‌توانید از کتابخانه تخصصی tenacity استفاده کنید:

from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
import requests

@retry(
    stop=stop_after_attempt(5),  # حداکثر 5 تلاش
    wait=wait_exponential(multiplier=1, min=1, max=30),  # تاخیر نمایی 1-30 ثانیه
    retry=retry_if_exception_type((requests.exceptions.Timeout, 
                                   requests.exceptions.ProxyError,
                                   requests.exceptions.ConnectionError))
)
def fetch_with_proxy(url, proxy):
    """
    تابعی با retry خودکار از طریق دکوراتور
    """
    proxies = {'http': proxy, 'https': proxy}
    response = requests.get(url, proxies=proxies, timeout=(5, 15))
    response.raise_for_status()  # در صورت خطای HTTP استثنا ایجاد می‌کند
    return response

# استفاده
try:
    result = fetch_with_proxy(
        'https://www.avito.ru/rossiya/telefony',
        'http://user:pass@proxy.example.com:8080'
    )
    print(f"موفقیت! وضعیت: {result.status_code}")
except Exception as e:
    print(f"نتوانستیم درخواست را پس از تمام تلاش‌ها انجام دهیم: {e}")

کتابخانه tenacity امکانات بسیار انعطاف‌پذیری برای تنظیم retry از طریق دکوراتورها فراهم می‌کند. نصب: pip install tenacity

راه‌حل‌های آماده برای پارسینگ بدون کد

اگر شما برنامه‌نویس نیستید یا می‌خواهید در زمان توسعه صرفه‌جویی کنید، ابزارهای آماده پارسینگ با پشتیبانی داخلی از تایم‌اوت و منطق retry وجود دارند. شما نیازی به نوشتن کد ندارید — فقط کافی است پارامترها را در رابط گرافیکی تنظیم کنید.

Octoparse

پارسر بصری محبوب برای Windows و Mac. تنظیم تایم‌اوت و retry:

  • تنظیمات وظیفه را باز کنید → گزینه‌های پیشرفته
  • Page Load Timeout: 20-30 ثانیه تنظیم کنید
  • Ajax Timeout: 10-15 ثانیه برای محتوای دینامیک
  • Retry Times: 3-5 تلاش در صورت خطا
  • در تنظیمات پروکسی می‌توانید لیست را بارگذاری کرده و چرخش خودکار را فعال کنید

ParseHub

پارسر ابری با طرح رایگان. تنظیم:

  • Settings → Advanced → Page Load Delay: 5-10 ثانیه
  • Request Timeout: 30 ثانیه
  • Retry Failed Requests: فعال کنید، 3 تلاش
  • پشتیبانی از پروکسی از طریق تنظیمات پروژه

Apify

پلتفرم برای اتوماسیون وظایف وب با بازیگران (اسکریپت‌ها) آماده برای پارسینگ سایت‌های محبوب. بسیاری از بازیگران برای پارسینگ بازارها (Wildberries، Ozon) دارای تنظیمات بهینه داخلی برای تایم‌اوت و retry هستند. شما فقط باید:

  • یک بازیگر آماده برای سایت مورد نظر را انتخاب کنید
  • پروکسی را مشخص کنید (پشتیبانی از ادغام با ارائه‌دهندگان پروکسی)
  • وظیفه را راه‌اندازی کنید — همه چیز به‌طور خودکار تنظیم شده است

مرورگرهای ضد شناسایی برای اتوماسیون

اگر با شبکه‌های اجتماعی یا پلتفرم‌های تبلیغاتی از طریق Dolphin Anty، AdsPower یا Multilogin کار می‌کنید، تایم‌اوت در پروفایل مرورگر تنظیم می‌شود:

  • Dolphin Anty: تنظیمات پروفایل → پروکسی → تایم‌اوت: 10-15 ثانیه
  • AdsPower: تنظیمات پروکسی → تایم‌اوت اتصال: 10 ثانیه، تایم‌اوت خواندن: 20 ثانیه
  • Multilogin: پروفایل مرورگر → شبکه → تایم‌اوت پروکسی: 15 ثانیه

هنگام اتوماسیون از طریق این مرورگرها (به‌عنوان مثال، با اسکریپت‌های Selenium) تایم‌اوت پروکسی از تنظیمات پروفایل به ارث می‌رسد، اما شما همچنین می‌توانید تایم‌اوت‌های اضافی را در سطح اسکریپت تنظیم کنید.

اشتباهات رایج در تنظیم تایم‌اوت‌ها

حتی توسعه‌دهندگان با تجربه و متخصصان پارسینگ نیز در هنگام کار با تایم‌اوت و retry اشتباهات رایجی مرتکب می‌شوند. در اینجا رایج‌ترین آن‌ها آورده شده است:

اشتباه 1: عدم وجود تایم‌اوت به‌طور کلی

بسیاری از کتابخانه‌ها به‌طور پیش‌فرض تایم‌اوت را تنظیم نمی‌کنند یا مقدار بسیار بزرگی (چند دقیقه) را تعیین می‌کنند. اگر شما تایم‌اوت را به‌طور صریح مشخص نکرده‌اید — اسکریپت شما ممکن است برای مدت طولانی معلق بماند.

راه‌حل: همیشه تایم‌اوت را به‌طور صریح در هر درخواست مشخص کنید. بهتر است پس از 15 ثانیه خطا دریافت کنید تا اینکه 5 دقیقه منتظر بمانید.

اشتباه 2: استفاده از پروکسی یکسان در تمام تلاش‌های مجدد

اگر پروکسی از اولین بار پاسخ ندهد، احتمال موفقیت در تکرار از طریق همان پروکسی بسیار کم است. بسیاری فراموش می‌کنند که پروکسی‌ها را بین تلاش‌ها بچرخانند.

راه‌حل: در هر تلاش مجدد از پروکسی جدیدی از مجموعه استفاده کنید. این موضوع برای نرخ موفقیت بالا حیاتی است.

اشتباه 3: تایم‌اوت‌های بسیار کوتاه برای پروکسی‌های کند

پروکسی‌های موبایل و برخی پروکسی‌های مسکونی ممکن است کندتر از دیتا سنترها باشند. اگر شما تایم‌اوت 5 ثانیه برای پروکسی موبایل تنظیم کنید — تعداد زیادی خطای کاذب روی IP‌های کاملاً کارآمد دریافت خواهید کرد.

راه‌حل: نوع پروکسی را در نظر بگیرید. برای پروکسی‌های موبایل حداقل تایم‌اوت 10-15 ثانیه استفاده کنید.

اشتباه 4: تلاش‌های بی‌پایان بدون محدودیت

برخی از افراد منطق retry را در حلقه while True بدون محدود کردن تعداد تلاش‌ها پیاده‌سازی می‌کنند. اگر مشکل در سمت سایت هدف باشد (به‌عنوان مثال، کاملاً از کار افتاده باشد) — اسکریپت به‌طور نامحدود تلاش خواهد کرد.

راه‌حل: همیشه تعداد retry را محدود کنید (حداکثر 3-10 تلاش) و درخواست‌های ناموفق را برای تجزیه و تحلیل بعدی لاگ کنید.

اشتباه 5: نادیده گرفتن نوع خطا

نیاز به تکرار همه خطاها نیست. به‌عنوان مثال، اگر شما 404 (صفحه پیدا نشد) را دریافت کنید — تکرار بی‌معنا است، صفحه‌ای وجود ندارد. اما 503 (سرویس به‌طور موقت در دسترس نیست) — منطقی است که پس از چند ثانیه تکرار کنید.

راه‌حل: نوع خطا را تجزیه و تحلیل کنید و فقط مشکلات موقتی (timeout، خطای اتصال، 429، 500، 502، 503، 504) را تکرار کنید.

اشتباه 6: عدم وجود لاگ‌گذاری

بدون لاگ‌ها، شما نخواهید فهمید که چرا درخواست‌ها شکست می‌خورند: آیا مشکل در پروکسی، تایم‌اوت‌ها یا سایت هدف است؟

راه‌حل: هر خطا را با مشخص کردن: کدام پروکسی استفاده شده، چه تایم‌اوتی وجود داشته، چند تلاش انجام شده و چه خطای خاصی رخ داده است، لاگ کنید. این به بهینه‌سازی تنظیمات کمک می‌کند.

نکته در انتخاب پروکسی: اگر شما به‌طور مکرر با خطاهای تایم‌اوت حتی با تنظیمات صحیح مواجه می‌شوید، ممکن است مشکل در کیفیت پروکسی باشد. پروکسی‌های عمومی ارزان یا مشترک معمولاً بارگذاری شده و به آرامی پاسخ می‌دهند. برای کارکرد پایدار، توصیه می‌کنیم از پروکسی‌های با کیفیت مسکونی با uptime تضمینی استفاده کنید.

نتیجه‌گیری

تنظیم صحیح تایم‌اوت و منطق retry — این فقط یک جزئیات فنی نیست، بلکه یک عامل حیاتی برای ثبات و کارایی کار با پروکسی است. بدون تایم‌اوت‌ها، اسکریپت‌های شما بر روی پروکسی‌های مرده معلق خواهند ماند و زمان را از دست خواهند داد. بدون منطق retry، شما داده‌ها را در صورت بروز خطاهای موقتی از دست خواهید داد. و بدون چرخش پروکسی در تلاش‌های مجدد — حتی با مجموعه IP با کیفیت، نرخ موفقیت پایینی خواهید داشت.

نکات اصلی این راهنما:

  • همیشه تایم‌اوت را به‌طور صریح تنظیم کنید: connect timeout 5-10 ثانیه، read timeout 10-30 ثانیه بسته به وظیفه
  • از منطق retry با محدودیت 3-5 تلاش و تاخیر نمایی استفاده کنید
  • پروکسی‌ها را در هر تلاش مجدد بچرخانید — این کلید نرخ موفقیت بالا است
  • فقط خطاهای موقتی را تکرار کنید (timeout، 429، 500، 502، 503، 504)، تلاش‌ها را برای دائمی‌ها (404، 403) هدر ندهید
  • تمام خطاها را برای تجزیه و تحلیل و بهینه‌سازی تنظیمات لاگ کنید
  • نوع پروکسی را در نظر بگیرید: پروکسی‌های موبایل کندتر از دیتا سنترها هستند، تایم‌اوت‌ها را به‌طور متناسب افزایش دهید

اگر شما با پارسینگ بازارها (Wildberries، Ozon، Avito)، اتوماسیون شبکه‌های اجتماعی یا پلتفرم‌های تبلیغاتی کار می‌کنید، ثبات پروکسی به‌طور مستقیم بر نتیجه شما تأثیر می‌گذارد. از پروکسی‌های با کیفیت با uptime بالا استفاده کنید و تایم‌اوت و retry را به‌درستی تنظیم کنید — این به شما ساعت‌ها زمان و هزاران درخواست از دست رفته را صرفه‌جویی خواهد کرد.

برای وظایفی که به حداکثر ثبات و حداقل تعداد خطاهای تایم‌اوت نیاز دارند، توصیه می‌کنیم پروکسی‌های دیتا سنتر را امتحان کنید — آن‌ها سرعت پاسخ‌دهی بالا و اتصال پایدار را فراهم می‌کنند که به‌ویژه در پارسینگ انبوه و اتوماسیون اهمیت دارد.

```