Giải quyết tuần tự rất đơn giản. Giải quyết song song là nhanh chóng. Sự lựa chọn đúng đắn phụ thuộc vào khối lượng, cơ sở hạ tầng và khả năng chịu đựng sự phức tạp của bạn. Hướng dẫn này so sánh cả hai cách tiếp cận vớiCaptchaAIvà giúp bạn chọn chiến lược phù hợp.
So sánh trực tiếp
| Yếu tố | tuần tự | Song song |
|---|---|---|
| Thông lượng (reCAPTCHA v2, trung bình 15 giây) | ~240/hour | ~10.000+/hour |
| Độ phức tạp của mã | Đơn giản | Trung bình đến phức tạp |
| Xử lý lỗi | Đơn giản | Yêu cầu cách ly lỗi đồng thời |
| Sử dụng bộ nhớ | Tối thiểu (~30 MB) | Cân đồng thời (~100–500 MB) |
| Chi phí API cho mỗi lần giải quyết | giống nhau | giống nhau |
| Gỡ lỗi khó khăn | Dễ dàng | Khó hơn (điều kiện cuộc đua, thời gian) |
| Bảo quản đơn hàng | Đảm bảo | Yêu cầu theo dõi rõ ràng |
| Tốt nhất cho | < 500 giải được/day | > 500 giải/day |
Giải tuần tự
Nó hoạt động như thế nào
Mỗi lần một CAPTCHA: gửi → đợi → thăm dò ý kiến → nhận kết quả → tiếp theo.
# sequential_solver.py
import os
import time
import requests
API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")
def solve_sequential(tasks):
"""Solve CAPTCHAs one by one."""
results = []
session = requests.Session()
for task in tasks:
# Submit
resp = session.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": task["sitekey"],
"pageurl": task["pageurl"],
"json": "1",
})
result = resp.json()
if result.get("status") != 1:
results.append({"error": result.get("request")})
continue
task_id = result["request"]
time.sleep(15)
# Poll
token = None
for _ in range(25):
poll = session.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get",
"id": task_id, "json": "1",
})
poll_result = poll.json()
if poll_result.get("status") == 1:
token = poll_result["request"]
break
if poll_result.get("request") != "CAPCHA_NOT_READY":
break
time.sleep(5)
results.append({"token": token} if token else {"error": "timeout"})
return results
# 10 tasks sequentially → ~150 seconds total
tasks = [{"sitekey": "SITEKEY", "pageurl": "https://example.com"}] * 10
start = time.time()
results = solve_sequential(tasks)
print(f"Completed in {time.time() - start:.0f}s")
Khi tuần tự có ý nghĩa
- Quy trình làm việc trên một trang — Điền vào một biểu mẫu mỗi lần
- Gỡ lỗi và phát triển — Luồng thực thi rõ ràng
- Âm lượng thấp — < 500 giải quyết được/day không biện minh cho sự phức tạp song song
- Nhiệm vụ phụ thuộc vào thứ tự — Khi kết quả giải phải được sử dụng theo trình tự
Giải quyết song song
Nó hoạt động như thế nào
Gửi tất cả CAPTCHA cùng một lúc, thăm dò kết quả đồng thời:
# parallel_solver.py
import os
import asyncio
import aiohttp
API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")
async def solve_one(session, sitekey, pageurl, semaphore):
"""Solve a single CAPTCHA within concurrency limits."""
async with semaphore:
# Submit
async with session.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": sitekey, "pageurl": pageurl, "json": "1",
}) as resp:
result = await resp.json(content_type=None)
if result.get("status") != 1:
return {"error": result.get("request")}
task_id = result["request"]
await asyncio.sleep(15)
# Poll
for _ in range(25):
async with session.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get",
"id": task_id, "json": "1",
}) as resp:
poll_result = await resp.json(content_type=None)
if poll_result.get("status") == 1:
return {"token": poll_result["request"]}
if poll_result.get("request") != "CAPCHA_NOT_READY":
return {"error": poll_result.get("request")}
await asyncio.sleep(5)
return {"error": "timeout"}
async def solve_parallel(tasks, max_concurrent=50):
"""Solve CAPTCHAs in parallel with concurrency control."""
semaphore = asyncio.Semaphore(max_concurrent)
connector = aiohttp.TCPConnector(limit=max_concurrent)
async with aiohttp.ClientSession(connector=connector) as session:
coros = [
solve_one(session, t["sitekey"], t["pageurl"], semaphore)
for t in tasks
]
return await asyncio.gather(*coros)
# 10 tasks in parallel → ~20 seconds total
import time
tasks = [{"sitekey": "SITEKEY", "pageurl": "https://example.com"}] * 10
start = time.time()
results = asyncio.run(solve_parallel(tasks))
print(f"Completed in {time.time() - start:.0f}s")
Ví dụ song song về JavaScript
// parallel_solver.js
const axios = require('axios');
const https = require('https');
const API_KEY = process.env.CAPTCHAAI_KEY || 'YOUR_API_KEY';
const agent = new https.Agent({ keepAlive: true, maxSockets: 50 });
const api = axios.create({ baseURL: 'https://ocr.captchaai.com', httpsAgent: agent });
async function solveOne(sitekey, pageurl) {
const submit = await api.get('/in.php', {
params: { key: API_KEY, method: 'userrecaptcha', googlekey: sitekey, pageurl, json: '1' },
});
if (submit.data.status !== 1) return { error: submit.data.request };
await new Promise(r => setTimeout(r, 15000));
for (let i = 0; i < 25; i++) {
const poll = await api.get('/res.php', {
params: { key: API_KEY, action: 'get', id: submit.data.request, json: '1' },
});
if (poll.data.status === 1) return { token: poll.data.request };
if (poll.data.request !== 'CAPCHA_NOT_READY') return { error: poll.data.request };
await new Promise(r => setTimeout(r, 5000));
}
return { error: 'timeout' };
}
(async () => {
const tasks = Array.from({ length: 10 }, () => ({
sitekey: 'SITEKEY', pageurl: 'https://example.com',
}));
const start = Date.now();
const results = await Promise.all(tasks.map(t => solveOne(t.sitekey, t.pageurl)));
console.log(`Completed in ${((Date.now() - start) / 1000).toFixed(0)}s`);
console.log(`Solved: ${results.filter(r => r.token).length}/${tasks.length}`);
agent.destroy();
})();
Thông lượng theo cấp độ đồng thời
| Giải quyết đồng thời | Thông lượng ước tính/hour | Bộ nhớ (Python) | Độ phức tạp |
|---|---|---|---|
| 1 (tuần tự) | 240 | 30 MB | Thấp |
| 10 | 2.400 | 50 MB | Thấp |
| 25 | 6.000 | 80MB | Trung bình |
| 50 | 10.000+ | 120 MB | Trung bình |
| 100 | 18.000+ | 200MB | Cao |
Dựa trên reCAPTCHA v2 với thời gian giải trung bình là 15 giây.
Phương pháp lai
Sử dụng tuần tự cho quy trình làm việc và song song để giải CAPTCHA:
# Process 10 URLs sequentially, but solve their CAPTCHAs in a parallel batch
urls = get_next_batch() # 10 URLs
captcha_params = [extract_sitekey(url) for url in urls] # Sequential extraction
tokens = asyncio.run(solve_parallel(captcha_params, max_concurrent=10)) # Parallel solving
for url, result in zip(urls, tokens):
submit_form(url, result.get("token")) # Sequential submission
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| Song song chậm hơn dự kiến | Semaphore quá hạn chế | Tăng max_concurrent |
| Thất bại ngẫu nhiên song song | Tham nhũng nhà nước được chia sẻ | Trạng thái cô lập trên mỗi coroutine/promise |
| Kết quả không đúng thứ tự | asyncio.gather duy trì trật tự |
Sử dụng theo dõi chỉ mục nếu cần |
API trả về ERROR_NO_SLOT_AVAILABLE |
Quá nhiều bài gửi đồng thời | Thêm độ trễ nhỏ giữa các lần gửi |
Câu hỏi thường gặp
Tôi có thể chuyển từ tuần tự sang song song mà không thay đổi cấu trúc mã của mình không?
Có, nếu bạn trích xuất logic giải thành một hàm độc lập. Thay đổi duy nhất là gói cuộc gọi trong asyncio.gather (Python) hoặc Promise.all (JavaScript).
Giải quyết song song có tốn kém hơn không?
Không. CaptchaAI tính phí cho mỗi lần giải chứ không phải cho mỗi yêu cầu đồng thời. Giải quyết song song có cùng chi phí API như tuần tự — bạn chỉ đạt được tổng số nhanh hơn.
Đồng thời thực tế tối đa là gì?
Hầu hết các thiết lập đều đạt lợi nhuận giảm dần trên 100 lần giải quyết đồng thời. Ngoài ra, hãy tập trung vào việc tối ưu hóa các tham số giải thay vì thêm tính đồng thời.
Các bước tiếp theo
Chọn chiến lược phù hợp với khối lượng của bạn —lấy khóa API CaptchaAI của bạn.
Hướng dẫn liên quan: