So Sánh

Phiên cố định và phiên luân phiên: Chiến lược proxy tốt nhất cho CAPTCHA

Phiên cố định giữ cùng một IP trong một khoảng thời gian nhất định. Các phiên luân phiên chỉ định IP mới cho mỗi yêu cầu. Việc chọn sai sẽ làm tăng tỷ lệ CAPTCHA và lãng phí tín dụng API.


Mỗi chế độ hoạt động như thế nào

STICKY SESSION:
  Request 1 ──▶ IP: 192.168.1.50 ──▶ site.com/login
  Request 2 ──▶ IP: 192.168.1.50 ──▶ site.com/dashboard
  Request 3 ──▶ IP: 192.168.1.50 ──▶ site.com/account
  (Same IP for all requests in the session window)

ROTATING SESSION:
  Request 1 ──▶ IP: 192.168.1.50 ──▶ site.com/page1
  Request 2 ──▶ IP: 10.0.0.77   ──▶ site.com/page2
  Request 3 ──▶ IP: 172.16.5.22 ──▶ site.com/page3
  (Different IP per request)

So sánh trực tiếp

Yếu tố dính Xoay
IP theo yêu cầu Tương tự trong 1-30 phút Mỗi yêu cầu mới
Tính nhất quán của phiên Cao không có
Tỷ lệ CAPTCHA (luồng nhiều bước) Thấp (5-10%) Cao (30-50%)
Tỷ lệ CAPTCHA (trang đơn) Trung bình (10-20%) Thấp (5-10%)
Hiệu lực của mã thông báo Cao hơn - cùng IP Nguy cơ không phù hợp
Tốc độ Nhanh (tái sử dụng kết nối) Chậm hơn (kết nối mới)
Cấm rủi ro Cao hơn nếu bị gắn cờ Thấp - IP mới mỗi lần
Chi phí Tương tự hoặc hơn một chút giống nhau
Tốt nhất cho Đăng nhập, thanh toán, xác thực Quét hàng loạt, tìm kiếm

Khi phiên dính giành chiến thắng

Quy trình làm việc nhiều bước

CAPTCHA xác thực mã thông báo dựa trên IP yêu cầu. Nếu IP của bạn thay đổi giữa việc giải quyết và gửi, mã thông báo có thể bị từ chối.

import requests
import time

CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"

# Sticky session: same IP for the entire login flow
STICKY_PROXY = {
    "http": "http://user-session-abc123:pass@proxy.example.com:5000",
    "https": "http://user-session-abc123:pass@proxy.example.com:5000",
}

session = requests.Session()
session.proxies = STICKY_PROXY
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
    "AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
})

def login_with_captcha(url, sitekey, username, password):
    """Full login flow — MUST use same IP throughout."""
    # Step 1: Load login page (IP: 192.168.1.50)
    session.get(url)

    # Step 2: Solve CAPTCHA (solved against IP: 192.168.1.50)
    token = solve_recaptcha(sitekey, url)

    # Step 3: Submit login (MUST be IP: 192.168.1.50)
    resp = session.post(url, data={
        "username": username,
        "password": password,
        "g-recaptcha-response": token,
    })

    return resp.status_code == 200

def solve_recaptcha(sitekey, pageurl):
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": 1,
    })
    task_id = resp.json()["request"]

    for _ in range(60):
        time.sleep(5)
        result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = result.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]

    raise TimeoutError("CAPTCHA solve timeout")

Tại sao tính nhất quán của IP lại quan trọng

Sticky session:

  1. Browser loads page    → IP: 5.5.5.5
  2. CAPTCHA solved        → Token bound to session
  3. Form submitted        → IP: 5.5.5.5 ✅ Token accepted

Rotating session:

  1. Browser loads page    → IP: 5.5.5.5
  2. CAPTCHA solved        → Token bound to session
  3. Form submitted        → IP: 9.9.9.9 ❌ Token may be rejected

Khi phiên quay thắng

Quét trang hàng loạt

Mỗi trang là độc lập. IP luân chuyển sẽ trải rộng các yêu cầu trên một nhóm lớn hơn, giảm khả năng phát hiện trên mỗi IP.

import concurrent.futures

