サポートされているCAPTCHA

reCaptcha

ScrapelessクローラブラウザはreCaptchaV2の自動解決を支援するのみです。それ以降の操作はご自身で実装する必要があります。

Cloudflare

  • Cloudflare Turnstile
  • Cloudflare Challenge

ScrapelessクローラブラウザはTurnstileまたはChallengeの自動解決を支援するのみです。それ以降の操作はご自身で実装する必要があります。Cloudflareチャレンジ(cf_clearanceの取得を含む)の処理に関する詳細な手順については、https://www.scrapeless.com/en/blog/cloudflare-challenge-bypass を参照してください。

解決例

ターゲットサイトにアクセスするためにブラウザに接続すると、Scrapelessは自動的にCAPTCHAを解決します。しかし、CAPTCHAが正常に解決されたことを確認する必要があります。これは簡単な例です。この例では、ターゲットサイトにアクセスし、Captcha.solveFinished CDPイベントをリッスンすることで、CAPTCHAが正常に解決されたことを確認します。最後に、ページのスクリーンショットを検証のために取得します。

この例では、2つの主要なメソッドを定義しています。

  • addCaptchaListener: ブラウザセッションでCAPTCHAイベントをリッスンするために使用します
  • onCaptchaFinished: CAPTCHAの解決が完了するまで待機するために使用します

サポートされているCAPTCHAリスト

  • 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/browser?token=your_api_key&session_ttl=180&proxy_country=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))
  ])
}

reCaptcha 例

reCaptchaの自動解決を確認するために、exampleコードメソッドを呼び出します。

 example('https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox-explicit.php');

Cloudflare Turnstile 例

Cloudflare Turnstileの自動解決を確認するために、exampleコードメソッドを呼び出します。

 example('https://www.scrapingcourse.com/login/cf-turnstile');

Cloudflare Turnstileの解決成功は、Captcha.solveFinished CDPイベントをリッスンするだけでなく、window.turnstile.getResponse()をリッスンすることでも確認できます。これが完全な例です。

import puppeteer from "puppeteer-core";
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=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');

Cloudflare Challenge 例

Cloudflare Challengeは特殊で、場合によってはCloudflare Challengeがトリガーされず、CDPイベントをリッスンして解決成功を確認する方法がタイムアウトします。そのため、解決後にページ上の要素の出現を待つ方が安定した方法です。これが完全な例です。

import puppeteer from "puppeteer-core";
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=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');