应用场景

用于验证码抓取的代理轮换

代理轮换通过跨多个 IP 分发请求来降低验证码频率。与 CaptchaAI 相结合来解决仍然出现的验证码,您将获得一个可靠的抓取管道来处理任何反机器人系统。

为什么代理轮换会减少验证码

站点根据每个 IP 请求模式触发验证码:

因素 单一IP QA 测试会话
每分钟请求数 10+ 触发器验证码 跨IP分布
知识产权声誉 随着时间的推移而退化 池中的新 IP
会话模式 可见可疑图案 模式分布在各个 IP 上
地理一致性 单一地点 自然地理多样性

用于抓取的代理类型

类型 最适合 验证码率 成本
住宅 高价值目标(Google、亚马逊) 最低 $$$
移动的 超低检测 最低 $$$$
ISP/Static 持续的会议 低的 $$
数据中心 高容量、宽松的站点 更高 $

建议: 对具有激进验证码触发器的站点使用自有服务器基础设施。数据中心代理适用于受保护程度较低的站点。

基本代理轮换 (Python)

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 进行代理轮换

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("--no-sandbox")
    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 的代理 + CAPTCHA 解决方案

Cloudflare 验证流程 求解需要将代理传递给 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 qa_session_cookie cookie
# Use the same proxy for subsequent requests

最佳实践

  1. 将代理地理位置与目标相匹配 - 对美国网站使用美国代理
  2. 每个代理一个会话 – 不要在不同代理之间重复使用会话
  3. 每个代理的速率限制 – 每个 IP 最多 5-10 个请求/minute
  4. 监控验证码率 – 跟踪哪些代理触发更多验证码
  5. 使用粘性会话 - 为多步骤工作流程保留相同的代理
  6. 处理代理失败 – 在连接错误时使用不同的代理重试

故障排除

问题 处理方式
所有代理都会触发验证码 切换到自有服务器基础设施;降低率
代理超时错误 从池中删除慢速代理;增加超时时间
每个代理的内容不同 有些网站提供针对特定地理区域的内容;正常化
CAPTCHA 令牌不适用于代理 确保从同一会话使用令牌/IP

常问问题

如果我使用 CaptchaAI 是否需要代理?

严格来说不是——CaptchaAI 无论如何都可以解决验证码。但是代理会减少验证码出现的频率,从而节省时间和 API 成本。

我应该使用相同的代理来解决验证码和抓取吗?

对于大多数 CAPTCHA 类型,无论 IP 如何,令牌都有效。对于 Cloudflare 验证流程,您必须使用相同的代理,因为 qa_session_cookie cookie 是 IP 绑定的。

我需要多少个代理?

对于中等抓取(1,000 页/day),10-20 个轮换自有服务器基础设施就足够了。对于大容量,请使用具有自动轮换功能的代理提供商。

相关指南

该文章已禁用评论。