ROTATING_PROXY = {
    "http": "http://user:pass@rotating.proxy.example.com:5000",
    "https": "http://user:pass@rotating.proxy.example.com:5000",
}

def scrape_page(url):
    """Each request gets a fresh IP automatically."""
    resp = requests.get(
        url,
        proxies=ROTATING_PROXY,
        headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"},
        timeout=30,
    )
    if resp.status_code == 200:
        return url, resp.text
    return url, None

urls = [f"https://example.com/products?page={i}" for i in range(1, 501)]

with concurrent.futures.ThreadPoolExecutor(max_workers=10) as pool:
    results = list(pool.map(scrape_page, urls))
    success = sum(1 for _, html in results if html)
    print(f"Scraped: {success}/{len(urls)}")

Quét công cụ tìm kiếm

Công cụ tìm kiếm theo dõi khối lượng truy vấn trên mỗi IP. Xoay tránh giới hạn tỷ lệ:

def scrape_search(query, pages=10):
    results = []
    for page in range(pages):
        # Each request → new IP
        resp = requests.get(
            "https://search-engine.example.com/search",
            params={"q": query, "start": page * 10},
            proxies=ROTATING_PROXY,
            timeout=20,
        )
        results.append(resp.text)
        time.sleep(2)
    return results

Chiến lược lai

Sử dụng cả hai chế độ trong cùng một đường dẫn:

class HybridProxyManager:
    """Sticky for multi-step flows, rotating for single requests."""

    def __init__(self, provider_host, username, password, port=5000):
        self.host = provider_host
        self.username = username
        self.password = password
        self.port = port

    def get_rotating_proxy(self):
        return {
            "http": f"http://{self.username}:{self.password}@{self.host}:{self.port}",
            "https": f"http://{self.username}:{self.password}@{self.host}:{self.port}",
        }

    def get_sticky_proxy(self, session_id, duration_min=10):
        sticky_user = f"{self.username}-session-{session_id}-ttl-{duration_min}"
        return {
            "http": f"http://{sticky_user}:{self.password}@{self.host}:{self.port}",
            "https": f"http://{sticky_user}:{self.password}@{self.host}:{self.port}",
        }

proxy_mgr = HybridProxyManager("proxy.example.com", "user", "pass")

def scrape_with_auto_strategy(url, needs_login=False):
    if needs_login:
        # Multi-step → sticky
        import uuid
        session_id = uuid.uuid4().hex[:8]
        proxy = proxy_mgr.get_sticky_proxy(session_id)
    else:
        # Single page → rotating
        proxy = proxy_mgr.get_rotating_proxy()

    return requests.get(url, proxies=proxy, timeout=30)

Triển khai Node.js

const axios = require("axios");

const CAPTCHAAI_KEY = "YOUR_API_KEY";
const PROXY_HOST = "proxy.example.com";
const PROXY_PORT = 5000;

function getProxy(mode, sessionId = null) {
  const user =
    mode === "sticky" ? `user-session-${sessionId}` : "user";

  return {
    proxy: {
      host: PROXY_HOST,
      port: PROXY_PORT,
      auth: { username: user, password: "pass" },
    },
  };
}

// Rotating: bulk scrape
async function scrapePages(urls) {
  const results = [];
  for (const url of urls) {
    const config = getProxy("rotating");
    const resp = await axios.get(url, { ...config, timeout: 30000 });
    results.push({ url, data: resp.data });
  }
  return results;
}

// Sticky: login flow
async function loginFlow(loginUrl, sitekey, credentials) {
  const sessionId = Date.now().toString(36);
  const config = getProxy("sticky", sessionId);

  // Step 1: Load page
  await axios.get(loginUrl, config);

  // Step 2: Solve CAPTCHA
  const submitResp = await axios.post(
    "https://ocr.captchaai.com/in.php",
    null,
    {
      params: {
        key: CAPTCHAAI_KEY,
        method: "userrecaptcha",
        googlekey: sitekey,
        pageurl: loginUrl,
        json: 1,
      },
    }
  );
  const taskId = submitResp.data.request;

  let token;
  for (let i = 0; i < 60; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const res = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: CAPTCHAAI_KEY, action: "get", id: taskId, json: 1 },
    });
    if (res.data.request !== "CAPCHA_NOT_READY") {
      token = res.data.request;
      break;
    }
  }

  // Step 3: Submit with same IP
  return axios.post(
    loginUrl,
    {
      ...credentials,
      "g-recaptcha-response": token,
    },
    config
  );
}

