HtmlAgilityPack e documenti HTML di grandi dimensioni

c# html-agility-pack httpwebrequest

Domanda

Ho creato un piccolo crawler e ora quando lo provo ho scoperto che durante la scansione di determinati siti il ​​mio crawler utilizza il 98-99% di CPU.

Ho usato dotTrace per vedere quale potrebbe essere il problema e mi ha indirizzato verso il mio metodo httpwebrequest - l'ho ottimizzato un po 'con l'aiuto di alcune domande precedenti qui su StackOverflow .. ma il problema era ancora lì.

Poi sono andato a vedere quali URL stavano causando il carico della CPU e ho scoperto che si trattava effettivamente di siti di dimensioni estremamente grandi - vai a capire :) Quindi, ora sono sicuro al 99% che ha a che fare con la seguente parte di codice:

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

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

Tutto quello che voglio fare è estrarre i link sulla pagina, quindi per i siti di grandi dimensioni .. c'è comunque posso ottenere questo per non usare così tanta CPU?

Stavo pensando che forse limiti quello che prendo? Quale sarebbe la mia migliore opzione qui?

Certamente qualcuno deve aver incontrato questo problema prima :)

Risposta accettata

".//a[@href]" è XPath estremamente lento. Ho provato a sostituire con "// a [@href]" o con un codice che cammina semplicemente tutto il documento e controlla tutti i nodi A.

Perché questo XPath è lento:

  1. "" iniziando con un nodo
  2. "//" seleziona tutti i nodi discendenti
  3. "a" - seleziona solo "un" nodo
  4. "@rif" con href.

La parte 1 + 2 finisce con "per ogni nodo seleziona tutti i suoi nodi discendenti" che è molto lento.


Risposta popolare

Se non si è investito molto in Html Agility Pack, provare a utilizzare CsQuery . Crea un indice durante l'analisi dei documenti e i selettori sono molto più veloci di HTML Agility Pack. Vedi un confronto.

CsQuery è una porta jQuery .NET con un motore di selezione CSS completo; ti consente di utilizzare selettori CSS e API jQuery per accedere e manipolare HTML. È su nuget come CsQuery.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché