CAPSOLVER
ブログ
SeleniumBase と Python を使ったウェブスクレイピング (2024年)

SeleniumBase と Python を使用した 2024 年の Web スクレイピング

Logo of CapSolver

Nikolai Smirnov

Software Development Lead

05-Nov-2024

ウェブスクレイピングは、データ抽出、市場調査、自動化のための強力なツールです。ただし、CAPTCHAは、自動スクレイピングの取り組みを妨げる可能性があります。このガイドでは、SeleniumBase を使用してウェブスクレイピングを実行し、quotes.toscrape.com を例に、CapSolver を統合してCAPTCHAを効率的に解決する方法について説明します。

SeleniumBaseの概要

SeleniumBase は、ウェブ自動化とテストを簡素化するPythonフレームワークです。Selenium WebDriverの機能を拡張し、よりユーザーフレンドリーなAPI、高度なセレクター、自動待ち時間、追加のテストツールを提供します。

SeleniumBaseのセットアップ

始める前に、システムにPython 3がインストールされていることを確認してください。SeleniumBaseをセットアップするには、次の手順に従ってください。

  1. SeleniumBaseをインストールする:

    bash Copy
    pip install seleniumbase
  2. インストールを確認する:

    bash Copy
    sbase --help

SeleniumBaseを使用した基本的なスクレイパー

quotes.toscrape.com に移動して、引用と著者の名前を抽出する簡単なスクリプトを作成してみましょう。

例: ホームページから引用とその作者の名前をスクレイピングする。

python Copy
# scrape_quotes.py

from seleniumbase import BaseCase

class QuotesScraper(BaseCase):
    def test_scrape_quotes(self):
        self.open("https://quotes.toscrape.com/")
        quotes = self.find_elements("div.quote")
        for quote in quotes:
            text = quote.find_element("span.text").text
            author = quote.find_element("small.author").text
            print(f"\"{text}\" - {author}")

if __name__ == "__main__":
    QuotesScraper().main()

スクリプトを実行する:

bash Copy
python scrape_quotes.py

出力:

Copy
“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.” - Albert Einstein
...

より高度なウェブスクレイピングの例

ウェブスクレイピングのスキルを向上させるために、SeleniumBaseを使用したより高度な例を見てみましょう。

複数ページのスクレイピング(ページネーション)

多くのウェブサイトでは、コンテンツが複数のページにわたって表示されます。スクリプトを変更して、すべてのページを移動し、引用をスクレイピングしてみましょう。

python Copy
# scrape_quotes_pagination.py

from seleniumbase import BaseCase

class QuotesPaginationScraper(BaseCase):
    def test_scrape_all_quotes(self):
        self.open("https://quotes.toscrape.com/")
        while True:
            quotes = self.find_elements("div.quote")
            for quote in quotes:
                text = quote.find_element("span.text").text
                author = quote.find_element("small.author").text
                print(f"\"{text}\" - {author}")

            # 次のページがあるかどうかを確認する
            if self.is_element_visible('li.next > a'):
                self.click('li.next > a')
            else:
                break

if __name__ == "__main__":
    QuotesPaginationScraper().main()

説明:

  • "Next"ボタンがあるかどうかを確認することで、ページをループ処理します。
  • is_element_visible を使用して、"Next"ボタンの有無を確認します。
  • "Next"ボタンをクリックして、次のページに移動します。

AJAXによる動的コンテンツの処理

一部のウェブサイトでは、AJAXを使用してコンテンツを動的に読み込んでいます。SeleniumBaseでは、要素が読み込まれるのを待つことで、このようなシナリオを処理できます。

例: 動的に読み込まれるウェブサイトからタグをスクレイピングする。

python Copy
# scrape_dynamic_content.py

from seleniumbase import BaseCase

class TagsScraper(BaseCase):
    def test_scrape_tags(self):
        self.open("https://quotes.toscrape.com/")
        # 'Top Ten tags' リンクをクリックして、タグを動的に読み込む
        self.click('a[href="/tag/"]')
        self.wait_for_element("div.tags-box")
        tags = self.find_elements("span.tag-item > a")
        for tag in tags:
            tag_name = tag.text
            print(f"Tag: {tag_name}")

