
Anh Tuan
Data Science Expert

Web スクレイピングは、Web サイトからデータを抽出するための不可欠な技術ですが、最新の Web アプリケーションは、自動アクセスを防ぐために CAPTCHA などのセキュリティ対策を頻繁に実装しています。Google reCAPTCHA などの CAPTCHA は、人間ユーザーとボットを区別するために設計されており、自動スクリプトがコンテンツを効果的にスクレイピングすることを困難にしています。
これらの障害を克服するために、開発者は HTTP リクエストを簡素化し、CAPTCHA の解決を処理するツールやサービスを利用できます。RestSharp は、RESTful API への HTTP リクエストを行うプロセスを簡素化する強力で使いやすい C# ライブラリです。HtmlAgilityPack などの HTML パーサーと組み合わせると、Web スクレイピングタスクのための堅牢なソリューションになります。

ただし、スクレイピング中に CAPTCHA の課題が発生すると、自動化プロセスが停止する可能性があります。ここで、Capsolver が役立ちます。Capsolver は、CAPTCHA をプログラム的に解決するための API ベースのソリューションを提供し、スクレイピングスクリプトがこれらの課題を回避し、目的のコンテンツにシームレスにアクセスできるようにします。
この包括的なガイドでは、次の手順について説明します。
C# では、RestSharp は HTTP リクエストを処理し、RESTful API とやり取りするための一般的なライブラリです。組み込みの HttpClient と比較して、HTTP 通信の多くの側面を簡素化します。RestSharp を HtmlAgilityPack などの HTML パーサーと組み合わせると、Web ページからデータを抽出できます。
NuGet パッケージマネージャーを使用して RestSharp ライブラリをインストールします。
Install-Package RestSharp
HTML コンテンツを解析するために HtmlAgilityPack ライブラリをインストールします。
Install-Package HtmlAgilityPack
JSON レスポンスを処理するために Newtonsoft.Json をインストールします。
Install-Package Newtonsoft.Json
RestSharp と HtmlAgilityPack を使用して、Quotes to Scrape Web サイトから引用をスクレイピングしてみましょう。
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}");
}
}
}
RestClient を初期化し、GET メソッドの RestRequest を作成します。text の要素を選択して引用を抽出します。Web サイトがセキュリティのために reCAPTCHA v2 または v3 を使用している場合は、Capsolver API を使用して CAPTCHA を解決できます。以下は、RestSharp に Capsolver を統合して reCAPTCHA の課題を解決する方法です。
Newtonsoft.Json は、Capsolver レスポンスからの JSON 解析を処理するために使用されます。
Install-Package Newtonsoft.Json
このセクションでは、Capsolver API と RestSharp を使用して reCAPTCHA v2 の課題を解決する方法 を説明します。
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 メソッド:
RestClient を初期化し、POST メソッドで createTask エンドポイントの RestRequest を作成します。clientKey、websiteURL、websiteKey などの必要なパラメーターを設定し、タスクタイプを ReCaptchaV2TaskProxyLess に指定します。taskId を取得します。GetTaskResult メソッド:
RestClient を初期化し、POST メソッドで getTaskResult エンドポイントの RestRequest を作成します。status: ready)、5 秒ごとにタスクのステータスをポーリングします。gRecaptchaResponse を抽出し、CAPTCHA を回避するために使用できます。このセクションでは、Capsolver API と RestSharp を使用して reCAPTCHA v3 の課題を解決する方法 を説明します。
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 メソッド:
RestClient と RestRequest を createTask エンドポイント用に設定します。minScore や pageAction などの reCAPTCHA v3 に固有の追加パラメーターを含めます。taskId を取得します。GetTaskResult メソッド:
C# で Web スクレイピングツールを使用する場合は、常に次のベストプラクティスに従ってください。
robots.txt を尊重する: Web サイトが robots.txt ファイルで Web スクレイピングを許可していることを確認してください。User-Agent などのカスタムヘッダーを HTTP リクエストに追加して、ブラウザのようなリクエストをシミュレートしてください。RestSharp を使用した Web スクレイピングと Capsolver を使用した CAPTCHA の解決により、CAPTCHA の課題を実装した Web サイトとの対話を効果的に自動化できます。Web スクレイピングアクティビティが、ターゲット Web サイトの利用規約および法的要件に準拠していることを常に確認してください。
スクレイピングを楽しんでください!
