HttpClient (C# ライブラリ) を使用した Web スクレイピングの方法

Emma Foster
Machine Learning Engineer
13-Sep-2024

Google reCAPTCHA などの CAPTCHA チャレンジは、多くのウェブサイトでボットを阻止し、コンテンツへの自動アクセスを防止するために使用されています。このようなチャレンジをプログラムで回避するには、Capsolver などの API ベースのソリューションを提供するサービスを利用できます。
このガイドでは、次の方法について説明します。
- C# HttpClient と HtmlAgilityPack を使用してウェブサイトをスクレイピングする。
- Capsolver API を使用して reCAPTCHA チャレンジを解決する。
C# HttpClient を使った Web スクレイピング
C# では、HttpClient クラスは一般的に、ウェブサイトに HTTP リクエストを送信し、レスポンスを受信するために使用されます。HtmlAgilityPack などの HTML パーサーと組み合わせることで、ウェブページからデータを抽出できます。
事前準備
- NuGet パッケージ マネージャーを使用して HtmlAgilityPack ライブラリをインストールして HTML コンテンツを解析します。
bash
Install-Package HtmlAgilityPack
- JSON レスポンスを処理するために Newtonsoft.Json をインストールします。
bash
Install-Package Newtonsoft.Json
例:「Quotes to Scrape」のスクレイピング
HttpClient と HtmlAgilityPack を使用して、Quotes to Scrape ウェブサイトから引用をスクレイピングしてみましょう。
csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;
using HtmlAgilityPack;
class Program
{
private static readonly HttpClient client = new HttpClient();
static async Task Main(string[] args)
{
string url = "http://quotes.toscrape.com/";
// ページに GET リクエストを送信
HttpResponseMessage response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
// HtmlAgilityPack を使用してページコンテンツを解析
string pageContent = await response.Content.ReadAsStringAsync();
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(pageContent);
// ページ上のすべての引用を見つける
var quotes = htmlDoc.DocumentNode.SelectNodes("//span[@class='text']");
// 各引用を出力
foreach (var quote in quotes)
{
Console.WriteLine(quote.InnerText);
}
}
else
{
Console.WriteLine($"ページを取得できませんでした。ステータス コード: {response.StatusCode}");
}
}
}
説明:
- HttpClient: ウェブサイトに GET リクエストを送信します。
- HtmlAgilityPack: HTML コンテンツを解析し、
textクラスを持つ要素を選択することで引用を抽出します。
Capsolver を使った HttpClient で reCAPTCHA v3 と reCaptcha v2 を解決する
ウェブサイトでセキュリティのために reCAPTCHA v3 と reCaptcha v2 を使用している場合は、Capsolver API を使用して CAPTCHA を解決できます。以下は、Capsolver を HttpClient と統合して reCAPTCHA チャレンジを解決する方法です。
事前準備
- JSON 解析を Capsolver レスポンスから処理するために Newtonsoft.Json が使用されます。
bash
Install-Package Newtonsoft.Json
例: Capsolver を使った reCAPTCHA v2 の解決
このセクションでは、Capsolver API と HttpClient を使用して reCAPTCHA v2 チャレンジを解決する方法 を説明します。
csharp
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
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()
{
using (HttpClient client = new HttpClient())
{
// リクエスト ペイロード
var requestBody = new
{
clientKey = clientKey,
task = new
{
type = "ReCaptchaV2TaskProxyLess", // プロキシなしの reCAPTCHA v3 のタスク タイプ
websiteURL = "", // CAPTCHA を解決するウェブサイトの URL
websiteKey = "" // reCAPTCHA サイト キー
}
};
// タスクを作成するためのリクエストを送信
var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync($"{apiUrl}/createTask", content);
string responseContent = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new Exception("タスクの作成に失敗しました: " + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("タスクの作成中にエラーが発生しました: " + jsonResponse["errorDescription"]);
}
// 次のステップで使用されるタスク ID を返す
return jsonResponse["taskId"].ToString();
}
}
// CAPTCHA 解決タスクの結果を取得するためのメソッド
private static async Task<string> GetTaskResult(string taskId)
{
using (HttpClient client = new HttpClient())
{
// リクエスト ペイロード
var requestBody = new
{
clientKey = clientKey,
taskId = taskId
};
var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
// 5 秒ごとにタスクの結果をポーリング
while (true)
{
HttpResponseMessage response = await client.PostAsync($"{apiUrl}/getTaskResult", content);
string responseContent = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new Exception("タスク結果の取得に失敗しました: " + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("タスク結果の取得中にエラーが発生しました: " + jsonResponse["errorDescription"]);
}
// タスクが完了したら (ステータス: ready)、CAPTCHA トークンを返す
if (jsonResponse["status"].ToString() == "ready")
{
return jsonResponse["solution"]["gRecaptchaResponse"].ToString();
}
// 5 秒待機してから再度確認
Console.WriteLine("タスクはまだ処理中です。5 秒待機します...");
await Task.Delay(5000);
}
}
}
}
説明:
-
CreateTask メソッド:
- このメソッドは、reCAPTCHA v2 チャレンジを解決するための新しいタスクを作成するために、Capsolver の
/createTaskエンドポイントに POST リクエストを送信します。 - リクエストには、
clientKey、websiteURL、websiteKeyが含まれ、タスク タイプはReCaptchaV2TaskProxyLessに指定されています。 - このメソッドは、タスク結果を取得するために使用される
taskIdを返します。
- このメソッドは、reCAPTCHA v2 チャレンジを解決するための新しいタスクを作成するために、Capsolver の
-
GetTaskResult メソッド:
- このメソッドは、以前に作成したタスクの結果を確認するために、
/getTaskResultエンドポイントに POST リクエストを送信します。 - タスクが完了するまで (ステータス: ready)、5 秒ごとにタスクのステータスをポーリングし続けます。
- タスクが完了したら、
gRecaptchaResponseを返し、これを使用して CAPTCHA を回避できます。
- このメソッドは、以前に作成したタスクの結果を確認するために、
例: Capsolver を使った reCAPTCHA v3 の解決
このセクションでは、Capsolver API と HttpClient を使用して reCAPTCHA v3 チャレンジを解決する方法 を説明します。
csharp
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
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()
{
using (HttpClient client = new HttpClient())
{
// リクエスト ペイロード
var requestBody = new
{
clientKey = clientKey,
task = new
{
type = "ReCaptchaV3TaskProxyLess", // プロキシなしの reCAPTCHA v3 のタスク タイプ
websiteURL = "", // CAPTCHA を解決するウェブサイトの URL
websiteKey = "" // reCAPTCHA サイト キー
}
};
// タスクを作成するためのリクエストを送信
var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync($"{apiUrl}/createTask", content);
string responseContent = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new Exception("タスクの作成に失敗しました: " + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("タスクの作成中にエラーが発生しました: " + jsonResponse["errorDescription"]);
}
// 次のステップで使用されるタスク ID を返す
return jsonResponse["taskId"].ToString();
}
}
// CAPTCHA 解決タスクの結果を取得するためのメソッド
private static async Task<string> GetTaskResult(string taskId)
{
using (HttpClient client = new HttpClient())
{
// リクエスト ペイロード
var requestBody = new
{
clientKey = clientKey,
taskId = taskId
};
var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
// 5 秒ごとにタスクの結果をポーリング
while (true)
{
HttpResponseMessage response = await client.PostAsync($"{apiUrl}/getTaskResult", content);
string responseContent = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new Exception("タスク結果の取得に失敗しました: " + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("タスク結果の取得中にエラーが発生しました: " + jsonResponse["errorDescription"]);
}
// タスクが完了したら (ステータス: ready)、CAPTCHA トークンを返す
if (jsonResponse["status"].ToString() == "ready")
{
return jsonResponse["solution"]["gRecaptchaResponse"].ToString();
}
// 5 秒待機してから再度確認
Console.WriteLine("タスクはまだ処理中です。5 秒待機します...");
await Task.Delay(5000);
}
}
}
}
説明:
-
CreateTask メソッド:
- このメソッドは、reCAPTCHA v3 チャレンジを解決するための新しいタスクを作成するために、Capsolver の
/createTaskエンドポイントに POST リクエストを送信します。 - リクエストには、
clientKey、websiteURL、websiteKeyが含まれ、タスク タイプはReCaptchaV3TaskProxyLessに指定されています。 - このメソッドは、タスク結果を取得するために使用される
taskIdを返します。
- このメソッドは、reCAPTCHA v3 チャレンジを解決するための新しいタスクを作成するために、Capsolver の
-
GetTaskResult メソッド:
- このメソッドは、以前に作成したタスクの結果を確認するために、
/getTaskResultエンドポイントに POST リクエストを送信します。 - タスクが完了するまで (ステータス: ready)、5 秒ごとにタスクのステータスをポーリングし続けます。
- タスクが完了したら、
gRecaptchaResponseを返し、これを使用して CAPTCHA を回避できます。
- このメソッドは、以前に作成したタスクの結果を確認するために、
C# での Web スクレイピングのベストプラクティス
C# でウェブ スクレイピング ツールを使用する際は、常に以下のベストプラクティスに従ってください。
robots.txtを尊重: ウェブサイトがウェブ スクレイピングを許可しているかどうかは、robots.txtファイルを確認して確認してください。- レート制限: ウェブサイトにブロックされないように、短時間で多数のリクエストを送信しないようにしてください。
- プロキシのローテーション: プロキシを使用して、複数の IP アドレスにリクエストを分散させ、ボットとしてフラグ付けされないようにしてください。
- ヘッダーの偽装:
User-Agentなどのカスタムヘッダーを HTTP リクエストに追加して、ブラウザのようなリクエストをシミュレートしてください。
まとめ
HttpClient を使用してウェブ スクレイピングを行い、Capsolver を使用して CAPTCHA を解決することで、CAPTCHA チャレンジを使用しているウェブサイトとのやり取りを効果的に自動化できます。ウェブ スクレイピングを行う際は、常にターゲット ウェブサイトの利用規約および法的要件を遵守してください。
スクレイピングをお楽しみください!
このガイドでは、HtmlAgilityPack を使用したウェブ スクレイピングと、Capsolver を使用した reCAPTCHA チャレンジの処理方法を説明し、C# で HttpClient のみをを使用しています。
コンプライアンス免責事項: このブログで提供される情報は、情報提供のみを目的としています。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

