تتعامل مكتبة requests الخاصة بـ Python مع HTTP بكفاءة، لكن اختبارات CAPTCHA تتطلب حلاً خارجيًا. يوضح هذا الدليل كيفية دمج CaptchaAI في نصوص بايثون النصية - لا حاجة إلى متصفح لمعظم المواقع.
المتطلبات
| المتطلبات | التفاصيل |
|---|---|
| بايثون 3.7+ | مع نقطة |
| طلبات | pip install requests |
| beautifulsoup4 | pip install beautifulsoup4 |
| مفتاح CaptchaAI API | منcaptchaai.com |
فئة المساعدة CaptchaAI
أنشئ فئة حل قابلة لإعادة الاستخدام لمشاريع Python الخاصة بك:
import requests
import time
class CaptchaSolver:
def __init__(self, api_key):
self.api_key = api_key
self.base = "https://ocr.captchaai.com"
def _submit(self, params):
params["key"] = self.api_key
resp = requests.get(f"{self.base}/in.php", params=params)
if not resp.text.startswith("OK|"):
raise Exception(f"Submit error: {resp.text}")
return resp.text.split("|")[1]
def _poll(self, task_id, timeout=300):
deadline = time.time() + timeout
while time.time() < deadline:
time.sleep(5)
resp = requests.get(f"{self.base}/res.php", params={
"key": self.api_key,
"action": "get",
"id": task_id
})
if resp.text == "CAPCHA_NOT_READY":
continue
if resp.text.startswith("OK|"):
return resp.text.split("|")[1]
raise Exception(f"Solve error: {resp.text}")
raise TimeoutError("Solve timed out")
def solve_recaptcha_v2(self, site_key, page_url):
task_id = self._submit({
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url
})
return self._poll(task_id)
def solve_recaptcha_v3(self, site_key, page_url, action="verify"):
task_id = self._submit({
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url,
"version": "v3",
"action": action
})
return self._poll(task_id)
def solve_turnstile(self, site_key, page_url):
task_id = self._submit({
"method": "turnstile",
"sitekey": site_key,
"pageurl": page_url
})
return self._poll(task_id)
def solve_image(self, image_base64):
task_id = self._submit({
"method": "base64",
"body": image_base64
})
return self._poll(task_id)
كشط نموذج محمي بـ reCAPTCHA
from bs4 import BeautifulSoup
import requests
solver = CaptchaSolver("YOUR_API_KEY")
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
# Step 1: Load the page
url = "https://example.com/search"
page = session.get(url)
soup = BeautifulSoup(page.text, "html.parser")
# Step 2: Extract the site key
recaptcha_div = soup.find("div", class_="g-recaptcha")
site_key = recaptcha_div["data-sitekey"]
# Step 3: Solve the CAPTCHA
token = solver.solve_recaptcha_v2(site_key, url)
# Step 4: Submit the form with the token
form_data = {
"q": "search term",
"g-recaptcha-response": token
}
result = session.post(url, data=form_data)
# Step 5: Parse the results
result_soup = BeautifulSoup(result.text, "html.parser")
items = result_soup.find_all("div", class_="result-item")
for item in items:
print(item.text.strip())
كشط صفحات متعددة
للحصول على النتائج المرقّمة خلف اختبارات CAPTCHA:
def scrape_all_pages(base_url, site_key, max_pages=10):
solver = CaptchaSolver("YOUR_API_KEY")
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
all_results = []
for page_num in range(1, max_pages + 1):
page_url = f"{base_url}?page={page_num}"
# Solve CAPTCHA for each page if needed
token = solver.solve_recaptcha_v2(site_key, page_url)
resp = session.get(page_url, params={
"g-recaptcha-response": token,
"page": page_num
})
soup = BeautifulSoup(resp.text, "html.parser")
items = soup.find_all("div", class_="item")
if not items:
break
all_results.extend([item.text.strip() for item in items])
print(f"Page {page_num}: {len(items)} items")
time.sleep(2) # Polite delay
return all_results
التعامل مع الصور CAPTCHAs
بالنسبة للمواقع التي تحتوي على اختبارات CAPTCHA النصية المستندة إلى الصور:
import base64
def scrape_with_image_captcha(url):
solver = CaptchaSolver("YOUR_API_KEY")
session = requests.Session()
page = session.get(url)
soup = BeautifulSoup(page.text, "html.parser")
# Find the CAPTCHA image
captcha_img = soup.find("img", {"id": "captcha-image"})
captcha_url = captcha_img["src"]
# Download and encode the image
img_resp = session.get(captcha_url)
img_base64 = base64.b64encode(img_resp.content).decode()
# Solve
captcha_text = solver.solve_image(img_base64)
# Submit
form_data = {
"captcha": captcha_text,
"username": "user"
}
result = session.post(url, data=form_data)
return result.text
معالجة الأخطاء وإعادة المحاولة
إضافة منطق إعادة المحاولة لكاشطات الإنتاج:
def solve_with_retry(solver, site_key, page_url, max_retries=3):
for attempt in range(max_retries):
try:
return solver.solve_recaptcha_v2(site_key, page_url)
except Exception as e:
if attempt == max_retries - 1:
raise
print(f"Attempt {attempt + 1} failed: {e}. Retrying...")
time.sleep(2)
استكشاف الأخطاء وإصلاحها
| المشكلة | السبب | الإجراء |
|---|---|---|
ERROR_WRONG_USER_KEY |
مفتاح API غير صالح | التحقق من المفتاح من لوحة التحكم |
ERROR_ZERO_BALANCE |
لا أموال | قم بتعبئة حسابك |
| يقوم إرسال النموذج بإرجاع صفحة CAPTCHA مرة أخرى | انتهت صلاحية الرمز المميز أو اسم حقل خاطئ | استخدم الرمز المميز على الفور؛ تحقق من أسماء حقول النموذج |
ConnectionError |
مشكلة الشبكة | أضف منطق إعادة المحاولة مع التراجع الأسي |
| النتائج فارغة بعد التقديم | يتطلب الموقع ملفات تعريف الارتباط/session | استخدم requests.Session() للحفاظ على ملفات تعريف الارتباط |
الأسئلة الشائعة
هل أحتاج إلى السيلينيوم لتجريد اختبار CAPTCHA في بايثون؟
ليس دائما. إذا كان نموذج الموقع يعمل مع طلبات HTTP POST القياسية، فإن requests + CaptchaAI أسرع وأخف وزنًا من السيلينيوم. استخدم السيلينيوم فقط عندما يتطلب الموقع عرض JavaScript.
هل يمكنني حل اختبارات CAPTCHA بشكل غير متزامن؟
نعم. استخدم aiohttp مع واجهة برمجة تطبيقات CaptchaAI لسير العمل غير المتزامن. يرىتكامل aiohttp + CaptchaAI.
كيف أتعامل مع تحديد المعدل؟
أضف تأخيرات بين الطلبات (time.sleep(2-5))، وقم بتدوير الوكلاء، واستخدم رؤوسًا واقعية. يرىتناوب الوكيل لتجريد اختبار CAPTCHA.