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的nuget。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因