if __name__ == "__main__":
    TagsScraper().main()

説明:

  • div.tags-box 要素が読み込まれるまで待ちます。これにより、動的コンテンツが確実に読み込まれます。
  • wait_for_element を使用することで、要素が使用可能になるまでスクリプトが続行されません。

フォームの送信とログイン

場合によっては、コンテンツをスクレイピングする前に、ウェブサイトにログインする必要があることがあります。フォームの送信を処理する方法を次に示します。

例: ウェブサイトにログインして、認証されたユーザーページから引用をスクレイピングする。

python Copy
# scrape_with_login.py

from seleniumbase import BaseCase

class LoginScraper(BaseCase):
    def test_login_and_scrape(self):
        self.open("https://quotes.toscrape.com/login")
        # ログインフォームに入力する
        self.type("input#username", "testuser")
        self.type("input#password", "testpass")
        self.click("input[type='submit']")

        # ログアウトリンクをチェックすることで、ログインを確認する
        if self.is_element_visible('a[href="/logout"]'):
            print("Logged in successfully!")

            # ここで引用をスクレイピングする
            self.open("https://quotes.toscrape.com/")
            quotes = self.find_elements("div.quote")
            for quote in quotes:
                text = quote.find_element("span.text").text
                author = quote.find_element("small.author").text
                print(f"\"{text}\" - {author}")
        else:
            print("Login failed.")

if __name__ == "__main__":
    LoginScraper().main()

説明:

  • ログインページに移動して、資格情報を入力します。
  • フォームを送信した後、ログアウトリンクの有無をチェックすることで、ログインを確認します。
  • ログインしたユーザーが利用できるコンテンツをスクレイピングします。

注: quotes.toscrape.com では、デモ用にユーザー名とパスワードが許可されているため、ダミーの資格情報を使用できます。

テーブルからのデータの抽出

ウェブサイトでは、多くの場合、データがテーブル形式で表示されます。テーブルデータの抽出方法を次に示します。

例: テーブルからデータをスクレイピングする(ウェブサイトにはテーブルがないため、仮定上の例)。

python Copy
# scrape_table.py

from seleniumbase import BaseCase

class TableScraper(BaseCase):
    def test_scrape_table(self):
        self.open("https://www.example.com/table-page")
        # テーブルが読み込まれるまで待つ
        self.wait_for_element("table#data-table")
        rows = self.find_elements("table#data-table > tbody > tr")
        for row in rows:
            cells = row.find_elements("td")
            row_data = [cell.text for cell in cells]
            print(row_data)

if __name__ == "__main__":
    TableScraper().main()

説明:

  • IDまたはクラスでテーブルを探します。
  • 各行と各セルを反復処理して、データを抽出します。
  • quotes.toscrape.com にはテーブルがないため、URLをテーブルを含む実際のウェブサイトに置き換えてください。

SeleniumBaseへのCapSolverの統合

quotes.toscrape.com にはCAPTCHAはありませんが、実際には多くのウェブサイトにCAPTCHAが実装されています。このような場合に備えて、CapSolverブラウザ拡張機能を使用して、SeleniumBaseスクリプトにCapSolverを統合する方法を説明します。

Capsolverを使用してSeleniumBaseでCAPTCHAを解決する方法

  1. CapSolver拡張機能をダウンロードする:

    • CapSolver GitHubリリースページ にアクセスします。
    • 最新バージョンのCapSolverブラウザ拡張機能をダウンロードします。
    • プロジェクトのルートディレクトリ(例:./capsolver_extension)に拡張機能を解凍します。

CapSolver拡張機能の構成

  1. 構成ファイルを見つける:

    • capsolver_extension/assets ディレクトリにある config.json ファイルを探します。
  2. 構成を更新する:

    • 解決するCAPTCHAの種類に応じて、enabledForcaptchaenabledForRecaptchaV2true に設定します。
    • captchaMode または reCaptchaV2Mode を自動解決のために "token" に設定します。

    config.json の例:

    json Copy
    {
      "apiKey": "YOUR_CAPSOLVER_API_KEY",
      "enabledForcaptcha": true,
      "captchaMode": "token",
      "enabledForRecaptchaV2": true,
      "reCaptchaV2Mode": "token",
      "solveInvisibleRecaptcha": true,
      "verbose": false
    }
    • "YOUR_CAPSOLVER_API_KEY" を実際のCapSolver APIキーに置き換えます。

