Proxy và dịch vụ giải CAPTCHA lo hai việc khác nhau: proxy quyết định request đi ra từ IP nào, còn CaptchaAI xử lý thử thách CAPTCHA khi trang bắn ra. Ghép Oxylabs với CaptchaAI, bạn có một luồng scraping ổn định — Oxylabs cấp IP (trung tâm dữ liệu, dân cư, ISP), CaptchaAI nhận sitekey rồi trả token qua bốn bước: gửi task, nhận ID task, polling res.php, dùng token. Bài này đi thẳng vào code Python ghép hai dịch vụ, kèm cách chọn loại IP và giữ IP cố định trong một phiên.
Các loại IP của Oxylabs
Oxylabs chia hạ tầng thành mấy nhóm IP, mỗi nhóm đánh đổi khác nhau giữa tốc độ và khả năng bị nhận diện. Chọn đúng loại giúp giảm số lần CAPTCHA bắn ra trước khi CaptchaAI phải vào cuộc:
- Trung tâm dữ liệu (2 triệu+ IP): rất nhanh, hợp khối lượng lớn và các luồng ưu tiên tốc độ.
- IP dân cư (100 triệu+ IP): tốc độ trung bình, hợp trang nhạy cảm hay bắn CAPTCHA.
- IP ISP (cấp dân cư): nhanh, hợp thương mại điện tử và mạng xã hội.
- IP di động (20 triệu+ IP): chậm hơn, dành cho mục tiêu chuyên thiết bị di động.
- SERP Scraper API (có quản lý): nhanh, chuyên lấy kết quả Google/Bing.
Ghép Oxylabs với CaptchaAI bằng Python
Thiết lập với thư viện requests
Đoạn code dưới đây cấu hình proxy Oxylabs rồi định nghĩa hàm solve_recaptcha: gửi sitekey tới in.php và polling res.php cho tới khi có token.
import requests
import time
OXYLABS_USER = "customer-USERNAME"
OXYLABS_PASS = "PASSWORD"
OXYLABS_ENDPOINT = "pr.oxylabs.io:7777"
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
# Residential đa dạng nguồn yêu cầu
proxies = {
"http": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
"https": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
}
def fetch_page(url, country=None):
"""Fetch page through Oxylabs proxy."""
user = OXYLABS_USER
if country:
user += f"-cc-{country}"
proxy = {
"http": f"http://{user}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
"https": f"http://{user}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
}
return requests.get(
url,
proxies=proxy,
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36"
},
timeout=30,
)
def solve_recaptcha(site_url, sitekey):
"""Solve via CaptchaAI."""
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
"key": CAPTCHAAI_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": site_url,
"json": 1,
})
data = resp.json()
if data["status"] != 1:
raise Exception(f"Submit: {data['request']}")
task_id = data["request"]
for _ in range(60):
time.sleep(5)
resp = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": CAPTCHAAI_KEY,
"action": "get",
"id": task_id,
"json": 1,
})
data = resp.json()
if data["request"] == "CAPCHA_NOT_READY":
continue
if data["status"] == 1:
return data["request"]
raise Exception(f"Solve: {data['request']}")
raise TimeoutError("Timeout")
Hàm fetch_page gắn mã quốc gia vào username Oxylabs; solve_recaptcha lặp tối đa 60 lần, mỗi lần cách nhau 5 giây, tức chờ tối đa khoảng 5 phút trước khi báo timeout.
Giữ nguyên IP với phiên cố định
Một luồng đăng nhập cần cùng một IP từ lúc tải form đến lúc submit token. Oxylabs gắn tham số sessid vào username để cố định IP trong suốt phiên.
def get_oxylabs_sticky_proxy(session_id, country=None):
"""Create Oxylabs sticky session (same IP)."""
user = OXYLABS_USER + f"-sessid-{session_id}"
if country:
user += f"-cc-{country}"
proxy_url = f"http://{user}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}"
return {"http": proxy_url, "https": proxy_url}
# CAPTCHA workflow with sticky IP
import random, string
session = "".join(random.choices(string.ascii_lowercase, k=8))
proxy = get_oxylabs_sticky_proxy(session, country="us")
# All requests use the same IP
resp = requests.get("https://staging.example.com/qa-form", proxies=proxy)
# ... solve CAPTCHA ...
resp = requests.post("https://target.com/submit", proxies=proxy, data={
"g-recaptcha-response": token,
})
Mọi request trong phiên dùng chung một IP, nhờ đó token reCAPTCHA khớp với IP đã tải trang khi bạn submit.
Dùng Oxylabs Web Scraper API cùng CaptchaAI
Với trang phải render JavaScript nặng, Web Scraper API của Oxylabs dựng sẵn HTML; bạn quét data-sitekey trong HTML đó rồi đẩy sang CaptchaAI.
def scrape_with_oxylabs_api(url):
"""Use Oxylabs Web Scraper API for rendering, CaptchaAI for CAPTCHAs."""
resp = requests.post(
"https://realtime.oxylabs.io/v1/queries",
auth=(OXYLABS_USER, OXYLABS_PASS),
json={
"source": "universal",
"url": url,
"render": "html",
"browser_instructions": [
{"type": "wait", "wait_time_s": 3},
],
},
)
result = resp.json()
html = result["results"][0]["content"]
# Check for CAPTCHA in rendered HTML
import re
sitekey_match = re.search(r'data-sitekey="([^"]+)"', html)
if sitekey_match:
sitekey = sitekey_match.group(1)
token = solve_recaptcha(url, sitekey)
return {"html": html, "captcha_solved": True, "token": token}
return {"html": html, "captcha_solved": False}
Nếu tìm thấy data-sitekey, hàm gọi solve_recaptcha và đính token vào kết quả trả về.
Chọn IP trung tâm dữ liệu hay IP dân cư
IP trung tâm dữ liệu nhanh và rẻ nhưng dễ bị nhận diện nên CAPTCHA bắn ra nhiều hơn; IP dân cư thì ngược lại. Ví dụ, một đội nghiên cứu thị trường theo dõi giá công khai trên Shopee, Lazada hay Tiki thường bắt đầu bằng IP trung tâm dữ liệu cho các trang danh mục ít phòng vệ, rồi chuyển sang IP dân cư ở những trang hay bắn CAPTCHA. Nguyên tắc chọn thực tế:
- Trang công khai, phòng vệ nhẹ: dùng IP trung tâm dữ liệu cho nhanh và tiết kiệm.
- Trang hay bắn CAPTCHA: chuyển sang IP dân cư để giảm số thử thách phát sinh.
- Dù đi hướng nào, CaptchaAI vẫn giải phần CAPTCHA còn lại nên bạn không phải đổi code.
# Datacenter: Fast but higher CAPTCHA rate
DC_PROXY = {
"http": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@dc.pr.oxylabs.io:10000",
"https": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@dc.pr.oxylabs.io:10000",
}
# Residential: Slower but lower CAPTCHA rate
RES_PROXY = {
"http": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@pr.oxylabs.io:7777",
"https": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@pr.oxylabs.io:7777",
}
def smart_proxy_selection(url, captcha_sensitive=True):
"""Pick proxy type based on target site sensitivity."""
if captcha_sensitive:
return RES_PROXY # Less likely to trigger CAPTCHA
return DC_PROXY # Faster, CaptchaAI handles any CAPTCHAs
Hàm smart_proxy_selection tự chọn loại IP theo mức nhạy cảm của trang đích.
Chạy nhiều URL song song
Khi xử lý danh sách URL lớn, chạy song song bằng ThreadPoolExecutor giúp tận dụng nhiều thread cùng lúc. Số thread giải đồng thời (luồng giải đồng thời) phía CaptchaAI phụ thuộc gói bạn đăng ký, thấp nhất là BASIC ($15/tháng, 5 thread) và cao nhất là VIP-3 với 5.000 thread.
from concurrent.futures import ThreadPoolExecutor, as_completed
def process_url(url):
session = "".join(random.choices(string.ascii_lowercase, k=8))
proxy = get_oxylabs_sticky_proxy(session, country="us")
try:
resp = requests.get(url, proxies=proxy, timeout=30)
import re
match = re.search(r'data-sitekey="([^"]+)"', resp.text)
if match:
token = solve_recaptcha(url, match.group(1))
return {"url": url, "status": "solved"}
return {"url": url, "status": "no_captcha"}
except Exception as e:
return {"url": url, "status": "error", "error": str(e)}
urls = ["https://site1.com", "https://site2.com", "https://site3.com"]
with ThreadPoolExecutor(max_workers=5) as executor:
futures = {executor.submit(process_url, u): u for u in urls}
for future in as_completed(futures):
print(future.result())
Mỗi URL chạy trong một phiên cố định riêng; kết quả trả về ngay khi từng future hoàn tất.
Xử lý sự cố thường gặp
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| 403 từ proxy | IP nằm trong danh sách chặn | Đổi sang IP dân cư hoặc luân phiên IP |
| Xác thực thất bại | Sai endpoint | Trung tâm dữ liệu: dc.pr.oxylabs.io:10000, dân cư: pr.oxylabs.io:7777 |
| Phiên cố định hết hạn | Mặc định 10 phút | Tạo session ID mới |
| Trang nào cũng bắn CAPTCHA | IP trung tâm dữ liệu bị nhận diện | Chuyển sang IP dân cư |
| Phản hồi chậm | Độ trễ mạng IP dân cư | Chấp nhận hoặc chuyển sang IP ISP |
Câu hỏi thường gặp
CaptchaAI tính phí theo số CAPTCHA giải hay theo thread?
Theo thread. CaptchaAI bán theo số thread giải đồng thời, mỗi thread giải không giới hạn trong tháng chứ không tính theo từng lần giải. Gói khởi điểm là BASIC ($15/tháng, 5 thread) và bậc cao nhất là VIP-3 với 5.000 thread.
Nên chọn IP trung tâm dữ liệu hay IP dân cư để giảm CAPTCHA?
IP dân cư bắn ít CAPTCHA hơn nên hợp trang phòng vệ mạnh; IP trung tâm dữ liệu nhanh và rẻ hơn, hợp khối lượng lớn khi bạn để CaptchaAI giải mọi CAPTCHA phát sinh.
Phiên cố định của Oxylabs giữ IP trong bao lâu?
Mặc định khoảng 10 phút. Khi phiên hết hạn, tạo session ID mới; giữ nguyên một phiên cho cả luồng tải form, giải CAPTCHA rồi submit để token khớp IP.
CaptchaAI giải được những loại CAPTCHA nào khi scraping?
reCAPTCHA v2, reCAPTCHA v3, Cloudflare Turnstile, GeeTest v3 cùng CAPTCHA ảnh/OCR. CaptchaAI không hỗ trợ hCaptcha và FunCaptcha; GeeTest v4 đang trong diện sắp ra mắt.
Hướng dẫn liên quan
- Tích hợp Bright Data với CaptchaAI
- Thiết lập Smartproxy với CaptchaAI
- So sánh IP ISP và trung tâm dữ liệu khi giải CAPTCHA
Ghép hạ tầng IP của Oxylabs với khả năng giải CAPTCHA của CaptchaAI — lấy API key tại đây.