using var handler = new HttpClientHandler
{
    UseProxy = true,
    Proxy = new WebProxy("http://proxy.example:8080")
};
using var client = new HttpClient(handler);

string html = await client.GetStringAsync(
    "https://www.example.com/catalog");
var document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(html);

この現代的な .NET の断片は System.Net と System.Net.Http を使用します。構成済みのクライアントがネットワーク ルーティングを担い、Html Agility Pack は返された HTML 文字列を受け取ります。ページごとにプールを作り直すのではなく、継続的な処理には適切に構成したクライアントを保持してください。

この公開ページの例では、HTTP プロキシ リスト から認証不要の候補が中間者を置き換えられます。宛先は別途置き換えてください。Web サイトの URL は TLS の同一性を保ちます。認証付きプロキシの資格情報は WebProxy に属します。Web サイトの資格情報も検証の無効化もその代わりにはなりません。

GetStringAsync は成功以外の HTTP ステータスをエラーとして扱います。失敗したダウンロードを空の HtmlDocument に変換しないでください。ヘッダー、ステータスの詳細、エラー本文が必要な場合は、応答指向の HTTP 操作を使い、解析前に確認してください。

文字列メソッドは生バイトに対する無条件の追加 UTF-8 変換を避けます。意図的にバイトを取得する場合は、応答とドキュメントのエンコード要件をデコードに引き継いでください。

LoadHtml は解析済みのドキュメントを生成します。スクリプトを実行せず、スタイルを読み込まず、リンクをたどりません。後続の相対リンクは応答の位置を基準に解決し、ブラウザーが描画する要素がダウンロードしたソースに存在しない場合があることを忘れないでください。要求が同じ構成済み HTTP クライアントを共有していても、各応答は独自のドキュメントを生成すべきです。

関連記事