HtmlAgilityPackと大きなHTML文書

c# html-agility-pack httpwebrequest

質問

私は小さなクローラを構築しましたが、今試してみると、特定のサイトをクロールするときにクローラが98〜99%のCPUを使用することがわかりました。

私はdotTraceを使って、問題が何であるかを知り、私のhttpwebrequestメソッドに向かって私を指摘しました - 私はstackoverflow上のいくつかの以前の質問の助けを借りてそれを少し最適化しました..しかし問題はまだそこにありました。

私はその後、CPU負荷の原因となっていたURLを見て、それが実際にサイズが非常に大きいサイトであることを発見しました。つまり、私は99%確信しています。

HtmlAgilityPack.HtmlDocument documentt = new HtmlAgilityPack.HtmlDocument();
HtmlAgilityPack.HtmlNodeCollection list;
HtmlAgilityPack.HtmlNodeCollection frameList;

documentt.LoadHtml(_html);
list = documentt.DocumentNode.SelectNodes(".//a[@href]");

すべて私がしたいのは、ページ上のリンクを抽出することです、大きなサイトのために..とにかく私はこれをCPUをあまり使わないようにすることができますか?

私は多分私が取るものを制限すると思っていた?ここで私の最高のオプションは何ですか?

確かに誰かがこの問題に遭遇したはずです:)

受け入れられた回答

".//a[@href]"は非常に遅いXPathです。 "// a [@href]"で置き換えようとするか、ドキュメント全体を歩き回り、すべてのAノードをチェックするコードで置き換えようとしました。

なぜこのXPathが遅いのですか?

  1. ""ノードから始まる
  2. "//"すべての子ノードを選択する
  3. "a" - "a"ノードだけを選択する
  4. hrefで "@href"

部分1 + 2は、「すべてのノードに対してすべての子孫ノードを選択する」という非常に遅い。


人気のある回答

Html Agility Packに多額の投資をしていない場合は、代わりにCsQueryを使用してみてください 。ドキュメントの解析時にインデックスを作成し、セレクタはHTML Agility Packよりもはるかに高速です。 比較を参照してください

CsQueryは、完全なCSSセレクタエンジンを備えた.NET jQueryポートです。 CSSセレクタとjQuery APIを使用してHTMLにアクセスして操作することができます。それはCsQueryとしてナゲットにあります。




ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