반응형
1. HtmlAgilityPack 패키지 프로젝트 추가
*사용법 및 문서 는 사이트 참조
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;
반응형
'dev > asp.net, c#' 카테고리의 다른 글
[c#] LINQ 컬렉션 표준 쿼리 메서드 1 - (정렬, 필터 : OrderBy, ThenBy, Reverse, OfType, Where ) (0) | 2022.11.11 |
---|---|
[C#] 컬렉션(Collection) - System.Collections, 제너릭(List, Dictionary, Queue, Stack, SortedList) (0) | 2022.11.09 |
[asp.net core] ViewBag으로 한글 데이터 전달 (0) | 2022.10.26 |
[c#] redis(레디스) 이용 샘플(using StackExchange.Redis ) (0) | 2022.10.06 |
[c#] 데이터 타입 - enum 열거형 (0) | 2021.03.05 |