2

小さなクローラーを作成しましたが、試してみると、特定のサイトをクロールするときにクローラーが 98 ~ 99% の CPU を使用していることがわかりました。

私は以前dotTrace、問題が何であるかを確認していましたが、それは私の方法に向けて私を指し示していましたhttpwebrequest- ここでいくつかの以前の質問の助けを借りてそれを少し最適化しました。

次に、CPU 負荷の原因となっている URL を調べてみたところ、実際にはサイズが非常に大きいサイトであることがわかりました。

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

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

私がやりたいことは、ページ上のリンクを抽出することだけなので、大規模なサイトの場合.. とにかく、これを取得してCPUをあまり使用しないようにすることはできますか?

私がフェッチするものを制限するかもしれないと思っていましたか?ここで私の最良の選択肢は何ですか?

確かに、誰かが以前にこの問題に遭遇したに違いありません:)

4

3 に答える 3

1

XPath を削除して LINQ 機能を使用してみましたか?

var list = documentt.DocumentNode.Descendants("a").Select(n => n.GetAttributeValue("href", string.Empty);

これにより、すべてのアンカー タグの href 属性のリストが List<string> として取得されます。

于 2012-10-09T16:29:41.277 に答える
1

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

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

于 2012-10-09T16:38:49.780 に答える
0

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

この XPath が遅い理由:

  1. 「。」ノードから開始
  2. "//" すべての子孫ノードを選択
  3. "a" - "a" ノードのみを選択
  4. href付きの「@href」。

部分1 + 2は、「すべてのノードに対して、そのすべての子孫ノードを選択する」ことになり、非常に遅くなります。

于 2012-10-09T16:27:48.423 に答える