Khi máy cạp của bạn gặp thử thách reCAPTCHA v2, quy trình làm việc sẽ dừng lại. Trang này chờ con người giải quyết hộp kiểm hoặc lưới hình ảnh trước khi cung cấp dữ liệu bạn cần. Cách nhanh nhất để tiếp tục thu thập dữ liệu là định tuyến CAPTCHA tới API của bộ giải: trích xuất khóa trang và URL trang, gửi chúng tớiCaptchaAI, nhận mã thông báo hợp lệ và đưa mã thông báo đó trở lại trang.
Hướng dẫn này hiển thị quy trình hoàn chỉnh với mã hoạt động cho Python (Selenium + request) và Node.js (Puppeteer).
Quy trình làm việc hoạt động như thế nào
Mỗi tiện ích reCAPTCHA v2 đều có hai tham số mà trình quét của bạn cần:
googlekey— khóa trang web công khai được nhúng trong trang HTMLpageurl— URL nơi CAPTCHA xuất hiện
Công cụ quét của bạn gửi chúng tới API CaptchaAI, chờ mã thông báo được giải quyết và đưa mã thông báo trở lại trường g-recaptcha-response của trang (hoặc gọi hàm gọi lại). Phần phụ trợ của trang đích sẽ xác minh mã thông báo dựa trên Google và cho phép yêu cầu được thông qua.
Python: Selen + CaptchaAI
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# Step 1: Open the page with Selenium
driver = webdriver.Chrome()
driver.get("https://example.com/protected-page")
# Step 2: Extract the sitekey
sitekey = driver.find_element(By.CSS_SELECTOR, ".g-recaptcha").get_attribute("data-sitekey")
page_url = driver.current_url
# Step 3: Submit to CaptchaAI
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"json": 1
}).json()
task_id = response["request"]
# Step 4: Poll for result
token = None
for _ in range(40):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": task_id,
"json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
break
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve failed: {result['request']}")
# Step 5: Inject the token and submit
driver.execute_script(
f'document.getElementById("g-recaptcha-response").innerHTML = "{token}";'
)
# Check for callback
callback = driver.execute_script(
'var el = document.querySelector(".g-recaptcha"); '
'return el ? el.getAttribute("data-callback") : null;'
)
if callback:
driver.execute_script(f'{callback}("{token}");')
else:
driver.find_element(By.CSS_SELECTOR, "form").submit()
# Step 6: Scrape the data
print(driver.page_source[:500])
driver.quit()
Node.js: Puppeteer + CaptchaAI
const puppeteer = require("puppeteer");
async function scrapeWithCaptcha(url) {
const browser = await puppeteer.launch({ headless: "new" });
const page = await browser.newPage();
await page.goto(url, { waitUntil: "networkidle2" });
// Extract sitekey
const sitekey = await page.$eval(".g-recaptcha", (el) => el.dataset.sitekey);
// Submit to CaptchaAI
const submitRes = await fetch(
`https://ocr.captchaai.com/in.php?${new URLSearchParams({
key: "YOUR_API_KEY",
method: "userrecaptcha",
googlekey: sitekey,
pageurl: url,
json: 1,
})}`
);
const { request: taskId } = await submitRes.json();
// Poll for result
let token;
for (let i = 0; i < 40; i++) {
await new Promise((r) => setTimeout(r, 5000));
const res = await fetch(
`https://ocr.captchaai.com/res.php?${new URLSearchParams({
key: "YOUR_API_KEY",
action: "get",
id: taskId,
json: 1,
})}`
);
const data = await res.json();
if (data.status === 1) {
token = data.request;
break;
}
if (data.request !== "CAPCHA_NOT_READY")
throw new Error(`Solve failed: ${data.request}`);
}
// Inject token
await page.evaluate((t) => {
document.getElementById("g-recaptcha-response").innerHTML = t;
const cb = document.querySelector(".g-recaptcha")?.dataset.callback;
if (cb && window[cb]) window[cb](t);
}, token);
// Wait for navigation after form submit
await page.waitForNavigation({ waitUntil: "networkidle2" });
const content = await page.content();
await browser.close();
return content;
}
scrapeWithCaptcha("https://example.com/protected-page").then(console.log);
Chế độ headless và có đầu
Một số trang web phát hiện các trình duyệt không có giao diện người dùng và chặn chúng trước khi CAPTCHA xuất hiện. Nếu bạn bị chặn trước khi thấy reCAPTCHA:
- Sử dụng
headless: "new"trong Puppeteer (chế độ kiểm thử mới hơn) - Thêm `` vào cờ Chrome
- Sử dụng chuỗi Tác nhân người dùng thực
- Hãy cân nhắc sử dụng tính năng xoay vòng proxy với giải pháp CaptchaAI của bạn
Cách tiếp cận chỉ HTTP (không có trình duyệt)
Nếu trang đích gửi CAPTCHA trong luồng gửi biểu mẫu, bạn có thể bỏ qua hoàn toàn trình duyệt:
import requests
import time
session = requests.Session()
session.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0"
# Load the page to get cookies
session.get("https://example.com/protected-page")
# Solve the CAPTCHA
sitekey = "6Le-wvkSAAAAAN..." # extracted from page HTML
solve_resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY", "method": "userrecaptcha",
"googlekey": sitekey, "pageurl": "https://example.com/protected-page",
"json": 1
}).json()
task_id = solve_resp["request"]
time.sleep(15)
# Poll
for _ in range(30):
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
break
time.sleep(5)
# Submit with token
resp = session.post("https://example.com/protected-page", data={
"g-recaptcha-response": token,
"other_field": "value"
})
print(resp.text[:500])
Câu hỏi thường gặp
Việc giải reCAPTCHA v2 có làm chậm công cụ cạp của tôi không?
Mỗi lần giải mất 15–60 giây. Để quét khối lượng lớn, hãy chạy song song nhiều giải pháp (CaptchaAI hỗ trợ các tác vụ đồng thời trên mỗi luồng).
Tôi có thể lưu vào bộ nhớ đệm mã thông báo reCAPTCHA không?
Không. Mỗi mã thông báo chỉ được sử dụng một lần và hết hạn sau ~2 phút. Bạn cần một giải pháp mới cho mỗi yêu cầu trang được bảo vệ.
Tôi có cần trình duyệt để xử lý reCAPTCHA v2 không?
Không phải lúc nào cũng vậy. Nếu trang web chấp nhận g-recaptcha-response làm trường POST, bạn có thể sử dụng phương pháp chỉ HTTP. Nếu trang web yêu cầu chèn mã thông báo dựa trên JavaScript thì bạn cần có trình duyệt.
Làm cách nào để xử lý proxy luân phiên bằng CaptchaAI?
CaptchaAI giải quyết CAPTCHA trên cơ sở hạ tầng của chính nó — bạn không cần chuyển proxy của mình cho reCAPTCHA v2 tiêu chuẩn. Sử dụng proxy của bạn cho các yêu cầu thu thập dữ liệu tiếp theo.
Điều gì sẽ xảy ra nếu trang web sử dụng Enterprise reCAPTCHA?
Thêm enterprise=1 vào yêu cầu CaptchaAI của bạn. Nhìn thấyCách giải reCAPTCHA v2 Enterprise bằng API.
Bắt đầu quét qua reCAPTCHA v2
- Nhận khóa API của bạn tạicaptchaai.com/api.php
- Trích xuất khóa trang web từ trang đích
- Sử dụng các ví dụ về mã ở trên để giải quyết và đưa vào
- Mở rộng quy mô bằng các giải pháp đồng thời cho quy trình làm việc có khối lượng lớn
Hướng dẫn liên quan
- Cách giải reCAPTCHA v2 bằng API
- Xử lý CAPTCHA Selenium bằng Python
- Puppeteer giải mã Captcha Node.js
- Các lỗi giải quyết reCAPTCHA v2 thường gặp