複数ページ横断クローリング

HtmlAgilityPack(HAP)における「複数ページ横断クローリング」は、ページネーションやリンクをたどって複数のWebページを連続して解析・データ抽出する処理を指します。商品一覧、ブログ記事、ニュース記事などでよく見られる「次へ」「ページ2、3、4…」といったリンク構造に対応するために使われます。


主な目的

  • 複数ページに分割された情報を1つのデータセットとして統合

  • サイト全体の情報を網羅的に収集(例:全商品、全記事)

  • 各ページの共通構造(リスト要素など)を反復的に処理


典型的な実装ステップ

1. 初期URLからHTMLを取得

csharp
var url = "https://example.com/page=1"; var web = new HtmlWeb(); var doc = web.Load(url);

2. ページ内の必要なデータを抽出

csharp
var nodes = doc.DocumentNode.SelectNodes("//div[@class='item']"); foreach (var node in nodes) { var title = node.SelectSingleNode(".//h2")?.InnerText.Trim(); var link = node.SelectSingleNode(".//a")?.GetAttributeValue("href", ""); // 必要なデータを保存・表示 }

3. 「次のページ」リンクを探す

csharp
var nextLink = doc.DocumentNode.SelectSingleNode("//a[text()='次へ']"); if (nextLink != null) { var nextUrl = nextLink.GetAttributeValue("href", ""); // 次ページのURLが相対パスの場合の補完処理も必要 }

4. 再帰またはループで次ページに遷移

csharp
while (!string.IsNullOrEmpty(currentUrl)) { var doc = web.Load(currentUrl); // データ抽出処理(略) var nextNode = doc.DocumentNode.SelectSingleNode("//a[text()='次へ']"); currentUrl = nextNode != null ? nextNode.GetAttributeValue("href", "") : null; }

注意点

  • URLの正規化:相対パスを絶対パスに変換する処理が必要です。

  • 遅延処理:Webサイトに負荷をかけすぎないよう、ページ間にThread.Sleep()などで待機時間を設けるのが望ましいです。

  • エラーハンドリング:404や403などのHTTPエラー、パースエラーに対する対策が必要です。

  • 無限ループ防止:次ページのリンクが循環している場合に備えて、訪問済みURLを記録するか、最大ページ数を制限します。


活用例

  • ECサイトの商品全件取得(カテゴリ内全ページ走査)

  • ブログ記事の全文収集(アーカイブ一覧の横断)

  • 掲示板スレッドやフォーラムの全ページ収集


このように、HtmlAgilityPackを用いた複数ページ横断クローリングは、Webサイトから大量かつ整然とした情報を抽出する際に非常に有効です。特にXPathによる柔軟なノード指定と組み合わせることで、堅牢なクローラーを構築できます。

ChatGPT4o 生成日:2025/06/23