dev/asp.net, c#

[c#] c# 크롤링 하기 (샘플: 네이버웹툰), HtmlAgilityPack 이용

코딩for 2022. 10. 26. 17:24
반응형

 

1. HtmlAgilityPack 패키지 프로젝트 추가

 

*사용법 및 문서 는 사이트 참조

 

Html Agility Pack

Html Agility Pack is FREE and always will be. However, last year alone, we spent over 3000 hours maintaining our free projects! We need resources to keep developing our open-source projects. We highly appreciate any contribution!

html-agility-pack.net

 

 

2.  크롤링 하려는 페이지 URL 호출

 

//샘플 웹툰 : 외모지상주의 
var html = "https://comic.naver.com/webtoon/detail?titleId=641253&no=1";
HtmlWeb web = new HtmlWeb();
var htmlDoc = web.Load(html);

네이버 웹툰의 회차별 페이지

각각의 웹툰 고유번호 titleId 와 회차별 번호 no 를 넣으면 해당 페이지의 html 을 읽어온다.

 

웹 브라우저를 통해 호출한 URL 의 html 문서 구조와 필요한 정보를 확인하면서 데이터를 가져온다.

HTML 구조에 해당하는 데이터를 추출하는 소스


var html = "https://comic.naver.com/webtoon/detail?titleId=" + titleId + "&no=" + no;
HtmlWeb web = new HtmlWeb();

var htmlDoc = web.Load(html);

var node = htmlDoc.DocumentNode.SelectSingleNode("//head/title");
var body = htmlDoc.DocumentNode.SelectSingleNode("//body/div");

var contentNode = body.SelectNodes("//div").Where(w => w.Id == "content").First();
var sectionContWide = body.SelectNodes("//div").Where(w => w.Id == "sectionContWide").First();

var doc = new HtmlDocument();
doc.LoadHtml(sectionContWide.InnerHtml);

// 썸네일 영역
var thumb = doc.DocumentNode.SelectNodes("//div/div").Where(w=> w.Attributes["class"].Value == "thumb").First();
var src = thumb.SelectSingleNode("//a/img").Attributes["src"].Value;

// 상서젱보 영역
var detail = doc.DocumentNode.SelectNodes("//div/div").Where(w => w.Attributes["class"].Value == "detail").First();
var title = detail.SelectNodes("//h2/span").Where(w => w.Attributes["class"].Value == "title").First().InnerText;
var artist = detail.SelectNodes("//h2/span").Where(w => w.Attributes["class"].Value == "wrt_nm").First().InnerText;
var txt = detail.SelectNodes("//p").Where(w => w.Attributes["class"].Value == "txt").First().InnerText;
var genre = detail.SelectNodes("//p/span").Where(w => w.Attributes["class"].Value == "genre").First().InnerText;
var age = detail.SelectNodes("//p/span").Where(w => w.Attributes["class"].Value == "age").First().InnerText;

// 회차정보
var listNo = doc.DocumentNode.SelectNodes("//div").Where(w => w.Attributes["class"].Value == "tit_area").First();
var noName = listNo.SelectSingleNode("//div/h3").InnerText;
var star = listNo.SelectNodes("//div/dl/dd/div/span").Where(w => w.Id == "topPointTotalNumber").First().InnerText;
var regDt = listNo.SelectNodes("//div").Where(w => w.Attributes["class"].Value == "vote_lst").First()
                  .SelectNodes("dl").Where(w => w.Attributes["class"].Value == "rt").First()
                  .SelectNodes("dd").First().InnerText;

// 웹툰 컨텐츠
var view = doc.DocumentNode.SelectNodes("//div").Where(w => w.Id == "comic_view_area").First();
var doc3 = new HtmlDocument();
doc3.LoadHtml(view.InnerHtml);
var content = doc3.DocumentNode.SelectNodes("//div")[0].InnerHtml;

// 작가의말
var doc2 = new HtmlDocument();
var contnextnode = doc.DocumentNode;
doc2.LoadHtml(contentNode.InnerHtml);
var artistNm = doc2.DocumentNode.SelectNodes("//div/div/h4/em/strong").First().InnerText;
var comment = doc2.DocumentNode.SelectNodes("//div/div/p").First().InnerHtml;
반응형