안녕하세요. 언제나 휴일에 언휴예요.
앞에서 네이버 개발자센터에서 제공하는 뉴스 검색 API를 이용한 뉴스 크롤링을 구현하였습니다.
이번 강의는 콘솔로 개발한 것을 클래스 라이브러리로 바꾸는 작업을 할 거예요.
소스 코드는 바뀌는 것이 없으며 public으로 접근 지정한 멤버에 XML 주석을 다는 부분에 차이가 있습니다.
자세한 사항은 동영상 강의를 참고하세요.
- News.cs
using System; using System.Xml; namespace 네이버_뉴스_크롤링_라이브러리_제작 { /// /// News 클래스 /// public class News { /// /// 기사 제목 /// public string Title { get; private set; } /// /// 기사 url /// public string OriginalLink { get; private set; } /// /// 네이버 사이트 기사 url /// public string Link { get; private set; } /// /// 기사 본문 /// public string Description { get; private set; } /// /// 기사 게시일자 /// public DateTime Pubdate { get; private set; } /// /// News 생성자 /// ///기사 제목 ///기사 url ///네이버 기사 url ///기사 본문 ///기사 게시일자 public News(string title, string olink, string link, string description, DateTime pubdate) { Title = title; OriginalLink = olink; Link = link; Description = description; Pubdate = pubdate; } /// /// News 개체 생성하는 정적 메서드 /// ///XML 노드(item) /// News 개체 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; } } /// /// Tag를 지워주는 메서드 /// ///태그 문자열 /// Tag를 지운 문자열 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; } /// /// ToString 메서드 재정의 /// /// 기사 제목 public override string ToString() { return Title; } } }
- NaverNews.cs
using System.Collections.Generic; using System.IO; using System.Net; using System.Xml; namespace 네이버_뉴스_크롤링_라이브러리_제작 { /// /// NaverNews 클래스 /// public class NaverNews { /// /// 검색 문자열 - 가져오기 및 설정하기 /// public string SRC { get; set; } /// /// 네이버 개발자센터 발급 - 애플리케이션 ID /// public string ID { get; set; } /// /// 네이버 개발자센터 발급 - 애플리케이션 Secret /// public string Secret { get; set; } /// /// 생성자 /// ///네이버 개발자 센터 발급 ID ///네이버 개발자 센터 발급 Secret public NaverNews(string id, string secret) { ID = id; Secret = secret; } /// /// 검색 메서드 /// ///검색 질의 /// 기사 총 개수 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; } /// /// 뉴스 검색 /// ///시작 기사 번호 ///검색할 기사 개수 /// 뉴스 컬렉션 public List 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 nc = new List(); News news; foreach (XmlNode xn in xnl) { news = News.Make(xn); if (news == null) { break; } nc.Add(news); } stream.Close(); return nc; } } }