CAPSOLVER
ブログ
RestSharp(C#ライブラリ)を使ったウェブスクレイピングの方法

RestSharp (C# ライブラリ) を用いたウェブスクレイピングの方法

Logo of CapSolver

Anh Tuan

Data Science Expert

17-Sep-2024

Web スクレイピングは、Web サイトからデータを抽出するための不可欠な技術ですが、最新の Web アプリケーションは、自動アクセスを防ぐために CAPTCHA などのセキュリティ対策を頻繁に実装しています。Google reCAPTCHA などの CAPTCHA は、人間ユーザーとボットを区別するために設計されており、自動スクリプトがコンテンツを効果的にスクレイピングすることを困難にしています。

これらの障害を克服するために、開発者は HTTP リクエストを簡素化し、CAPTCHA の解決を処理するツールやサービスを利用できます。RestSharp は、RESTful API への HTTP リクエストを行うプロセスを簡素化する強力で使いやすい C# ライブラリです。HtmlAgilityPack などの HTML パーサーと組み合わせると、Web スクレイピングタスクのための堅牢なソリューションになります。
RestSharp WebScraping

ただし、スクレイピング中に CAPTCHA の課題が発生すると、自動化プロセスが停止する可能性があります。ここで、Capsolver が役立ちます。Capsolver は、CAPTCHA をプログラム的に解決するための API ベースのソリューションを提供し、スクレイピングスクリプトがこれらの課題を回避し、目的のコンテンツにシームレスにアクセスできるようにします。

この包括的なガイドでは、次の手順について説明します。

RestSharp を使用した Web スクレイピング

C# では、RestSharp は HTTP リクエストを処理し、RESTful API とやり取りするための一般的なライブラリです。組み込みの HttpClient と比較して、HTTP 通信の多くの側面を簡素化します。RestSharp を HtmlAgilityPack などの HTML パーサーと組み合わせると、Web ページからデータを抽出できます。

前提条件

  • NuGet パッケージマネージャーを使用して RestSharp ライブラリをインストールします。

    bash Copy
    Install-Package RestSharp
  • HTML コンテンツを解析するために HtmlAgilityPack ライブラリをインストールします。

    bash Copy
    Install-Package HtmlAgilityPack
  • JSON レスポンスを処理するために Newtonsoft.Json をインストールします。

    bash Copy
    Install-Package Newtonsoft.Json

例: 「Quotes to Scrape」のスクレイピング

RestSharpHtmlAgilityPack を使用して、Quotes to Scrape Web サイトから引用をスクレイピングしてみましょう。

csharp Copy
using System;
using System.Threading.Tasks;
using HtmlAgilityPack;
using RestSharp;

class Program
{
    static async Task Main(string[] args)
    {
        string url = "http://quotes.toscrape.com/";

        // RestSharp クライアントを初期化
        var client = new RestClient(url);

        // GET リクエストを作成
        var request = new RestRequest(Method.GET);

        // リクエストを実行
        var response = await client.ExecuteAsync(request);

        if (response.IsSuccessful)
        {
            // HtmlAgilityPack を使用してページコンテンツを解析
            HtmlDocument htmlDoc = new HtmlDocument();
            htmlDoc.LoadHtml(response.Content);

            // ページ上のすべての引用を見つける
            var quotes = htmlDoc.DocumentNode.SelectNodes("//span[@class='text']");

            // 各引用を出力
            foreach (var quote in quotes)
            {
                Console.WriteLine(quote.InnerText);
            }
        }
        else
        {
            Console.WriteLine($"ページを取得できませんでした。ステータスコード: {response.StatusCode}");
        }
    }
}

説明:

  • RestSharp クライアントとリクエスト: ターゲット URL を使用して RestClient を初期化し、GET メソッドの RestRequest を作成します。
  • リクエストの実行: リクエストを非同期的に送信し、レスポンスが成功したかどうかを確認します。
  • HtmlAgilityPack: レスポンスから HTML コンテンツを解析し、クラス text の要素を選択して引用を抽出します。

RestSharp を使用した Capsolver を使用した reCAPTCHA v2 & reCAPTCHA v3 の解決

Web サイトがセキュリティのために reCAPTCHA v2 または v3 を使用している場合は、Capsolver API を使用して CAPTCHA を解決できます。以下は、RestSharp に Capsolver を統合して reCAPTCHA の課題を解決する方法です。

前提条件

  • Newtonsoft.Json は、Capsolver レスポンスからの JSON 解析を処理するために使用されます。

    bash Copy
    Install-Package Newtonsoft.Json

例: Capsolver を使用した reCAPTCHA v2 の解決

このセクションでは、Capsolver APIRestSharp を使用して reCAPTCHA v2 の課題を解決する方法 を説明します。

csharp Copy
using System;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RestSharp;

class Program
{
    private static readonly string apiUrl = "https://api.capsolver.com";
    private static readonly string clientKey = "YOUR_API_KEY"; // Capsolver API キーに置き換えてください

    static async Task Main(string[] args)
    {
        try
        {
            // ステップ 1: reCAPTCHA v2 を解決するためのタスクを作成する
            string taskId = await CreateTask();
            Console.WriteLine("タスク ID: " + taskId);

            // ステップ 2: タスクの結果を取得する
            string taskResult = await GetTaskResult(taskId);
            Console.WriteLine("タスクの結果 (CAPTCHA トークン): " + taskResult);
        }
        catch (Exception ex)
        {
            Console.WriteLine("エラー: " + ex.Message);
        }
    }

    // 新しい CAPTCHA 解決タスクを作成するためのメソッド
    private static async Task<string> CreateTask()
    {
        // RestSharp クライアントを初期化
        var client = new RestClient(apiUrl);

        // リクエストペイロード
        var requestBody = new
        {
            clientKey = clientKey,
            task = new
            {
                type = "ReCaptchaV2TaskProxyLess", // プロキシなしの reCAPTCHA v2 のタスクタイプ
                websiteURL = "https://www.example.com", // CAPTCHA を解決する Web サイトの URL
                websiteKey = "SITE_KEY_HERE" // reCAPTCHA サイトキー
            }
        };

        // POST リクエストを作成
        var request = new RestRequest("createTask", Method.POST);
        request.AddJsonBody(requestBody);

        // リクエストを実行
        var response = await client.ExecuteAsync(request);

        if (!response.IsSuccessful)
        {
            throw new Exception("タスクの作成に失敗しました: " + response.Content);
        }

        JObject jsonResponse = JObject.Parse(response.Content);
        if (jsonResponse["errorId"].ToString() != "0")
        {
            throw new Exception("タスクの作成中にエラーが発生しました: " + jsonResponse["errorDescription"]);
        }

        // 次のステップで使用されるタスク ID を返す
        return jsonResponse["taskId"].ToString();
    }

    // CAPTCHA 解決タスクの結果を取得するためのメソッド
    private static async Task<string> GetTaskResult(string taskId)
    {
        // RestSharp クライアントを初期化
        var client = new RestClient(apiUrl);

        // リクエストペイロード
        var requestBody = new
        {
            clientKey = clientKey,
            taskId = taskId
        };

        // POST リクエストを作成
        var request = new RestRequest("getTaskResult", Method.POST);
        request.AddJsonBody(requestBody);

        // 5 秒ごとにタスクの結果をポーリングする
        while (true)
        {
            var response = await client.ExecuteAsync(request);

            if (!response.IsSuccessful)
            {
                throw new Exception("タスクの結果を取得できませんでした: " + response.Content);
            }

            JObject jsonResponse = JObject.Parse(response.Content);
            if (jsonResponse["errorId"].ToString() != "0")
            {
                throw new Exception("タスクの結果を取得中にエラーが発生しました: " + jsonResponse["errorDescription"]);
            }

            // タスクが準備完了したら、CAPTCHA トークンを返す
            if (jsonResponse["status"].ToString() == "ready")
            {
                return jsonResponse["solution"]["gRecaptchaResponse"].ToString();
            }

            // 5 秒待ってからもう一度確認します
            Console.WriteLine("タスクはまだ処理中です。5 秒待っています...");
            await Task.Delay(5000);
        }
    }
}

説明:

  1. CreateTask メソッド:

    • RestSharp クライアントとリクエスト: RestClient を初期化し、POST メソッドで createTask エンドポイントの RestRequest を作成します。
    • リクエストペイロード: clientKeywebsiteURLwebsiteKey などの必要なパラメーターを設定し、タスクタイプを ReCaptchaV2TaskProxyLess に指定します。
    • 実行: リクエストを送信し、レスポンスを解析して taskId を取得します。
  2. GetTaskResult メソッド:

    • RestSharp クライアントとリクエスト: RestClient を初期化し、POST メソッドで getTaskResult エンドポイントの RestRequest を作成します。
    • ポーリング: タスクが完了するまで (status: ready)、5 秒ごとにタスクのステータスをポーリングします。
    • 結果の取得: タスクが準備完了したら、gRecaptchaResponse を抽出し、CAPTCHA を回避するために使用できます。

例: Capsolver を使用した reCAPTCHA v3 の解決

このセクションでは、Capsolver APIRestSharp を使用して reCAPTCHA v3 の課題を解決する方法 を説明します。

csharp Copy
using System;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RestSharp;

class Program
{
    private static readonly string apiUrl = "https://api.capsolver.com";
    private static readonly string clientKey = "YOUR_API_KEY"; // Capsolver API キーに置き換えてください

    static async Task Main(string[] args)
    {
        try
        {
            // ステップ 1: reCAPTCHA v3 を解決するためのタスクを作成する
            string taskId = await CreateTask();
            Console.WriteLine("タスク ID: " + taskId);

            // ステップ 2: タスクの結果を取得する
            string taskResult = await GetTaskResult(taskId);
            Console.WriteLine("タスクの結果 (CAPTCHA トークン): " + taskResult);
        }
        catch (Exception ex)
        {
            Console.WriteLine("エラー: " + ex.Message);
        }
    }

    // 新しい CAPTCHA 解決タスクを作成するためのメソッド
    private static async Task<string> CreateTask()
    {
        // RestSharp クライアントを初期化
        var client = new RestClient(apiUrl);

        // リクエストペイロード
        var requestBody = new
        {
            clientKey = clientKey,
            task = new
            {
                type = "ReCaptchaV3TaskProxyLess", // プロキシなしの reCAPTCHA v3 のタスクタイプ
                websiteURL = "https://www.example.com", // CAPTCHA を解決する Web サイトの URL
                websiteKey = "SITE_KEY_HERE", // reCAPTCHA サイトキー
                minScore = 0.3, // 必要な最小スコア
                pageAction = "your_action" // サイトで定義されたアクション名
            }
        };

        // POST リクエストを作成
        var request = new RestRequest("createTask", Method.POST);
        request.AddJsonBody(requestBody);

        // リクエストを実行
        var response = await client.ExecuteAsync(request);

        if (!response.IsSuccessful)
        {
            throw new Exception("タスクの作成に失敗しました: " + response.Content);
        }

        JObject jsonResponse = JObject.Parse(response.Content);
        if (jsonResponse["errorId"].ToString() != "0")
        {
            throw new Exception("タスクの作成中にエラーが発生しました: " + jsonResponse["errorDescription"]);
        }

        // 次のステップで使用されるタスク ID を返す
        return jsonResponse["taskId"].ToString();
    }

    // CAPTCHA 解決タスクの結果を取得するためのメソッド
    private static async Task<string> GetTaskResult(string taskId)
    {
        // RestSharp クライアントを初期化
        var client = new RestClient(apiUrl);

        // リクエストペイロード
        var requestBody = new
        {
            clientKey = clientKey,
            taskId = taskId
        };

        // POST リクエストを作成
        var request = new RestRequest("getTaskResult", Method.POST);
        request.AddJsonBody(requestBody);

        // 5 秒ごとにタスクの結果をポーリングする
        while (true)
        {
            var response = await client.ExecuteAsync(request);

            if (!response.IsSuccessful)
            {
                throw new Exception("タスクの結果を取得できませんでした: " + response.Content);
            }

            JObject jsonResponse = JObject.Parse(response.Content);
            if (jsonResponse["errorId"].ToString() != "0")
            {
                throw new Exception("タスクの結果を取得中にエラーが発生しました: " + jsonResponse["errorDescription"]);
            }

            // タスクが準備完了したら、CAPTCHA トークンを返す
            if (jsonResponse["status"].ToString() == "ready")
            {
                return jsonResponse["solution"]["gRecaptchaResponse"].ToString();
            }

            // 5 秒待ってからもう一度確認します
            Console.WriteLine("タスクはまだ処理中です。5 秒待っています...");
            await Task.Delay(5000);
        }
    }
}

説明:

  1. CreateTask メソッド:

    • RestSharp クライアントとリクエスト: RestClientRestRequestcreateTask エンドポイント用に設定します。
    • リクエストペイロード: minScorepageAction などの reCAPTCHA v3 に固有の追加パラメーターを含めます。
    • 実行: リクエストを送信し、taskId を取得します。
  2. GetTaskResult メソッド:

    • v2 の例と同様に、Capsolver API をポーリングしてタスクの結果を取得し、タスクが準備完了したら CAPTCHA トークンを取得します。

C# の Web スクレイピングのベストプラクティス

C# で Web スクレイピングツールを使用する場合は、常に次のベストプラクティスに従ってください。

  • robots.txt を尊重する: Web サイトが robots.txt ファイルで Web スクレイピングを許可していることを確認してください。
  • レート制限: Web サイトにブロックされないように、短時間で多数のリクエストを送信しないようにしてください。
  • プロキシのローテーション: ボットとしてフラグ付けされないように、プロキシを使用してリクエストを複数の IP に分散させてください。
  • ヘッダーの偽装: User-Agent などのカスタムヘッダーを HTTP リクエストに追加して、ブラウザのようなリクエストをシミュレートしてください。

まとめ

RestSharp を使用した Web スクレイピングと Capsolver を使用した CAPTCHA の解決により、CAPTCHA の課題を実装した Web サイトとの対話を効果的に自動化できます。Web スクレイピングアクティビティが、ターゲット Web サイトの利用規約および法的要件に準拠していることを常に確認してください。

スクレイピングを楽しんでください!


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

もっと見る