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合法嗎? 是的,了解原因