🍆

PlaywrightでCAPTCHAが出たときに人間が操作するのを待つ

2022/12/07に公開

スクレイピングをしているとCAPTCHAが出て処理が止まるシーンがあります。
CAPTCHAが出ても待機して、人間が操作するのを待つコードをご紹介します。

なお、Google検索結果のスクレイピングは規約違反です。この記事はあくまで "Playwrightにて人力操作を待つ処理(人力サポート処理)" の書き方の例をご紹介しているに過ぎません。Googleでのスクレイピングは控えるようにしてください。Google検索結果を継続的に大量に収集する必要がある場合は、 Google Custom Search JSON API をご利用ください。

注意点

  • ヘッドレスモードでは使えません。
  • 大規模なスクレイピングには向きません。簡易的な小規模なスクレイピングにのみ有効です。大規模スクレイピングの際は、そもそもCAPTCHAが出現しないような仕組みを見つける必要があります。

ちなみにGoogleの検索結果のリンクだけを取得する場合は下記のように指定すればOKかと思います。

document.querySelectorAll('a[href^=http]:not(a[href*=google],a[class]):has(h1,h2,h3,h4,h5,h6):not(:is([jsslot],ul) a[href^=http]:not(a[href*=google],a[class]):has(h1,h2,h3,h4,h5,h6))')

setIntervalで待つだけ。シンプルに解決!

コード自体はとてもシンプルです。

const waitForCAPTCHA = (page) => {
  return new Promise(async (resolve) => {
    const counter = setInterval(async function () {
      const path = await page.url();
      if (path.match(/google\.com\/sorry\/index/)) {
        console.log("停止中");
      } else {
        console.log("続行します");
        clearInterval(counter);
        resolve("");
      }
    }, 500);
  });
};

この関数を page.goto() した直後に、 await waitForCAPTCHA(page); という形で入れて使います。CAPTCHAの出現はURLに google.com/sorry/index が含まれている際に CAPTCHA に引っかかっているという判定です。

CAPTCHAを人力でクリアして検索結果画面が表示されれば自動的に再開されます。

Discussion