عندما ترسل آلاف الطلبات من عنوان IP واحد، ترفع المواقع اختبارات CAPTCHA بسرعة، وقد تحظر العنوان بالكامل بعد فترة قصيرة. الحل العملي مكوّن من طبقتين: وزّع الطلبات على مجموعة من البروكسيات المتناوبة لتقليل عدد الاختبارات التي تظهر من الأساس، ثم استخدم CaptchaAI لحل ما يتبقّى منها برمجياً. في هذا الدليل تتعرّف على كيفية اختيار نوع البروكسي المناسب، وبناء منطق تدوير ذكي، وربطه بحل CAPTCHA داخل مسار استخراج بيانات مستقر يتحمّل أي نظام مضاد للبوتات.
لماذا يقلّل تدوير البروكسي من ظهور CAPTCHA
تعتمد المواقع على أنماط الطلبات لكل عنوان IP لتقرّر متى تُظهر اختبار CAPTCHA. عندما تتركّز كل الطلبات في عنوان واحد، يتضخّم كل مؤشر مريب ويظهر بوضوح؛ أما توزيعها على مجموعة من البروكسيات فيُخفّف هذا الضغط ويجعل السلوك أقرب إلى حركة مرور طبيعية:
| العامل | عنوان IP واحد | بروكسيات متناوبة |
|---|---|---|
| الطلبات في الدقيقة | تجاوز 10 طلبات يُفعّل CAPTCHA | موزّعة عبر عدة عناوين |
| سمعة عنوان IP | تتدهور مع مرور الوقت | عناوين جديدة من المجموعة |
| نمط الجلسة | سلوك مريب واضح للموقع | يتوزّع الأثر عبر العناوين |
| الاتساق الجغرافي | موقع واحد ثابت | تنوّع جغرافي طبيعي |
الخلاصة بسيطة: كل عنوان يحمل جزءاً صغيراً من الحِمل، فتبقى سمعته نظيفة لفترة أطول، وتنخفض نسبة الطلبات التي تصطدم باختبار.
اختيار نوع البروكسي المناسب لهدفك
ليست كل البروكسيات متساوية. النوع الذي تختاره يحدّد بشكل مباشر كم مرة ستواجه CAPTCHA وكم ستدفع مقابل ذلك:
| النوع | الأنسب لـ | معدل CAPTCHA | التكلفة |
|---|---|---|---|
| السكني (Residential) | الأهداف عالية القيمة (Google، Amazon) | الأدنى | $$$ |
| الجوّال (Mobile) | أدنى نسبة اكتشاف | الأدنى | $$$$ |
| ISP/الثابت | الجلسات المستدامة الطويلة | منخفض | $$ |
| مركز البيانات (Datacenter) | المواقع كبيرة الحجم والأقل تشدداً | الأعلى | $ |
التوصية: اعتمد على البروكسي السكني مع المواقع التي تُفعّل CAPTCHA بقوة، واحتفظ ببروكسيات مراكز البيانات للمواقع الأقل حماية حيث تكون الكلفة أهم من نسبة الاكتشاف.
مثال تطبيقي: جمع أسعار المنتجات من متاجر إقليمية
تخيّل فريقاً في الرياض يبني لوحة لمتابعة أسعار المنتجات عبر متاجر إلكترونية في الخليج. من عنوان IP واحد، تبدأ صفحات المنتجات بإظهار اختبار reCAPTCHA بعد بضع مئات من الطلبات، وتتوقف عملية الجمع. الحل هنا مزدوج: خصّص مجموعة بروكسيات سكنية بمواقع جغرافية قريبة من السوق المستهدف حتى يبدو المحتوى المُقدَّم متسقاً (فبعض المتاجر تعرض أسعاراً وعروضاً مختلفة حسب المنطقة)، ثم مرّر الاختبارات القليلة التي تظهر إلى CaptchaAI لحلّها تلقائياً. النتيجة مسار جمع مستقر يعمل طوال اليوم دون توقف يدوي. الأسعار في هذا المثال بالدولار الأمريكي كما هو الحال في خطط CaptchaAI.
تدوير البروكسي الأساسي في Python
ابدأ بمنطق تدوير بسيط: اختر بروكسي عشوائياً لكل طلب، وإذا ظهر اختبار reCAPTCHA استخرج data-sitekey وأرسله إلى CaptchaAI للحصول على التوكن، ثم أعِد إرسال النموذج بالحقل g-recaptcha-response:
import requests
import random
import time
PROXIES = [
"http://user:pass@proxy1.example.com:8080",
"http://user:pass@proxy2.example.com:8080",
"http://user:pass@proxy3.example.com:8080",
]
API_KEY = "YOUR_API_KEY"
def get_random_proxy():
proxy = random.choice(PROXIES)
return {"http": proxy, "https": proxy}
def scrape_with_rotation(url):
proxy = get_random_proxy()
session = requests.Session()
session.proxies = proxy
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
resp = session.get(url)
# If CAPTCHA appears, solve it
if "g-recaptcha" in resp.text or "captcha" in resp.text.lower():
from bs4 import BeautifulSoup
soup = BeautifulSoup(resp.text, "html.parser")
rc = soup.find("div", class_="g-recaptcha")
if rc:
site_key = rc["data-sitekey"]
token = solve_captcha(site_key, url)
resp = session.post(url, data={"g-recaptcha-response": token})
return resp.text
def solve_captcha(site_key, page_url):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": site_key, "pageurl": page_url
})
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id
})
if result.text == "CAPCHA_NOT_READY": continue
if result.text.startswith("OK|"): return result.text.split("|")[1]
raise Exception(result.text)
raise TimeoutError()
تدوير ذكي يتجنّب البروكسيات المُحترقة
التدوير العشوائي كافٍ للبداية، لكن الأفضل أن تتعلّم من سلوك كل بروكسي. تابع عدد المرات التي أثار فيها كل عنوان اختباراً مقابل عدد نجاحاته، ورجّح اختيار العناوين ذات معدل الحل الأعلى:
from collections import defaultdict
import random
class SmartProxyRotator:
def __init__(self, proxies):
self.proxies = proxies
self.captcha_count = defaultdict(int)
self.success_count = defaultdict(int)
def get_proxy(self):
# Prefer proxies with lower CAPTCHA rates
scored = []
for proxy in self.proxies:
total = self.captcha_count[proxy] + self.success_count[proxy]
if total == 0:
score = 0.5 # Unknown proxy, neutral score
else:
score = self.success_count[proxy] / total
scored.append((proxy, score))
# Weight selection by score
scored.sort(key=lambda x: x[1], reverse=True)
top_proxies = scored[:max(len(scored) // 2, 1)]
proxy = random.choice(top_proxies)[0]
return proxy
def report_success(self, proxy):
self.success_count[proxy] += 1
def report_captcha(self, proxy):
self.captcha_count[proxy] += 1
# Usage
rotator = SmartProxyRotator(PROXIES)
def scrape(url):
proxy = rotator.get_proxy()
resp = requests.get(url, proxies={"http": proxy, "https": proxy})
if "captcha" in resp.text.lower():
rotator.report_captcha(proxy)
# Solve CAPTCHA...
else:
rotator.report_success(proxy)
return resp.text
بهذه الطريقة تنسحب العناوين "المحترقة" تدريجياً من الاختيار، ويتركّز الحِمل على البروكسيات التي تعمل بأفضل معدل حل.
تدوير البروكسي مع Selenium
عند استخدام متصفح آلي، مرّر البروكسي إلى Chrome عبر خيار --proxy-server، وبدّله لكل جلسة جديدة حتى لا تُربط عدة جلسات بعنوان واحد:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def create_driver_with_proxy(proxy_url):
options = Options()
options.add_argument(f"--proxy-server={proxy_url}")
options.add_argument("--disable-blink-features=AutomationControlled")
return webdriver.Chrome(options=options)
# Rotate proxy per session
proxy = random.choice(PROXIES)
driver = create_driver_with_proxy(proxy)
driver.get("https://example.com")
تمرير البروكسي عند حل Cloudflare Challenge
حالة Cloudflare Challenge خاصة: يجب أن يمرّ الحل عبر البروكسي نفسه الذي ستستخدمه لاحقاً، لأن ملف تعريف الارتباط cf_clearance مرتبط بعنوان IP. أرسل البروكسي مع الطلب إلى CaptchaAI:
proxy = "http://user:pass@proxy.example.com:8080"
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "cloudflare_challenge",
"pageurl": "https://example.com",
"proxy": proxy,
"proxytype": "HTTP"
})
task_id = resp.text.split("|")[1]
# Poll for cf_clearance cookie
# Use the same proxy for subsequent requests
ممارسات موصى بها لتدوير البروكسي
طبّق هذه القواعد لتحافظ على استقرار المسار وتقلّل الاختبارات إلى أدنى حد:
- طابِق الموقع الجغرافي للبروكسي مع الهدف — استخدم بروكسيات أمريكية للمواقع الأمريكية، وبروكسيات إقليمية للأسواق المحلية.
- جلسة واحدة لكل بروكسي — لا تعِد استخدام الجلسة نفسها عبر عناوين مختلفة.
- حدّد معدل الطلبات لكل بروكسي — بحد أقصى 5 إلى 10 طلبات في الدقيقة لكل عنوان IP.
- راقب معدلات CAPTCHA — تتبّع العناوين التي تثير عدداً أكبر من الاختبارات واستبعدها.
- استخدم الجلسات الثابتة — احتفظ بالبروكسي نفسه في سير العمل متعدد الخطوات.
- تعامل مع أعطال البروكسي — أعِد المحاولة بعنوان مختلف عند حدوث أخطاء اتصال.
معالجة المشكلات الشائعة
| المشكلة | الحل |
|---|---|
| كل البروكسيات تُثير اختبارات CAPTCHA | انتقل إلى البروكسي السكني وخفّض معدل الطلبات |
| أخطاء مهلة انتهاء البروكسي | استبعد العناوين البطيئة من المجموعة وارفع المهلة |
| محتوى مختلف بين البروكسيات | بعض المواقع تعرض محتوى حسب المنطقة؛ وحّد النتائج |
| رمز CAPTCHA لا يعمل مع البروكسي | تأكّد من استخدام التوكن من الجلسة/عنوان IP نفسه |
الأسئلة الشائعة
ما الفرق بين البروكسي السكني وبروكسي مركز البيانات في تقليل CAPTCHA؟
البروكسي السكني يستخدم عناوين IP لمزوّدي خدمة إنترنت حقيقيين، فتبدو حركته طبيعية وتُثير اختبارات أقل، لكنه أغلى. بروكسي مركز البيانات أرخص وأسرع لكنه أسهل في الاكتشاف، ويناسب المواقع الأقل تشدداً حيث يهمّك الحجم والكلفة أكثر من نسبة الاختبارات.
هل تحل CaptchaAI كل أنواع CAPTCHA التي تصادفها أثناء التجريف؟
تحل CaptchaAI اختبارات reCAPTCHA v2 وv3 وCloudflare Turnstile وCloudflare Challenge وGeeTest v3 واختبارات الصور والشبكة وBLS، مع دعم تجريبي (beta) لـ CaptchaFox وFriendly Captcha وLemin. أما hCaptcha وFunCaptcha فغير مدعومين حالياً، ودعم GeeTest v4 قادم قريباً وليس متاحاً بعد.
لماذا يجب استخدام البروكسي نفسه في حل Cloudflare Challenge؟
لأن ملف تعريف الارتباط cf_clearance الناتج عن الحل مرتبط بعنوان IP الذي وُلّد منه. إذا حللت الاختبار عبر بروكسي ثم أرسلت الطلبات التالية من عنوان آخر، يرفض Cloudflare الجلسة. لذلك مرّر البروكسي نفسه إلى CaptchaAI ثم استخدمه في بقية الطلبات.
كم عدد البروكسيات المناسب لمشروع بحجم متوسط؟
لجمع معتدل بحدود 1000 صفحة يومياً، تكفي مجموعة من 10 إلى 20 بروكسي سكني متناوب. مع ارتفاع الحجم، اعتمد على مزوّد بروكسيات يوفّر تدويراً تلقائياً بدل إدارة القائمة يدوياً.