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

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 スクレイピングタスクのための堅牢なソリューションになります。

ただし、スクレイピング中に CAPTCHA の課題が発生すると、自動化プロセスが停止する可能性があります。ここで、Capsolver が役立ちます。Capsolver は、CAPTCHA をプログラム的に解決するための API ベースのソリューションを提供し、スクレイピングスクリプトがこれらの課題を回避し、目的のコンテンツにシームレスにアクセスできるようにします。
この包括的なガイドでは、次の手順について説明します。
- RestSharp と HtmlAgilityPack を使用して Web サイトをスクレイピングする。
- Capsolver API を使用して reCAPTCHA の課題を解決する。
RestSharp を使用した Web スクレイピング
C# では、RestSharp は HTTP リクエストを処理し、RESTful API とやり取りするための一般的なライブラリです。組み込みの HttpClient と比較して、HTTP 通信の多くの側面を簡素化します。RestSharp を HtmlAgilityPack などの HTML パーサーと組み合わせると、Web ページからデータを抽出できます。
前提条件
-
NuGet パッケージマネージャーを使用して RestSharp ライブラリをインストールします。
bashInstall-Package RestSharp -
HTML コンテンツを解析するために HtmlAgilityPack ライブラリをインストールします。
bashInstall-Package HtmlAgilityPack -
JSON レスポンスを処理するために Newtonsoft.Json をインストールします。
bashInstall-Package Newtonsoft.Json
例: 「Quotes to Scrape」のスクレイピング
RestSharp と HtmlAgilityPack を使用して、Quotes to Scrape Web サイトから引用をスクレイピングしてみましょう。
csharp
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 解析を処理するために使用されます。
bashInstall-Package Newtonsoft.Json
例: Capsolver を使用した reCAPTCHA v2 の解決
このセクションでは、Capsolver API と RestSharp を使用して reCAPTCHA v2 の課題を解決する方法 を説明します。
csharp
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);
}
}
}
説明:
-
CreateTask メソッド:
- RestSharp クライアントとリクエスト:
RestClientを初期化し、POST メソッドでcreateTaskエンドポイントのRestRequestを作成します。 - リクエストペイロード:
clientKey、websiteURL、websiteKeyなどの必要なパラメーターを設定し、タスクタイプをReCaptchaV2TaskProxyLessに指定します。 - 実行: リクエストを送信し、レスポンスを解析して
taskIdを取得します。
- RestSharp クライアントとリクエスト:
-
GetTaskResult メソッド:
- RestSharp クライアントとリクエスト:
RestClientを初期化し、POST メソッドでgetTaskResultエンドポイントのRestRequestを作成します。 - ポーリング: タスクが完了するまで (
status: ready)、5 秒ごとにタスクのステータスをポーリングします。 - 結果の取得: タスクが準備完了したら、
gRecaptchaResponseを抽出し、CAPTCHA を回避するために使用できます。
- RestSharp クライアントとリクエスト:
例: Capsolver を使用した reCAPTCHA v3 の解決
このセクションでは、Capsolver API と RestSharp を使用して reCAPTCHA v3 の課題を解決する方法 を説明します。
csharp
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);
}
}
}
説明:
-
CreateTask メソッド:
- RestSharp クライアントとリクエスト:
RestClientとRestRequestをcreateTaskエンドポイント用に設定します。 - リクエストペイロード:
minScoreやpageActionなどの reCAPTCHA v3 に固有の追加パラメーターを含めます。 - 実行: リクエストを送信し、
taskIdを取得します。
- RestSharp クライアントとリクエスト:
-
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%のコンプライアンスを確保しながら、ユーザーエクスペリエンスを向上させます。私たちは、サービスの責任ある使用を奨励します。詳細については、サービス利用規約およびプライバシーポリシーをご覧ください。
もっと見る

CAPTCHA 2026を解くために最適な拡張機能はどれですか?
オンラインセキュリティの進化し続ける世界において、CAPTCHAのチャレンジはインターネットユーザーにとって一般的な障壁となっています...

Nikolai Smirnov
12-Dec-2025

Sample Post
この記事では、Lumiproxyとは何か、および提供しているサービスについて紹介します。

Nikolai Smirnov
12-Dec-2025

Genlogin: 革新するウェブ自動化体験
この記事では、Genloginおよびその提供するサービスについてご紹介します。

Sora Fujimoto
12-Dec-2025

プロクシーズ.io : 個別のプロキシ あらゆるタスクに
本記事では、Proxys.ioとは何なのかと、彼らが提供するサービスについてご紹介します。

Nikolai Smirnov
12-Dec-2025

タブプロキシ: お得な海外住宅用プロキシ
この記事では、Tabproxyとは何か、および彼らが提供するサービスについてご紹介します。

Anh Tuan
12-Dec-2025

IP2World 住宅用プロキシ: リーディンググローバルIPプロキシソリューション
本記事では、IP2Worldとは何かおよび提供するサービスについてご紹介します。

Ethan Collins
12-Dec-2025

