안녕하세요. 언제나 휴일에 언휴예요.
이전 강의에서는 뉴스 기사를 검색 요청하면 몇 개의 기사가 있는지를 얻어오는 코드까지 구현했어요.
이번에는 실제 기사를 얻어와서 출력하는 부분까지 구현합니다.
*데이터 분석 with C#”은 동영상 강의를 중심으로 제작하며 결과 소스는 사이트에 게시합니다.
- News.cs
using System; using System.Xml; namespace 네이버_뉴스_크롤링_라이브러리_제작 { public class News { public string Title { get; private set; } public string OriginalLink { get; private set; } public string Link { get; private set; } public string Description { get; private set; } public DateTime Pubdate { get; private set; } public News(string title, string olink, string link, string description,DateTime pubdate) { Title = title; OriginalLink = olink; Link = link; Description = description; Pubdate = pubdate; } 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; } } public static string Strip(string htmltext) { int s = htmltext.IndexOf("<"); int e = htmltext.IndexOf(">"); while (s < e) { string b = htmltext.Substring(0, s); string a = htmltext.Substring(e + 1); htmltext = b + a; s = htmltext.IndexOf("<"); e = htmltext.IndexOf(">"); } return htmltext; } public override string ToString() { return Title; } } }
- NaverNews.cs
using System.Collections.Generic; using System.IO; using System.Net; using System.Xml; namespace 네이버_뉴스_크롤링_라이브러리_제작 { public class NaverNews { public string SRC { get; set; } public string ID { get; set; } public string Secret { get; set; } 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; } } }
- Program.cs
// ehpub.co.kr // 데이터분석 with C# //네이버 뉴스 크롤링 라이브러리 v0.1 제작하기 using System; using System.Collections.Generic; namespace 네이버_뉴스_크롤링_라이브러리_제작 { class Program { static void Main(string[] args) { string id = MySecret.id; string secret = MySecret.secret; NaverNews nn = new NaverNews(id, secret); int total = nn.Find("코로나"); Console.WriteLine(total); List nc = nn.FindNews(1, 20); foreach(News news in nc) { Console.WriteLine(news.Title); Console.WriteLine("=="); Console.WriteLine(news.Description); Console.WriteLine("=================================================="); } } } }