2

我已经构建了一个小爬虫,现在尝试它时,我发现在爬取某些站点时,我的爬虫使用 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?

我在想也许会限制我获取的东西?我在这里最好的选择是什么?

当然之前一定有人遇到过这个问题:)

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 在 nuget 上。

于 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 回答