User-Agent/クッキー制御とリトライ処理

HtmlAgilityPack (HAP) を使用して Web スクレイピングを行う際には、HTTP 通信に HttpClient を組み合わせて活用することが一般的です。その際、User-Agent の偽装、クッキー制御、リトライ処理などを適切に実装することで、より安定かつ信頼性のあるスクレイピングが可能となります。以下、それぞれの要素について詳しく説明します。


1. User-Agent の制御

意義:

多くの Web サイトは、アクセス元のクライアントを識別するために User-Agent ヘッダーを参照しています。デフォルトの HttpClient ではカスタム User-Agent が設定されていないため、Bot やスクリプトとしてブロックされる可能性があります。

実装例:

csharp
var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); var response = await httpClient.GetAsync("https://example.com");

2. クッキーの制御

意義:

ログイン状態の維持やセッションの継続には、HTTP クッキーの送受信が必要です。HttpClientHandler を使用して CookieContainer を管理できます。

実装例:

csharp
var cookieContainer = new CookieContainer(); var handler = new HttpClientHandler { CookieContainer = cookieContainer }; var httpClient = new HttpClient(handler); // 事前にクッキーをセットする例 cookieContainer.Add(new Uri("https://example.com"), new Cookie("session", "abc123")); var response = await httpClient.GetAsync("https://example.com");

3. リトライ処理

意義:

一時的なネットワーク障害やサーバ側の応答遅延を考慮して、再試行処理を設けることでスクレイピングの信頼性が向上します。

実装例(ポリシーベースのリトライ):

Polly ライブラリと組み合わせることで、堅牢なリトライロジックを導入できます。

csharp
using Polly; var retryPolicy = Policy .Handle<HttpRequestException>() .OrResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode) .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); var httpClient = new HttpClient(); var response = await retryPolicy.ExecuteAsync(() => httpClient.GetAsync("https://example.com") );

4. HtmlAgilityPack との連携

取得した HTML を HtmlAgilityPack で解析する際の基本的な流れは以下の通りです。

csharp
var html = await response.Content.ReadAsStringAsync(); var doc = new HtmlDocument(); doc.LoadHtml(html); // 必要なノードを抽出 var nodes = doc.DocumentNode.SelectNodes("//div[@class='content']");

まとめ

項目 概要
User-Agent 制御 サイト側のブロックを回避するためにブラウザを偽装
クッキー制御 セッション維持・ログイン状態再現などに必要
リトライ処理 通信エラーや一時的な失敗を自動的に再試行
HAP 連携 HttpClient で取得した HTML を HtmlAgilityPack で解析

これらを統合的に扱うことで、より安定した Web スクレイピングシステムを構築できます。必要に応じて タイムアウト設定プロキシ利用 も併用すると良いでしょう。

ChatGPT4o 生成日:2025/06/23