HtmlAgilityPack和大HTML文档(HtmlAgilityPack and large

2019-09-23 20:07发布

我建立了一个小爬虫,现在尝试当我发现爬行某些网站时,我的抓取工具使用98-99%的CPU。

我用dotTrace来看看这个问题可能是什么,它指出了我对我的httpwebrequest方法-我的优化它有点与这里计算器以前的一些问题的帮助..但问题仍然存在。

然后我去看了一下网址是:使CPU的负载,发现它实际上是在规模非常大的网站 - 去图:)所以,现在我99%肯定它与下面的一段代码,这样做:

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

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

所有我想要做的是提取页面上的链接,所以对于大型网站..反正是有,我可以得到这个没有用这么多的CPU?

我想也许限制我取? 什么是我最好的选择吗?

当然,一定有人以前碰到这个问题:)

Answer 1:

“.//a[@href]” 是极其缓慢的XPath。 试图与替换“//一个[@href]”或简单地行走整个文件,并且检查所有A节点的代码。

为什么这个XPath是缓慢的:

  1. “” 开始节点
  2. “//”选择所有后代节点
  3. “一” - 只挑选“一个”节点
  4. “@href” 与HREF。

部1 + 2结束了“为每个节点选择它的所有后代节点”,这是非常慢的。



Answer 2:

您是否尝试过丢弃XPath和使用LINQ的功能?

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

这将会把所有锚标签的href属性列表作为一个List <String>的。



Answer 3:

如果你不投入巨资的HTML敏捷性包,请尝试使用CsQuery代替。 解析文档时,它建立索引,并选择比HTML敏捷性包快得多。 见的比较。

CsQuery是一个.NET的jQuery端口一个完整的CSS选择器引擎; 它可以让你使用CSS选择器,以及jQuery的API访问和操作HTML。 这是对的NuGet为CsQuery。



文章来源: HtmlAgilityPack and large HTML Documents