C#によるWebスクレイピング:2025年ステップバイステップチュートリアル

Emma Foster
Machine Learning Engineer
23-Jan-2025

ウェブサイトのスクレイピング、CAPTCHAの処理、さらにはスクリーンショットの取得方法を分かりやすくご紹介します!
なぜC#でウェブスクレイピングなのか?

C#はWindowsアプリやゲームの構築だけでなく、ウェブスクレイピングにも非常に強力です!HtmlAgilityPack、Selenium、Puppeteer Sharpなどのライブラリを使用することで、データの抽出、操作の自動化、さらにはCAPTCHAの解決(本当に!)を行うことができます。このチュートリアルでは、https://www.scrapethissite.com/pages/を練習場として使用します。始めましょう!
ステップ1:プロジェクトの設定

まず、新しいC#コンソールアプリを作成します。次に、以下のNuGetパッケージをインストールします。
bash
Install-Package HtmlAgilityPack # HTMLパース用
Install-Package Selenium.WebDriver # ブラウザ自動化用
Install-Package PuppeteerSharp # スクリーンショットと高度なスクレイピング用
Install-Package Capsolver.SDK # CAPTCHA解決用
例1:基本的なページスクレイピング
https://www.scrapethissite.com/pages/simple/から国データを取得してみましょう。
csharp
using HtmlAgilityPack;
using System.Net;
var url = "https://www.scrapethissite.com/pages/simple/";
var client = new WebClient();
client.Headers.Add("User-Agent", "Mozilla/5.0"); // マナーを守りましょう!
var html = client.DownloadString(url);
var doc = new HtmlDocument();
doc.LoadHtml(html);
var countries = doc.DocumentNode.SelectNodes("//div[@class='country']");
foreach (var country in countries)
{
var name = country.SelectSingleNode(".//h3").InnerText.Trim();
var capital = country.SelectSingleNode(".//span[@class='country-capital']").InnerText.Trim();
Console.WriteLine($"国:{name}、首都:{capital}");
}
すべての国とその首都が出力されます。簡単ですね!
例2:SeleniumによるJavaScriptの処理
一部のページでは実際のブラウザが必要です。AJAXのサンプルページをSeleniumを使用してスクレイピングしてみましょう。
csharp
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
var options = new ChromeOptions();
options.AddArgument("--headless"); // バックグラウンドで実行
using var driver = new ChromeDriver(options);
driver.Navigate().GoToUrl("https://www.scrapethissite.com/pages/ajax-javascript/");
var dynamicContent = driver.FindElement(By.CssSelector(".ajax-content")).Text;
Console.WriteLine($"AJAXコンテンツ:{dynamicContent}");
例3:CapsolverによるCAPTCHAの解決
CAPTCHAに阻まれていますか?Capsolverを使用してReCaptchaV2を回避しましょう。方法は次のとおりです。
- Capsolverにサインアップし、APIキーを取得します。
- APIを使用してCAPTCHAを解決します。
csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Text;
using System.Text.Json;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System.Threading;
namespace CapSolverSeleniumExample
{
class Program
{
static async Task Main(string[] args)
{
string token = await GetCaptchaToken();
using var driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://www.example.com");
Thread.Sleep(5000);
driver.ExecuteScript("document.getElementById('g-recaptcha-response').innerHTML = arguments[0];", token);
var submitButton = driver.FindElement(By.Id("submit-button"));
submitButton.Click();
Thread.Sleep(5000);
driver.Quit();
}
static async Task<string> GetCaptchaToken()
{
string apiKey = "YOUR_API_KEY";
string siteKey = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_kl-";
string siteUrl = "https://www.example.com";
using var client = new HttpClient();
var payload = new
{
clientKey = apiKey,
task = new
{
type = "ReCaptchaV3TaskProxyLess",
websiteKey = siteKey,
websiteURL = siteUrl,
pageAction = "login"
}
};
var requestContent = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
var createTaskResponse = await client.PostAsync("https://api.capsolver.com/createTask", requestContent);
var createTaskResponseString = await createTaskResponse.Content.ReadAsStringAsync();
using var createTaskJsonDoc = JsonDocument.Parse(createTaskResponseString);
var root = createTaskJsonDoc.RootElement;
if (!root.TryGetProperty("taskId", out var taskIdElement))
{
Console.WriteLine("タスクの作成に失敗しました: " + createTaskResponseString);
return null;
}
int taskId = taskIdElement.GetInt32();
while (true)
{
await Task.Delay(1000);
var resultPayload = new { clientKey = apiKey, taskId = taskId };
var resultContent = new StringContent(JsonSerializer.Serialize(resultPayload), Encoding.UTF8, "application/json");
var getTaskResponse = await client.PostAsync("https://api.capsolver.com/getTaskResult", resultContent);
var getTaskResponseString = await getTaskResponse.Content.ReadAsStringAsync();
using var getTaskJsonDoc = JsonDocument.Parse(getTaskResponseString);
var resultRoot = getTaskJsonDoc.RootElement;
if (resultRoot.TryGetProperty("status", out var statusElement))
{
string status = statusElement.GetString();
if (status == "ready")
{
if (resultRoot.TryGetProperty("solution", out var solutionElement) && solutionElement.TryGetProperty("gRecaptchaResponse", out var tokenElement))
{
return tokenElement.GetString();
}
return null;
}
if (status == "failed" || resultRoot.TryGetProperty("errorId", out _))
{
Console.WriteLine("解決に失敗しました!レスポンス: " + getTaskResponseString);
return null;
}
}
}
}
}
}
Seleniumとシームレスに連携して、CAPTCHAが多いフォームを自動化します!
例4:Puppeteer Sharpによるスクリーンショットの取得
スクレイピングの視覚的な証拠が必要ですか?スクリーンショットをキャプチャしましょう。
csharp
using PuppeteerSharp;
await new BrowserFetcher().DownloadAsync();
using var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
using var page = await browser.NewPageAsync();
await page.GoToAsync("https://www.scrapethissite.com/pages/javascript/");
await page.ScreenshotAsync("screenshot.png");
ページのデバッグやアーカイブに最適です。
2025年のウェブスクレイピングに関するプロのヒント
- robots.txtを尊重する: まずhttps://www.scrapethissite.com/robots.txtを確認しましょう。
- レート制限: サーバーに過大な負荷をかけないように、
Thread.Sleep(2000)
で遅延を追加します。 - User-Agentのローテーション: 検出を回避するために、実際のブラウザを模倣します。
- エラー処理: ネットワークの問題に備えて、コードを
try-catch
ブロックで囲みます。
コンプライアンス免責事項: このブログで提供される情報は、情報提供のみを目的としています。CapSolverは、すべての適用される法律および規制の遵守に努めています。CapSolverネットワークの不法、詐欺、または悪用の目的での使用は厳格に禁止され、調査されます。私たちのキャプチャ解決ソリューションは、公共データのクローリング中にキャプチャの問題を解決する際に100%のコンプライアンスを確保しながら、ユーザーエクスペリエンスを向上させます。私たちは、サービスの責任ある使用を奨励します。詳細については、サービス利用規約およびプライバシーポリシーをご覧ください。
もっと見る

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

Sora Fujimoto
07-Mar-2025

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

Sora Fujimoto
05-Mar-2025

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

Sora Fujimoto
28-Feb-2025

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

Sora Fujimoto
25-Feb-2025

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

Sora Fujimoto
20-Feb-2025

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

Sora Fujimoto
20-Feb-2025