العودة إلى المدونة

كيفية تشخيص أسباب معدل النجاح المنخفض

معدل نجاح الوكيل هو مقياس حاسم لأي مشروع. دعنا نتفهم كيفية تحديد سبب الانخفاض واستعادة الفعالية.

📅١٢ جمادى الآخرة ١٤٤٧ هـ

كيفية تشخيص سبب معدل النجاح المنخفض: دليل خطوة بخطوة

معدل النجاح (Success Rate) هو نسبة الطلبات الناجحة من إجمالي عدد المحاولات. عندما ينخفض هذا المؤشر عن المعدل الطبيعي، تُفقد الأموال والوقت والبيانات. لكن قد تكون هناك عشرات الأسباب: من التكوين غير الصحيح إلى حجب خادم الهدف. في هذه المقالة، سنناقش نهجاً منهجياً للتشخيص والعثور على الحل.

ما هو معدل النجاح والمعدل الطبيعي

معدل النجاح (SR) = (الطلبات الناجحة / إجمالي عدد الطلبات) × 100%

تعتمد القيم الطبيعية على نوع المهمة:

المهمة معدل النجاح الطبيعي المستوى الحرج
تحليل البيانات العامة 95–99% أقل من 85%
أتمتة وسائل التواصل الاجتماعي 90–97% أقل من 80%
التحقق من الإعلانات 98–99.5% أقل من 95%
تكامل API 99–99.9% أقل من 98%

إذا انخفض معدل النجاح بنسبة 5–10% من خط الأساس الخاص بك — فهذا إشارة للتشخيص. إذا انخفض بنسبة 20%+ — يجب اتخاذ إجراءات عاجلة.

الخطوات الأولى للتشخيص

الخطوة 1: تحقق من السجلات والمقاييس

اجمع البيانات من آخر 24–72 ساعة:

  • متى بالضبط انخفض معدل النجاح؟ (الوقت الدقيق)
  • ما نسبة الطلبات التي تُرجع خطأ 407 (مطلوب مصادقة الوكيل)؟
  • ما نسبة الخطأ 429 (عدد كبير جداً من الطلبات)؟
  • ما نسبة انتهاء المهلة الزمنية (connection timeout)؟
  • هل تغيرت الحمل (RPS — عدد الطلبات في الثانية)؟

الخطوة 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: مطلوب مصادقة الوكيل

الأسباب:

  • بيانات اعتماد غير صحيحة (اسم المستخدم/كلمة المرور)
  • انتهت صلاحية الحساب
  • عنوان 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 (عدد الطلبات في الثانية). هذا نادر لكنه يحدث.

تحقق من:

  • عدد الطلبات الحالي في الذروة
  • حدود الخطة الخاصة بك
  • وجود أخطاء 429 في السجلات

الحل: أضف تأخيراً بين الطلبات أو قم بترقية الخطة.

جودة عناوين IP

بالنسبة للـ وكلاء سكنية قد يعني معدل النجاح المنخفض أنهم يدورون عناوين IP محجوبة. تحقق من:

  • ما نسبة عناوين IP التي تُرجع 403 Forbidden؟
  • هل تتكرر نفس العناوين؟
  • هل هناك نمط — دولة/منطقة واحدة تعمل، والأخرى لا؟

الحجب والمرشحات من جانب خادم الهدف

الخطأ 429: عدد كبير جداً من الطلبات

يرى خادم الهدف عدداً كبيراً جداً من الطلبات من عنوان 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

# الطريقة الصحيحة مع إعادة المحاولة
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 — الموقع غير موجود")

قائمة التحقق من تشخيص معدل النجاح المنخفض

  1. حدد خط الأساس: ما كان معدل النجاح طبيعياً من قبل؟
  2. قم بتشغيل اختبار معزول (السكريبت أعلاه) مع 100 طلب
  3. تحقق من السجلات: أي رموز HTTP تهيمن؟ (407, 429, 403, انتهاء المهلة؟)
  4. إذا كان 407: تحقق من اسم المستخدم/كلمة المرور وقائمة المسموح بـ IP
  5. إذا كان 429: أضف تأخيراً بين الطلبات، استخدم دوران IP
  6. إذا كان 403: تحقق من User-Agent, Referer، أضف رؤوس واقعية
  7. إذا كانت انتهاء المهلة: زد timeout، تحقق من RPS، استخدم منطق إعادة المحاولة
  8. تحقق من الكود الخاص بك: معالجة استثناءات صحيحة، مهل زمنية صحيحة
  9. تحقق من خادم الهدف: هل هو متاح مباشرة (بدون وكيل)؟
  10. إذا لم ينجح أي شيء آخر: جرب نوع وكيل مختلف أو مزود خدمة آخر

جدول التشخيص السريع

رمز HTTP السبب المحتمل الحل
407 بيانات اعتماد الوكيل غير صحيحة تحقق من اسم المستخدم/كلمة المرور، قائمة المسموح بـ IP
429 عدد كبير جداً من الطلبات أضف تأخيراً، استخدم دوران IP
403 عنوان IP محجوب أو كاشف بوت أضف رؤوس واقعية، استخدم وكلاء الهاتف المحمول
Timeout الوكيل بطيء أو خادم الهدف مثقل زد timeout، تحقق من RPS
Connection refused خادم الوكيل غير متاح تحقق من IP:port، حالة الوكيل

الخلاصة

معدل النجاح المنخفض — هذا عرض وليس مرض. قد تكون هناك أسباب كثيرة: من خطأ في الكود إلى حجب خادم الهدف. التشخيص المنهجي — هو المفتاح للحل:

  1. تحقق من المقاييس والسجلات
  2. عزل المشكلة (وكيل مقابل خادم الهدف مقابل الكود الخاص بك)
  3. حدد نوع الخطأ (407, 429, 403, انتهاء المهلة)
  4. طبق الحل المناسب

للمهام التي تتطلب موثوقية ومعدل نجاح عالي، يُنصح بـ وكلاء سكنية مع دوران IP. من الصعب اكتشافها وأكثر استقراراً. جرب الاختبار المجاني على proxycove.com واختبره على مهمتك.