Giải CAPTCHA
reCaptcha
Trình duyệt thu thập dữ liệu Scrapeless chỉ hỗ trợ bạn tự động giải reCaptchaV2; các thao tác tiếp theo cần được bạn tự triển khai.
Cloudflare
- Cloudflare Turnstile
- Cloudflare Challenge
Trình duyệt thu thập dữ liệu Scrapeless chỉ hỗ trợ bạn tự động giải Turnstile hoặc Challenge; các thao tác tiếp theo cần được bạn tự triển khai. Để biết các thực hành chi tiết về xử lý Cloudflare challenge (bao gồm việc lấy
cf_clearance), vui lòng tham khảo: https://www.scrapeless.com/en/blog/cloudflare-challenge-bypass
Ví dụ giải pháp
Khi chúng ta kết nối tới trình duyệt để truy cập trang web mục tiêu, Scrapeless sẽ tự động giải CAPTCHA. Tuy nhiên, chúng ta cần đảm bảo rằng CAPTCHA đã được giải thành công. Đây là một ví dụ đơn giản: Ví dụ này truy cập trang web mục tiêu và xác nhận rằng CAPTCHA đã được giải thành công bằng cách lắng nghe sự kiện CDP Captcha.solveFinished. Cuối cùng, nó sẽ chụp ảnh màn hình của trang để xác minh.
Ví dụ này định nghĩa hai phương thức chính:
addCaptchaListener: Dùng để lắng nghe các sự kiện CAPTCHA trong phiên trình duyệtonCaptchaFinished: Dùng để chờ quá trình giải CAPTCHA hoàn tất
Danh sách CAPTCHA được hỗ trợ
- reCaptcha v2
- Cloudflare Turnstile
- Cloudflare 5s Challenge
- AWS Challenge
import puppeteer from "puppeteer-core";
import EventEmitter from 'events';
const emitter = new EventEmitter()
const scrapelessUrl = 'wss://browser.scrapeless.com/api/v2/browser?token=your_api_key&sessionTTL=180&proxyCountry=ANY';
export async function example(url) {
const browser = await puppeteer.connect({
browserWSEndpoint: scrapelessUrl,
defaultViewport: null
});
console.log("Verbonden met Scrapeless browser");
try {
const page = await browser.newPage();
// Listen for captcha events
console.debug("addCaptchaListener: Start listening for captcha events");
await addCaptchaListener(page);
console.log("Navigated to URL:", url);
await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 });
console.log("onCaptchaFinished: Waiting for captcha solving to finish...");
await onCaptchaFinished()
// Screenshot for debugging
console.debug("Taking screenshot of the final page...");
await page.screenshot({ path: 'screenshot.png', fullPage: true });
} catch (error) {
console.error(error);
} finally {
await browser.close();
console.log("Browser closed");
}
}
async function addCaptchaListener(page) {
const client = await page.createCDPSession();
client.on("Captcha.detected", (msg) => {
console.debug("Captcha.detected: ", msg);
});
client.on("Captcha.solveFinished", async (msg) => {
console.debug("Captcha.solveFinished: ", msg);
emitter.emit("Captcha.solveFinished", msg);
client.removeAllListeners()
});
}
async function onCaptchaFinished(timeout = 60_000) {
return Promise.race([
new Promise((resolve) => {
emitter.on("Captcha.solveFinished", (msg) => {
resolve(msg);
});
}),
new Promise((_, reject) => setTimeout(() => reject('Timeout'), timeout))
])
}Ví dụ reCaptcha
Gọi phương thức mã ví dụ để xác minh việc tự động giải reCaptcha.
example('https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox-explicit.php');Ví dụ Cloudflare Turnstile
Gọi phương thức mã ví dụ để xác minh việc tự động giải Cloudflare Turnstile.
example('https://www.scrapingcourse.com/login/cf-turnstile');Việc giải Cloudflare Turnstile thành công không chỉ có thể được xác nhận bằng cách lắng nghe sự kiện CDP Captcha.solveFinished, mà còn bằng cách lắng nghe window.turnstile.getResponse(). Đây là một ví dụ hoàn chỉnh:
import puppeteer from "puppeteer-core";
const scrapelessUrl = 'wss://browser.scrapeless.com/api/v2/browser?token=your_api_key&sessionTTL=180&proxyCountry=ANY';
export async function turnstileExample(url) {
const browser = await puppeteer.connect({
browserWSEndpoint: scrapelessUrl,
defaultViewport: null
});
console.log("Verbonden met Scrapeless browser");
try {
const page = await browser.newPage();
console.log("Navigated to URL:", url);
await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 });
console.log("onCaptchaFinished: Waiting for captcha solving to finish...");
await waitTurnstile(page)
// Screenshot for debugging
console.debug("Taking screenshot of the final page...");
await page.screenshot({ path: 'screenshot.png', fullPage: true });
} catch (error) {
console.error(error);
} finally {
await browser.close();
console.log("Browser closed");
}
}
async function waitTurnstile(page) {
await page.waitForFunction(() => {
return window.turnstile && window.turnstile.getResponse();
});
const token = await page.evaluate(() => {
return window.turnstile.getResponse();
});
console.log("Cloudflare Turnstile token:", token);
}
turnstileExample('https://www.scrapingcourse.com/login/cf-turnstile');Ví dụ Cloudflare Challenge
Cloudflare Challenge có tính đặc biệt vì đôi khi nó sẽ không kích hoạt một Cloudflare Challenge, và phương pháp xác nhận việc giải thành công bằng cách lắng nghe các sự kiện CDP sẽ bị hết thời gian chờ. Do đó, chờ đợi sự xuất hiện của các phần tử trên trang sau khi giải xong là một phương pháp ổn định hơn. Đây là một ví dụ hoàn chỉnh:
import puppeteer from "puppeteer-core";
const scrapelessUrl = 'wss://browser.scrapeless.com/api/v2/browser?token=your_api_key&sessionTTL=180&proxyCountry=ANY';
export async function challengeExample(url) {
const browser = await puppeteer.connect({
browserWSEndpoint: scrapelessUrl,
defaultViewport: null
});
console.log("Verbonden met Scrapeless browser");
try {
const page = await browser.newPage();
console.log("Navigated to URL:", url);
await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 });
console.log("onCaptchaFinished: Waiting for captcha solving to finish...");
await waitChallenge(page, 'main.page-content .challenge-info')
// Screenshot for debugging
console.debug("Taking screenshot of the final page...");
await page.screenshot({ path: 'screenshot.png', fullPage: true });
} catch (error) {
console.error(error);
} finally {
await browser.close();
console.log("Browser closed");
}
}
async function waitChallenge(page, selector) {
await page.waitForSelector(selector);
console.log("Cloudflare Challenge completed");
}
challengeExample('https://www.scrapingcourse.com/cloudflare-challenge');