Ma trận quyết định

Quy trình làm việc Được đề xuất tại sao
Đăng nhập/đăng ký dính Mã thông báo được liên kết với IP
Kiểm tra/thanh toán dính Cookie phiên cần cùng một IP
Quét trang hàng loạt Xoay Phân phối tải
Quét công cụ tìm kiếm Xoay Tránh giới hạn tốc độ trên mỗi IP
Thăm dò API (cùng điểm cuối) Xoay Giảm dấu vân tay trên mỗi IP
Điều hướng nhiều trang dính Cookie được theo dõi bởi IP
Giám sát giá Xoay Nhiều yêu cầu độc lập
Quản lý tài khoản dính Tính toàn vẹn của phiên
Gửi biểu mẫu bằng CAPTCHA dính Liên kết mã thông báo-IP
Xác minh quảng cáo Xoay Mô phỏng người dùng đa dạng

Thời lượng phiên cố định

Thời lượng Tốt nhất cho Rủi ro
1 phút Gửi biểu mẫu nhanh Có thể hết hạn giữa dòng
5 phút Đăng nhập + hành động tiêu chuẩn Cân bằng tốt
10 phút Luồng nhiều trang phức tạp Rủi ro cấm vừa phải
30 phút Phiên duyệt mở rộng Rủi ro cấm cao hơn
60 phút Hoạt động tài khoản dài Rủi ro cấm cao nhất

Quy tắc chung: Đặt thời lượng dính gấp đôi thời gian chảy dự kiến của bạn.


Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
Mã thông báo CAPTCHA bị từ chối sau khi giải quyết IP đã thay đổi giữa giải quyết và gửi Chuyển sang phiên cố định
Tỷ lệ CAPTCHA cao trên các trang đơn Cùng một IP dính vào quá nhiều trang Chuyển sang chế độ xoay
Cookie phiên bị mất Phiên cố định đã hết hạn Tăng thời lượng TTL
Hiệu suất quay chậm Chi phí kết nối trên mỗi IP mới Sử dụng kết nối tổng hợp
IP bị cấm trong phiên dính Tất cả các yêu cầu chia sẻ IP được gắn cờ Giảm TTL phiên hoặc thêm độ trễ

Câu hỏi thường gặp

Tôi có thể trộn dính và xoay trong một dự án không?

Vâng. Sử dụng phương pháp kết hợp - cố định cho các luồng xác thực, luân phiên để thu thập dữ liệu. Hầu hết các nhà cung cấp proxy đều hỗ trợ cả hai chế độ trên cùng một gói.

Phiên cố định có đảm bảo cùng một IP không?

Hầu hết các nhà cung cấp đều đảm bảo nó trong cửa sổ TTL. Nếu IP không khả dụng (chỉ định lại nhà cung cấp dịch vụ, xoay vòng nhóm), một IP mới sẽ được chỉ định.

Chế độ nào rẻ hơn?

Cùng một mức giá — bạn trả theo GB hoặc theo yêu cầu bất kể chế độ nào. Sự chênh lệch chi phí đến từ tỷ lệ CAPTCHA: sai chế độ →, càng nhiều CAPTCHA, → càng chi tiêu CaptchaAI nhiều hơn.

Làm cách nào để đặt phiên cố định với nhà cung cấp proxy của tôi?

Hầu hết sử dụng ID phiên trong tên người dùng: user-session-abc123. Kiểm tra tài liệu của nhà cung cấp của bạn để biết định dạng chính xác. Chúng tôi bao gồmDữ liệu sáng,Proxy thông minh, Vàoxylabstrong hướng dẫn chuyên dụng.


Hướng dẫn liên quan


Kết hợp chiến lược proxy với quy trình làm việc của bạn —lấy khóa CaptchaAI của bạnđể xử lý CAPTCHA ở bất kỳ chế độ phiên nào.

Os comentários estão desativados para este artigo.