Tài liệuTrình duyệt và CrawlAgent BrowserGiải CAPTCHA

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ệt
  • onCaptchaFinished: 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');