كيفية تشخيص سبب معدل النجاح المنخفض: دليل خطوة بخطوة
معدل النجاح (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 — الموقع غير موجود")
قائمة التحقق من تشخيص معدل النجاح المنخفض
- حدد خط الأساس: ما كان معدل النجاح طبيعياً من قبل؟
- قم بتشغيل اختبار معزول (السكريبت أعلاه) مع 100 طلب
- تحقق من السجلات: أي رموز HTTP تهيمن؟ (407, 429, 403, انتهاء المهلة؟)
- إذا كان 407: تحقق من اسم المستخدم/كلمة المرور وقائمة المسموح بـ IP
- إذا كان 429: أضف تأخيراً بين الطلبات، استخدم دوران IP
- إذا كان 403: تحقق من User-Agent, Referer، أضف رؤوس واقعية
- إذا كانت انتهاء المهلة: زد timeout، تحقق من RPS، استخدم منطق إعادة المحاولة
- تحقق من الكود الخاص بك: معالجة استثناءات صحيحة، مهل زمنية صحيحة
- تحقق من خادم الهدف: هل هو متاح مباشرة (بدون وكيل)؟
- إذا لم ينجح أي شيء آخر: جرب نوع وكيل مختلف أو مزود خدمة آخر
جدول التشخيص السريع
| رمز HTTP | السبب المحتمل | الحل |
|---|---|---|
| 407 | بيانات اعتماد الوكيل غير صحيحة | تحقق من اسم المستخدم/كلمة المرور، قائمة المسموح بـ IP |
| 429 | عدد كبير جداً من الطلبات | أضف تأخيراً، استخدم دوران IP |
| 403 | عنوان IP محجوب أو كاشف بوت | أضف رؤوس واقعية، استخدم وكلاء الهاتف المحمول |
| Timeout | الوكيل بطيء أو خادم الهدف مثقل | زد timeout، تحقق من RPS |
| Connection refused | خادم الوكيل غير متاح | تحقق من IP:port، حالة الوكيل |
الخلاصة
معدل النجاح المنخفض — هذا عرض وليس مرض. قد تكون هناك أسباب كثيرة: من خطأ في الكود إلى حجب خادم الهدف. التشخيص المنهجي — هو المفتاح للحل:
- تحقق من المقاييس والسجلات
- عزل المشكلة (وكيل مقابل خادم الهدف مقابل الكود الخاص بك)
- حدد نوع الخطأ (407, 429, 403, انتهاء المهلة)
- طبق الحل المناسب
للمهام التي تتطلب موثوقية ومعدل نجاح عالي، يُنصح بـ وكلاء سكنية مع دوران IP. من الصعب اكتشافها وأكثر استقراراً. جرب الاختبار المجاني على proxycove.com واختبره على مهمتك.