빅데이터/데이터분석 with C#

뉴스 크롤링 라이브러리 만들기3

언제나휴일 2020. 5. 4. 20:38
반응형

 

이전 강의에서 만든 뉴스 크롤링 부분을 라이브러리로 변환하는 작업입니다.

소스 코드는 바뀐 부분이 없으며 XML 주석은 추가로 달았습니다.

소스 코드

  • News.cs
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
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;
        }
    }
}
반응형