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
- Ủy quyền dân cư luân phiên
- Chất lượng proxy ảnh hưởng đến tỷ lệ giải quyết
- Tính kiên trì của phiên trình duyệt
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.