안녕하세요. 언제나 휴일에 언휴예요.
앞에서 네이버 개발자센터에서 제공하는 뉴스 검색 API를 이용한 뉴스 크롤링을 구현하였습니다.
이번 강의는 콘솔로 개발한 것을 클래스 라이브러리로 바꾸는 작업을 할 거예요.
소스 코드는 바뀌는 것이 없으며 public으로 접근 지정한 멤버에 XML 주석을 다는 부분에 차이가 있습니다.
자세한 사항은 동영상 강의를 참고하세요.
- News.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
using System; using System.Xml; namespace 네이버_뉴스_크롤링_라이브러리_제작 { /// <summary> /// News 클래스 /// </summary> public class News { /// <summary> /// 기사 제목 /// </summary> public string Title { get; private set; } /// <summary> /// 기사 url /// </summary> public string OriginalLink { get; private set; } /// <summary> /// 네이버 사이트 기사 url /// </summary> public string Link { get; private set; } /// <summary> /// 기사 본문 /// </summary> public string Description { get; private set; } /// <summary> /// 기사 게시일자 /// </summary> public DateTime Pubdate { get; private set; } /// <summary> /// News 생성자 /// </summary> /// <param name="title">기사 제목</param> /// <param name="olink">기사 url</param> /// <param name="link">네이버 기사 url</param> /// <param name="description">기사 본문</param> /// <param name="pubdate">기사 게시일자</param> public News(string title, string olink, string link, string description, DateTime pubdate) { Title = title; OriginalLink = olink; Link = link; Description = description; Pubdate = pubdate; } /// <summary> /// News 개체 생성하는 정적 메서드 /// </summary> /// <param name="xn">XML 노드(item)</param> /// <returns>News 개체</returns> public static News Make(XmlNode xn) { try { string title = Strip(xn.SelectSingleNode("title").InnerText); string olink = xn.SelectSingleNode("originallink").InnerText; string link = xn.SelectSingleNode("link").InnerText; string description = Strip(xn.SelectSingleNode("description").InnerText); DateTime pubdate = DateTime.Parse(xn.SelectSingleNode("pubDate").InnerText); return new News(title, olink, link, description, pubdate); } catch { return null; } } /// <summary> /// Tag를 지워주는 메서드 /// </summary> /// <param name="tagtext">태그 문자열</param> /// <returns>Tag를 지운 문자열</returns> public static string Strip(string tagtext) { int s = tagtext.IndexOf("<"); int e = tagtext.IndexOf(">"); while (s < e) { string b = tagtext.Substring(0, s); string a = tagtext.Substring(e + 1); tagtext = b + a; s = tagtext.IndexOf("<"); e = tagtext.IndexOf(">"); } return tagtext; } /// <summary> /// ToString 메서드 재정의 /// </summary> /// <returns>기사 제목</returns> public override string ToString() { return Title; } } } |
- NaverNews.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
using System.Collections.Generic; using System.IO; using System.Net; using System.Xml; namespace 네이버_뉴스_크롤링_라이브러리_제작 { /// <summary> /// NaverNews 클래스 /// </summary> public class NaverNews { /// <summary> /// 검색 문자열 - 가져오기 및 설정하기 /// </summary> public string SRC { get; set; } /// <summary> /// 네이버 개발자센터 발급 - 애플리케이션 ID /// </summary> public string ID { get; set; } /// <summary> /// 네이버 개발자센터 발급 - 애플리케이션 Secret /// </summary> public string Secret { get; set; } /// <summary> /// 생성자 /// </summary> /// <param name="id">네이버 개발자 센터 발급 ID</param> /// <param name="secret">네이버 개발자 센터 발급 Secret</param> public NaverNews(string id, string secret) { ID = id; Secret = secret; } /// <summary> /// 검색 메서드 /// </summary> /// <param name="src">검색 질의</param> /// <returns>기사 총 개수</returns> public int Find(string src) { SRC = src; Stream stream; string url = string.Format("https://openapi.naver.com/v1/search/news.xml?query={0}&sort=date", src); XmlDocument xdoc = MakeDocument(url, out stream); XmlNode node = xdoc.SelectSingleNode("rss"); XmlNode n = node.SelectSingleNode("channel"); int total = int.Parse(n.SelectSingleNode("total").InnerText); stream.Close(); return total; } private XmlDocument MakeDocument(string url, out Stream stream) { WebRequest request = null; request = WebRequest.Create(url); request.Headers.Add("X-Naver-Client-Id", ID); request.Headers.Add("X-Naver-Client-Secret", Secret); WebResponse response = request.GetResponse(); stream = response.GetResponseStream(); XmlDocument xdoc = new XmlDocument(); xdoc.Load(stream); return xdoc; } /// <summary> /// 뉴스 검색 /// </summary> /// <param name="start">시작 기사 번호</param> /// <param name="display">검색할 기사 개수</param> /// <returns>뉴스 컬렉션</returns> public List<News> FindNews(int start, int display) { Stream stream; string url = string.Format("https://openapi.naver.com/v1/search/news.xml?query={0}&sort=date&start={1}&display={2}" , SRC, start, display); XmlDocument xdoc = MakeDocument(url, out stream); XmlNode node = xdoc.SelectSingleNode("rss"); XmlNode n = node.SelectSingleNode("channel"); XmlNodeList xnl = n.SelectNodes("item"); List<News> nc = new List<News>(); News news; foreach (XmlNode xn in xnl) { news = News.Make(xn); if (news == null) { break; } nc.Add(news); } stream.Close(); return nc; } } } |