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로 너겟에 있습니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.