SeleniumBaseでのCapSolver拡張機能の読み込み

SeleniumBaseでCapSolver拡張機能を使用するには、ブラウザが起動時に拡張機能を読み込むように構成する必要があります。

  1. SeleniumBaseスクリプトを変更する:

    • selenium.webdriver.chrome.options から ChromeOptions をインポートします。
    • CapSolver拡張機能を読み込むようにオプションを設定します。

    例:

    python Copy
    from seleniumbase import BaseCase
    from selenium.webdriver.chrome.options import Options as ChromeOptions
    import os
    
    class QuotesScraper(BaseCase):
        def setUp(self):
            super().setUp()
    
            # CapSolver拡張機能へのパス
            extension_path = os.path.abspath('capsolver_extension')
    
            # Chromeオプションを構成する
            options = ChromeOptions()
            options.add_argument(f"--load-extension={extension_path}")
            options.add_argument("--disable-gpu")
            options.add_argument("--no-sandbox")
    
            # 新しいオプションを使用してドライバーを更新する
            self.driver.quit()
            self.driver = self.get_new_driver(browser_name="chrome", options=options)
  2. 拡張機能のパスが正しいことを確認する:

    • extension_path が、CapSolver拡張機能を解凍したディレクトリを指していることを確認してください。

CapSolver統合によるスクリプトの例

SeleniumBaseにCapSolverを統合して、CAPTCHAを自動的に解決する、完全なスクリプトを次に示します。引き続き、https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php を例として使用します。

python Copy
# scrape_quotes_with_capsolver.py
from seleniumbase import BaseCase
from selenium.webdriver.chrome.options import Options as ChromeOptions
import os

class QuotesScraper(BaseCase):
    def setUp(self):
        super().setUp()

        # CapSolver拡張機能フォルダへのパス
        # このパスがCapSolver Chrome拡張機能フォルダを正しく指していることを確認してください
        extension_path = os.path.abspath('capsolver_extension')

        # Chromeオプションを構成する
        options = ChromeOptions()
        options.add_argument(f"--load-extension={extension_path}")
        options.add_argument("--disable-gpu")
        options.add_argument("--no-sandbox")

        # 新しいオプションを使用してドライバーを更新する
        self.driver.quit()  # 既存のドライバーインスタンスを閉じる
        self.driver = self.get_new_driver(browser_name="chrome", options=options)

    def test_scrape_quotes(self):
        # reCAPTCHAのあるターゲットサイトに移動する
        self.open("https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php")

        # CAPTCHAの有無をチェックし、必要に応じて解決する
        if self.is_element_visible("iframe[src*='recaptcha']"):
            # CapSolver拡張機能がCAPTCHAを自動的に処理する
            print("CAPTCHA detected, waiting for CapSolver extension to solve it...")

            # CAPTCHAが解決されるまで待つ
            self.sleep(10)  # 平均解決時間に基づいて時間を調整する

        # CAPTCHAが解決された後にスクレイピングのアクションを実行する
        # 例として、ボタンをクリックしたり、テキストを抽出したりする
        self.assert_text("reCAPTCHA demo", "h1")  # ページの内容を確認する

    def tearDown(self):
        # テスト後にクリーンアップしてブラウザを閉じる
        self.driver.quit()
        super().tearDown()

if __name__ == "__main__":
    QuotesScraper().main()

説明:

  • setUp メソッド:

    • 各テストの前に、CapSolver拡張機能を使用してChromeブラウザを構成するために、setUp メソッドをオーバーライドします。
    • CapSolver拡張機能へのパスを指定し、Chromeオプションに追加します。
    • 既存のドライバーを終了し、更新されたオプションを使用して新しいドライバーを作成します。
  • test_scrape_quotes メソッド:

    • ターゲットウェブサイトに移動します。
    • CapSolver拡張機能が、CAPTCHAを自動的に検出して解決します。
    • 通常どおりスクレイピングタスクを実行します。
  • tearDown メソッド:

    • リソースを解放するために、テスト後にブラウザが閉じられるようにします。

