반응형
이전 강의에서 만든 뉴스 크롤링 부분을 라이브러리로 변환하는 작업입니다.
소스 코드는 바뀐 부분이 없으며 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;
}
}
}
반응형
'빅데이터 > 데이터분석 with C#' 카테고리의 다른 글
HTML Parser 패키지 HtmlAgilityPack 설치 및 HTML BODY 내용 얻어오기 (0) | 2020.05.07 |
---|---|
뉴스 크롤링을 넘어 형태소 분석 구현 (0) | 2020.05.04 |
뉴스 크롤링 라이브러리 만들기2 (0) | 2020.05.04 |
뉴스 크롤링 라이브러리 만들기1 (0) | 2020.05.04 |
뉴스 크롤링을 위한 사전 작업 - 네이버 개발자 센터 뉴스 검색 API 개요 (0) | 2020.05.04 |