حالات الاستخدام

تجريف اختبار CAPTCHA باستخدام بايثون

تتعامل مكتبة 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.

أدلة ذات صلة

التعليقات غير مفعّلة لهذا المقال.