スクリプトの実行:

bash Copy
python scrape_quotes_with_capsolver.py

注: quotes.toscrape.com にはCAPTCHAはありませんが、CapSolverを統合することで、CAPTCHAを使用しているサイトをスクレイピングできるようになります。

ボーナスコード

CapSolver で最高のCAPTCHAソリューションのボーナスコード を取得する: scrape。このコードを引き換えると、チャージごとに最大5%のボーナスが、無制限に適用されます。

まとめ

このガイドでは、SeleniumBaseを使用したウェブスクレイピングの方法について説明しました。基本的なスクレイピングテクニックから、ページネーション、動的コンテンツ、フォーム送信の処理などのより高度な例まで、さまざまな内容を扱いました。また、SeleniumBaseスクリプトにCapSolverを統合して、CAPTCHAを自動的に解決し、スクレイピングセッションを途切れさせないようにする方法も示しました。

コンプライアンス免責事項: このブログで提供される情報は、情報提供のみを目的としています。CapSolverは、すべての適用される法律および規制の遵守に努めています。CapSolverネットワークの不法、詐欺、または悪用の目的での使用は厳格に禁止され、調査されます。私たちのキャプチャ解決ソリューションは、公共データのクローリング中にキャプチャの問題を解決する際に100%のコンプライアンスを確保しながら、ユーザーエクスペリエンスを向上させます。私たちは、サービスの責任ある使用を奨励します。詳細については、サービス利用規約およびプライバシーポリシーをご覧ください。

もっと見る

Webスクレイピングに最適なユーザーエージェントと使用方法
Webスクレイピングに最適なユーザーエージェントと使用方法

ウェブスクレイピングにおける最良のユーザーエージェントガイドと、検知回避のための効果的な使用方法。ユーザーエージェントの重要性、種類、シームレスで検知されないウェブスクレイピングのための使用方法を解説します。

Logo of CapSolver

Sora Fujimoto

07-Mar-2025

Webスクレイピングと自動化のためのCloudflare JSチャレンジの解決方法
Webスクレイピングと自動化のためのCloudflare JSチャレンジの解決方法

CloudflareのJavaScriptチャレンジを解決し、シームレスなウェブスクレイピングと自動化を実現する方法を学びましょう。ヘッドレスブラウザ、プロキシローテーション、そしてCapSolverの先進的なCAPTCHA解決機能の活用など、効果的な戦略を発見してください。

Cloudflare
Logo of CapSolver

Sora Fujimoto

05-Mar-2025

Cloudflare TLSフィンガープリンティング:その仕組みと解決策
Cloudflare TLSフィンガープリンティング:概要と解決策

CloudflareのTLSフィンガープリンティングによるセキュリティへの活用、ボットの検出とブロック方法、ならびにWebスクレイピングや自動ブラウジングタスクにおける解決策を学びましょう。

Cloudflare
Logo of CapSolver

Sora Fujimoto

28-Feb-2025

なぜ私は何度もロボットでないことを確認するよう求められるのですか?
なぜ私は何度もロボットでないことの確認を求められるのですか?

Googleがロボットではないことを確認するよう促す理由を学び、CapSolverのAPIを使用してCAPTCHAチャレンジを効率的に解決するなどのソリューションを探ります。

Logo of CapSolver

Sora Fujimoto

25-Feb-2025

Cloudflareで保護されたウェブサイトからデータを取得する方法
Cloudflare保護ウェブサイトからのデータ抽出方法

このガイドでは、Cloudflareで保護されたウェブサイトからデータを抽出するための倫理的で効果的な手法を探ります。

Cloudflare
Logo of CapSolver

Sora Fujimoto

20-Feb-2025

ウェブサイトはなぜ私をボットだと考えるのか?そして、その解決策は?
ウェブサイトはなぜ私をボットだと思うのか?そして解決策は?

ウェブサイトがあなたをボットとフラグ付けする理由と、検出を回避する方法を理解する。主なトリガーには、CAPTCHAチャレンジ、疑わしいIPアドレス、および異常なブラウザの動作が含まれます。

Logo of CapSolver

Sora Fujimoto

20-Feb-2025