はじめに
この記事では、Cloudflareのbot検知を回避してスクレイピングを行う方法について紹介します。
CloudflareのBot検知とは
CloudflareにはBotを検知する機能があります。Botだと検知されると、確認画面が表示され、永遠にループすることがあります。
従来の回避方法
以前は、下記のundetected-chromedriver
ライブラリを用いることで回避できましたが、2023年12月20日現在では効果がありません。
DrissionPage
このundetected-chromedriverのissueでも取り上げられている、bot検知を回避できるライブラリが「DrissionPage」です。
中国語で書かれていますが、翻訳機能やAIを活用すれば理解できます。
DrissionPageは、requestsベースのデータ収集の速さと、ブラウザベースのデータ収集の容易さを組み合わせるように設計されています。このライブラリは、共通の機能をカプセル化し、開発と実行の効率を向上させるためのユーザーフレンドリーなインターフェースを提供します。速くて効率的であり、シンプルさと便利さに焦点を当てて設計されています。
このライブラリには独自のカーネルがあり、多くの便利な機能があります。異なるブラウザバージョン用の異なるドライバーを必要とせず、より高速に動作し、iframe間での要素の検索を切り替えることなく行い、ブラウザ内の複数のタブを同時に操作でき、ブラウザキャッシュから画像を保存し、ウェブページ全体のスクリーンショットを撮ることができ、shadow-rootの非オープン状態を扱うことができます。
このライブラリには他にも多くの機能があります。
シンプルな構文規則と統合された共通機能。
簡単で安定した要素の位置決め。
不安定なネットワークに対する待機と自動リトライ機能。
強力なダウンロードツール。
既に開いているブラウザの再利用。
一般的な設定を保存するためのiniファイルの使用。
解析エンジンとしてのlxmlの組み込み。
POMモードのカプセル化の使用、テストに適しており拡張が容易。
DrissionPageを使ったスクレイピング方法
セットアップ
pip install drissionpage
Seleniumとの比較
Selenium使用例
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
driver.get("取得したいページのURL")
html = driver.page_source
DrissionPage使用例
from DrissionPage import ChromiumPage
page = ChromiumPage()
page.get("取得したいページのURL")
html_content = page.html
page.quit()
検証
Cloudflareを使用するサイトでの検証を行います。
検証サイト
このサイトのrobots.txt
ではスクレイピングが許容されています。
User-Agent: *
Allow: /
Sitemap: https://uniteapi.dev/sitemap.xml
とはいえ高負荷を与えないように注意を払いましょう
Selenium使用時
DrissionPage使用時
SeleniumではCloudflareによってブロックされますが、DrissionPageを使用すると回避できることが確認されました。