نحوه تشخیص علت نرخ موفقیت پایین: راهنمای مرحله به مرحله
نرخ موفقیت (Success Rate) درصدی از درخواستهای موفق از کل تعداد تلاشها است. وقتی این شاخص زیر حد نرمال میافتد، پول، زمان و دادهها از دست میروند. اما دهها علت میتواند وجود داشته باشد: از پیکربندی نادرست تا مسدودسازی سرور هدف. در این مقاله، رویکرد سیستماتیک برای تشخیص و یافتن راهحل را بررسی خواهیم کرد.
نرخ موفقیت چیست و حد نرمال کدام است
نرخ موفقیت (SR) = (درخواستهای موفق / کل تعداد درخواستها) × 100%
مقادیر نرمال بستگی به نوع کار دارد:
| کار | نرخ موفقیت نرمال | سطح بحرانی |
|---|---|---|
| تجزیه دادههای عمومی | 95–99% | کمتر از 85% |
| خودکارسازی SMM | 90–97% | کمتر از 80% |
| تایید تبلیغات | 98–99.5% | کمتر از 95% |
| ادغام API | 99–99.9% | کمتر از 98% |
اگر نرخ موفقیت 5–10% از خط پایه شما کاهش یابد — این سیگنال برای تشخیص است. اگر 20%+ کاهش یابد — اقدام فوری ضروری است.
اولین مراحل تشخیص
مرحله 1: گزارشها و معیارها را بررسی کنید
دادهها را برای 24–72 ساعت گذشته جمعآوری کنید:
- دقیقاً کی نرخ موفقیت کاهش یافت؟ (زمان دقیق)
- چند درصد درخواستها خطای 407 (Proxy Authentication Required) را برمیگرداند؟
- چند درصد — 429 (Too Many Requests)؟
- چند درصد — تایماوت (connection timeout)؟
- آیا بار (RPS — requests per second) تغییر کرده است؟
مرحله 2: تست جداگانه انجام دهید
از یک اسکریپت ساده برای بررسی پروکسی بدون برنامه شما استفاده کنید:
import requests
import time
proxy = "http://proxy_ip:port"
proxies = {"http": proxy, "https": proxy}
target_url = "https://httpbin.org/ip"
success = 0
failed = 0
for i in range(100):
try:
response = requests.get(
target_url,
proxies=proxies,
timeout=10,
verify=False
)
if response.status_code == 200:
success += 1
print(f"✓ تلاش {i+1}: موفق")
else:
failed += 1
print(f"✗ تلاش {i+1}: وضعیت {response.status_code}")
except Exception as e:
failed += 1
print(f"✗ تلاش {i+1}: {str(e)}")
time.sleep(0.5)
sr = (success / (success + failed)) * 100
print(f"\nنرخ موفقیت: {sr:.1f}%")
print(f"موفق: {success}، خطا: {failed}")
اگر این تست نرخ موفقیت نرمال را نشان دهد — مشکل در کد یا پیکربندی شما است. اگر نرخ موفقیت حتی اینجا پایین باشد — مشکل در پروکسی یا سرور هدف است.
مشکلات سمت پروکسی
خطای 407: Proxy Authentication Required
علل:
- نام کاربری/رمز عبور نادرست
- انقضای اعتبار حساب
- آدرس IP در فهرست سفید نیست (اگر مورد نیاز باشد)
- چرخش IP کار نمیکند یا غیرفعال است
راهحل:
import requests
# فرمت صحیح برای پروکسیهای مسکونی
proxy = "http://login:password@proxy-host:port"
proxies = {"http": proxy, "https": proxy}
# تست
response = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
print(response.text)
اضافهبار سرور پروکسی
اگر تمام کاربران سرویس تعداد عظیمی درخواست را بهطور همزمان ارسال کنند، ممکن است محدودیت RPS (requests per second) وجود داشته باشد. این نادر است، اما اتفاق میافتد.
بررسی کنید:
- RPS فعلی شما در بیشترین حد
- محدودیتهای تعرفه شما
- آیا خطاهای 429 در گزارشها وجود دارند
راهحل: تاخیر بین درخواستها اضافه کنید یا تعرفه را ارتقا دهید.
کیفیت آدرسهای IP
برای پروکسیهای مسکونی نرخ موفقیت پایین میتواند به معنای چرخش آدرسهای IP مسدود شده باشد. بررسی کنید:
- چند درصد آدرسهای IP خطای 403 Forbidden را برمیگرداند؟
- آیا یک و یک آدرس تکرار میشود؟
- آیا الگویی وجود دارد — یک کشور/منطقه کار میکند، دیگری نه؟
مسدودسازیها و فیلترهای سرور هدف
خطای 429: Too Many Requests
سرور هدف درخواستهای بسیار زیادی را از یک IP یا بهطور کلی میبیند. راهحلها:
- تاخیر اضافه کنید: `time.sleep(random.uniform(1, 3))`
- چرخش IP استفاده کنید: هر درخواست — IP جدید
- RPS را کاهش دهید: درخواستها را بهطور متوالی ارسال کنید، نه بهطور موازی
- سرصحتهای واقعگرایانه اضافه کنید: User-Agent، Referer، Accept-Language
خطای 403 Forbidden
سرور IP شما (یا IP پروکسی) را مسدود کرده است. این میتواند باشد:
- فیلتر بر اساس موقعیت جغرافیایی
- فهرست سیاه سرویسهای پروکسی
- آشکارساز ربات (JavaScript، CAPTCHA)
راهحل: از پروکسیهای موبایلی یا پروکسیهای مسکونی با چرخش استفاده کنید. آنها برای مسدودسازی دشوارتر هستند.
خطای 403: بررسی User-Agent
برخی سرویسها درخواستهای با User-Agent مشکوک را رد میکنند:
import requests
import random
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15"
]
headers = {
"User-Agent": random.choice(user_agents),
"Accept-Language": "en-US,en;q=0.9",
"Accept": "text/html,application/xhtml+xml",
"Referer": "https://google.com"
}
response = requests.get(
"https://target-site.com",
headers=headers,
proxies={"http": proxy, "https": proxy},
timeout=10
)
print(response.status_code)
خطاهای کد کلاینت
مدیریت نادرست استثناها
خطای رایج: کد خطای اتصال را درخواست ناموفق میداند، اما سعی برای اتصال مجدد نمیکند:
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
# روش صحیح با retries
session = requests.Session()
retry_strategy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[429, 500, 502, 503, 504],
allowed_methods=["GET", "POST"]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)
try:
response = session.get(url, proxies=proxies, timeout=10)
except requests.exceptions.RequestException as e:
print(f"خطا: {e}")
# ثبت و انتقال به درخواست بعدی
تایماوتهای نادرست
اگر تایماوت خیلی کوتاه باشد (1–2 ثانیه)، پروکسیهای کند رد میشوند:
- برای تجزیه معمولی: 10–30 ثانیه
- برای پروکسیهای موبایلی: 15–45 ثانیه
- برای API: 5–10 ثانیه
خطاهای SSL/TLS
اگر از `verify=False` استفاده کنید، این میتواند مشکلات واقعی را پنهان کند. بهتر است گواهیها را بهروز کنید:
import requests
import certifi
# صحیح
response = requests.get(
url,
proxies=proxies,
verify=certifi.where(), # به جای verify=False
timeout=15
)
مشکلات شبکه و تایماوت
Connection timeout در مقابل Read timeout
تفاوت مهم است:
- Connection timeout: پروکسی پاسخ نمیدهد (مشکل پروکسی یا شبکه)
- Read timeout: سرور هدف دادهها را بهآرامی ارسال میکند (مشکل سرور هدف)
import requests
# timeout = (connection_timeout, read_timeout)
try:
response = requests.get(
url,
proxies=proxies,
timeout=(5, 15) # 5 ثانیه برای اتصال، 15 برای خواندن
)
except requests.exceptions.ConnectTimeout:
print("پروکسی پاسخ نمیدهد")
except requests.exceptions.ReadTimeout:
print("سرور هدف کند است")
مشکلات DNS
اگر سرور هدف حل نشود، این خطای پروکسی نیست:
import socket
# DNS را بدون پروکسی بررسی کنید
try:
ip = socket.gethostbyname("target-site.com")
print(f"حل شد: {ip}")
except socket.gaierror:
print("خطای DNS — سایت پیدا نشد")
چکلیست تشخیص نرخ موفقیت پایین
- خط پایه را تعیین کنید: نرخ موفقیت نرمال قبلاً چه بود؟
- تست جداگانه را اجرا کنید (اسکریپت بالا) با 100 درخواست
- گزارشها را بررسی کنید: کدام HTTP-کد غالب است؟ (407، 429، 403، تایماوت؟)
- اگر 407: نام کاربری/رمز عبور و فهرست سفید IP را بررسی کنید
- اگر 429: تاخیر بین درخواستها اضافه کنید، چرخش IP استفاده کنید
- اگر 403: User-Agent، Referer را بررسی کنید، سرصحتهای واقعگرایانه اضافه کنید
- اگر تایماوت: timeout را افزایش دهید، RPS را بررسی کنید، منطق retry استفاده کنید
- کد خود را بررسی کنید: مدیریت صحیح استثناها، تایماوتهای صحیح
- سرور هدف را بررسی کنید: آیا مستقیماً (بدون پروکسی) دسترسیپذیر است؟
- اگر بقیه کارها کمک نکرد: نوع پروکسی یا ارائهدهنده دیگری را امتحان کنید
جدول تشخیص سریع
| HTTP-کد | علت احتمالی | راهحل |
|---|---|---|
| 407 | نام کاربری/رمز عبور پروکسی نادرست | نام کاربری/رمز عبور، فهرست سفید IP را بررسی کنید |
| 429 | درخواستهای بسیار زیاد | تاخیر اضافه کنید، چرخش IP استفاده کنید |
| 403 | IP مسدود یا آشکارساز ربات | سرصحتهای واقعگرایانه اضافه کنید، پروکسیهای موبایلی استفاده کنید |
| Timeout | پروکسی کند یا سرور هدف اضافهبار | timeout را افزایش دهید، RPS را بررسی کنید |
| Connection refused | سرور پروکسی دسترسیپذیر نیست | IP:port را بررسی کنید، وضعیت پروکسی را بررسی کنید |
خلاصه
نرخ موفقیت پایین — علامت است، نه بیماری. علل میتواند بسیار متنوع باشد: از اشتباه تایپی در کد تا مسدودسازی توسط سرور هدف. تشخیص سیستماتیک — کلید حل مسئله است:
- معیارها و گزارشها را بررسی کنید
- مشکل را جداگانه کنید (پروکسی در مقابل سرور هدف در مقابل کد شما)
- نوع خطا را تعیین کنید (407، 429، 403، timeout)
- راهحل مناسب را اعمال کنید
برای کارهایی که نیاز به قابلیت اطمینان و نرخ موفقیت بالا دارند، پروکسیهای مسکونی با چرخش IP توصیه میشوند. آنها برای تشخیص دشوارتر و پایدارتر هستند. تست رایگان را در proxycove.com امتحان کنید و روی کار خود تست کنید.