본문 바로가기
C# 기술

[C#] 크롤링에 유용한 라이브러리 HtmlAgilityPack

by bryan.oh 2021. 10. 31.
반응형

HtmlAgilityPack

 

꽤 많이 사용되고 있는 라이브러리입니다.

html string 을 load 하여 그 문자열을 파싱하는 방법입니다.

이것만으로 크롤링 할 수 없는 사이트가 많습니다. 왜냐하면 데이터를 async 하게 로드하는 경우는 사용할 수 없습니다.
(스크롤 다운 -> 로딩 같은)

그래서 Selenium 과 HtmlAgilityPack 을 같이 사용하면 유용한 경우가 있습니다.

 

Selenium 으로 많은 element 를 loop 돌며 처리할 때, 느린경우가 있습니다. (N 쇼핑 같은...)

이렇게 느린 부분을 HtmlAgilityPack 을 사용해서 파싱하여 처리합니다.

 

1. 설치

NugetPackage 관리자로 들어갑니다.

검색으로 HtmlAgilityPack 을 찾아서 설치합니다.

(혹시 안나올 경우 우측상단에 패키지 소스: [모두] 를 확인해주세요.)

 

2. 사용

using HtmlAgilityPack;

  a. html string 이 있을 때,

String htmlString = ul.GetAttribute("outerHTML");  // selenium element 에서 html 가져옴

HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(htmlString);

  b. url 로 가져올 때

String url = "https://hello-bryan.tistory.com/";

HtmlWeb web = new HtmlWeb();
HtmlDocument htmlDoc = web.Load(url);

 

  c. node 사용 예제

    - 자주 사용하는 속성. 

  • SelectSingleNode : 하나의 node 만 조회
  • SelectNodes : 여러개의 node 조회
  • GetAttributeValue : 해당 element 의 속성 조회
// span tag 중에 class 가 headline 인것
var spanHead = htmlDoc.DocumentNode.SelectSingleNode("span[@class='headline']");

// 전체 html 에서 a tag 중 "some_class_name" class 를 포함하는 첫번째 element
var div = htmlDoc.DocumentNode.SelectSingleNode("//div[contains(@class, 'some_class_name')]");

// 그 div 안에 table > tr > td > h3 > a 를 가져옴
var a = div.SelectSingleNode("table/tr/td/h3/a");

// a 의 href 속성을 가져옴. 두번째 파라메터는 속성이 없을 경우 기본값
Console.WriteLine(a.GetAttributeValue("href", ""));
// a 안에 있는 텍스트 가져오기
Console.WriteLine(a.InnerText);

// 여러개의 노드 조회
var prdtImgs = htmlDoc.DocumentNode.SelectNodes("//img");
foreach(var prdtImg in prdtImgs){
    Console.WriteLine(prdtImg.GetAttributeValue("src", ""));
}

 

일단 여기까지...

나중에 더 많은 예제를 추가하는 걸로..

728x90
반응형

댓글