프로그램/C#

C# Naver Api 사용하여 네이버 뉴스 검색하기

더월드 2023. 9. 1.

Naver Api 사용하기 사전 준비 단계

 

①. 네이버 오픈 API 이용 신청하기

https://developers.naver.com/products/service-api/datalab/datalab.md

 

②. 애플리케이션 등록 (Application 메뉴 선택 > 애플리케이션 등록)

- 애플리케이션 이름

- 사용API

- 등록하기 버튼 클릭으로 완료.

등록을 완료하시면 Client ID와 Client Secret 정보를 받게 됩니다.

이 정보를 이용해서 네이버 OPEN API에 접근할 수 있습니다.

 

③. 네이버 오픈 API 목록

 

검색 네이버 블로그, 이미지, 웹, 뉴스, 백과사전, 책, 카페, 지식iN 등 검색 25,000회/일
네이버 로그인 외부 사이트에서 네이버 로그인 기능 구현 없음
네이버 회원 프로필 조회 네이버 회원 이름, 이메일 주소, 휴대전화번호, 별명, 성별, 생일, 연령대, 출생연도, 프로필 조회 없음
Papago 번역 Papago 번역 인공신경망 기반 기계 번역 10,000글자/일
CLOVA Face Recognition 입력된 사진을 입력받아 얼굴윤곽/부위/표정/유명인 닮음도를 리턴 1,000건/일
데이터랩(검색어트렌드) 통합검색어 트렌드 조회 1,000회/일
데이터랩(쇼핑인사이트) 쇼핑인사이트 분야별 트렌드 조회 1,000회/일
캡차(이미지) 자동 입력 방지용 보안 이미지 생성 및 입력값 비교 1,000회/일
캘린더 로그인한 사용자 캘린더에 일정 추가 가능 5,000회/일
카페 특정 네이버 카페 가입하기 50회/일
카페 네이버 회원이 가입한 카페 게시판에 글 쓰기 200회/일
단축URL 입력된 URL을 me2.do 형태의 짧은 URL로 변환 25,000회/일
공유하기 네이버 블로그, 카페 공유하기 없음

 

④. 개발자가이드의 예제 참고하시면 됩니다.

 

네이버 API 구현

 

네이버 검색 api 구현 기본 코드

 

[파이썬] 통합 검색어 API 구현 예제 (출처: Naver)

https://developers.naver.com/docs/serviceapi/datalab/search/search.md#python

#-*- coding: utf-8 -*-
import os
import sys
import urllib.request
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
url = "https://openapi.naver.com/v1/datalab/search";
body = "{\"startDate\":\"2017-01-01\",\"endDate\":\"2017-04-30\",\"timeUnit\":\"month\",\"keywordGroups\":[{\"groupName\":\"한글\",\"keywords\":[\"한글\",\"korean\"]},{\"groupName\":\"영어\",\"keywords\":[\"영어\",\"english\"]}],\"device\":\"pc\",\"ages\":[\"1\",\"2\"],\"gender\":\"f\"}";

request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
request.add_header("Content-Type","application/json")
response = urllib.request.urlopen(request, data=body.encode("utf-8"))
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)

 

[C#] 통합 검색어 API 구현 예제(출처: Naver)

https://developers.naver.com/docs/serviceapi/datalab/search/search.md#c

using System;
using System.Net;
using System.Text;
using System.IO;

namespace NaverAPI_Guide
{
    public class APIExamDatalabTrend
    {
        static void Main(string[] args)
        {
            string url = "https://openapi.naver.com/v1/datalab/search";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Headers.Add("X-Naver-Client-Id", "YOUR-CLIENT-ID");
            request.Headers.Add("X-Naver-Client-Secret", "YOUR-CLIENT-SECRET");
            request.ContentType = "application/json";
            request.Method = "POST";
            string body = "{\"startDate\":\"2017-01-01\",\"endDate\":\"2017-04-30\",\"timeUnit\":\"month\",\"keywordGroups\":[{\"groupName\":\"한글\",\"keywords\":[\"한글\",\"korean\"]},{\"groupName\":\"영어\",\"keywords\":[\"영어\",\"english\"]}],\"device\":\"pc\",\"ages\":[\"1\",\"2\"],\"gender\":\"f\"}";
            byte[] byteDataParams = Encoding.UTF8.GetBytes(body);
            request.ContentLength = byteDataParams.Length;
            Stream st = request.GetRequestStream();
            st.Write(byteDataParams, 0, byteDataParams.Length);
            st.Close();
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream stream = response.GetResponseStream();
            StreamReader reader = new StreamReader(stream, Encoding.UTF8);
            string text = reader.ReadToEnd();
            stream.Close();
            response.Close();
            reader.Close();
            Console.WriteLine(text);
        }
    }
}

 

뉴스와 블로그의 검색 결과 값은 아래와 같고 이를 파싱하여서 사용하면됩니다.

파싱하기 쉬운 것은 json 형태입니다.

위 샘플 코드를 이용하시면 쉽게 결과값을 볼 수가 있습니다.

 

네이버 뉴스

{
	"lastBuildDate":"Mon, 28 Aug 2023 19:49:31 +0900",
	"total":49292211,
	"start":1,
	"display":10,
	"items":[
		{
			"title":"'위법' 경고에 9·4 집회 취소…"추모 연가도 불가" vs "직권남용"",
			"originallink":"http:\/\/www.mbn.co.kr\/pages\/news\/newsView.php?news_seq_no=4958179",
			"link":"https:\/\/n.news.naver.com\/mnews\/article\/057\/0001764922?sid=102",
			"description":"&quot; '교사 휴업'을 놓고 시도 교육감이 각자 다른 목소리를 내면서 진보와 보수 이념 양상으로 흐르는 데 대한 우려도 나옵니다. MBN<b>뉴스<\/b> 박유영입니다. 영상취재: 강두민 기자 영상편집: 김상진 그래픽: 강수연",
			"pubDate":"Mon, 28 Aug 2023 19:49:00 +0900"
		},
		{
			"title":"'9.4 공교육 멈춤의 날' 교육부-학교 현장 대치 국면",
			"originallink":"http:\/\/www.idomin.com\/news\/articleView.html?idxno=833275",
			"link":"http:\/\/www.idomin.com\/news\/articleView.html?idxno=833275",
			"description":"\/연합<b>뉴스<\/b> ◇교육부, 파면·해임까지 언급 = 교육부는 학교가 이날을 임시휴업일로 정하거나 교사가 연가 또는 병가를 사용하는 것은 위법이고, 교장의 승인 역시 위법이라며 학교 현장을 압박하고 있다. 지난 27일에는... ",
			"pubDate":"Mon, 28 Aug 2023 19:48:00 +0900"
		},

 

 

네이버 블로그

// 네이버 블로그 결과값
{
  "lastBuildDate": "Wed, 28 Jul 2021 18:45:57 +0900",
  "total": 29856,
  "start": 1,
  "display": 10,
  "items": [
      {
      "title": "핫한 제주 <b>노티드 도넛</b> 다녀온 후기!(메뉴 추천)",
      "link": "https:\/\/blog.naver.com\/betelgiuse?Redirect=Log&logNo=222441433706",
      "description": "시간 관게없이 4,000원이 발생하고 <b>노티드</b> 영수증을 지참하시면 2,000원을 할인해준답니다. 또 이곳의... 그리고 제주 <b>노티드 도넛</b>은 <b>도넛</b> 종류 말고도 쿠키와 크로플 종류들도 준비되어 있으니 취향에 따라 다른... ",
      "bloggername": "굿린",
      "bloggerlink": "https://blog.naver.com/betelgiuse",
      "postdate": "20210722"

      }
      ....
}

 

위 결과값에서 json 파싱 라이브러리를 사용하여 쉽게 원하는 값만 취하면 됩니다.

 

json 파싱은 NuGet 패키지 Newtonsoft.json을 사용하면 쉽습니다.

var parseJson = JObject.Parse(results);
var countsOfDisplay = Convert.ToInt32(parseJson["display"]);
var title = parseJson["items"][i]["title"].ToString();
var description = parseJson["items"][i]["description"].ToString();

 

 

C#  네이버 API를 이용한  뉴스 검색하기 코드

c# 윈폼을 이용하여 네이버 뉴스를 검색하는 코드를 작성해 볼께요. 

① 아래와 같은 윈폼을 만든다.

 

②json 파싱을 위해 NuGet 패키지 Newtonsoft.json을 설치

 

③아래와 코드를 적당히 넣으시면 됩니다.

 

참고로 네이버에서 제공하는 뉴스 기사의 날짜 시간값 포멧이 "Wed, 29 Nov 2023 17:18:00 +0900" 이런 형태이다.

이것을 보기 편하게 바꾸기 위해서는 다음 코드가 필요하다.

var pubDate = parseJson["items"][i]["pubDate"].ToString();

// pubDate의 포맷을 변경하여 출력
DateTime pubDate1 = DateTime.Parse(pubDate);
string formattedPubDate = pubDate1.ToString("yyyy-MM-dd HH:mm:ss");

 

전체 코드는 아래와 같습니다.

using System;
using System.Globalization;
using System.IO;
using System.Net;
using System.Windows.Forms;
using Newtonsoft.Json.Linq;

namespace naver_search
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void find_button_Click(object sender, EventArgs e)
        {
            try
            {
                string results = getNaverSearch();

                // 결과 출력
                //log_print(results);

                var parseJson = JObject.Parse(results);
                var countsOfDisplay = Convert.ToInt32(parseJson["display"]);
                var countsOfResults = Convert.ToInt32(parseJson["total"]);

                CultureInfo provider = CultureInfo.InvariantCulture;

                for (int i = 0; i < countsOfDisplay; i++)
                {
                    var title = parseJson["items"][i]["title"].ToString();
                    title = title.Replace("</b>", "");

                    title = title.Replace("&quot;", "\"");

                    var description = parseJson["items"][i]["description"].ToString();

                    description = description.Replace("</b>", "");
                    description = description.Replace("&quot;", "\"");

                    var link = parseJson["items"][i]["link"].ToString();
                    var originallink = parseJson["items"][i]["originallink"].ToString();

                    var pubDate = parseJson["items"][i]["pubDate"].ToString();

                    // pubDate의 포맷을 변경하여 출력
                    DateTime pubDate1 = DateTime.Parse(pubDate);
                    string formattedPubDate = pubDate1.ToString("yyyy-MM-dd HH:mm:ss");

                    log_print(string.Format("제목: {0}", title));
                    log_print(string.Format("내용: {0}", description));
                    log_print(string.Format("URL: {0}", originallink));
                    log_print(string.Format("작성일: {0}", formattedPubDate));
                    log_print("\n");
                }
            }
            catch (Exception exc)
            {
                log_print(exc.Message);
            }
        }

        private string getNaverSearch()
        {
            string _clientId = "발급받은 네이버API ID";
            string _clientSecret = "발급받은 네이버API 비밀번호";

            string keyword = keyword_textBox.Text; //검색어
            int list_cnt = 10;
            string display = list_cnt.ToString();

            string sort = "date"; // 정렬
            // 정렬 (0:시간순, 1:정확도)
            sort = "date"; // 시간순
            //sort = "sim"; // 정확도

            // 최종 검색 query
            string query = string.Format("?query={0}&display={1}sort={2}", keyword, display, sort);

            // 네이버 뉴스 검색
            string _apiUrl = "https://openapi.naver.com/v1/search/news.json";

            WebRequest request = WebRequest.Create(_apiUrl + query);
            request.Headers.Add("X-Naver-Client-Id", _clientId);
            request.Headers.Add("X-Naver-Client-Secret", _clientSecret);

            string requestResult = "";
            using (var response = request.GetResponse())
            {
                using (Stream dataStream = response.GetResponseStream())
                {
                    using (var reader = new StreamReader(dataStream))
                    {
                        requestResult = reader.ReadToEnd();
                    }
                }
            }

            // 쓰레기값 제거
            requestResult = requestResult.Replace("<b>", "");
            requestResult = requestResult.Replace("</b>", "");
            requestResult = requestResult.Replace("&lt;", "<");
            requestResult = requestResult.Replace("&gt;", ">");

            return requestResult;
        }

        private void log_print(string str_msg)
        {
            log_richTextBox.AppendText(str_msg + Environment.NewLine);
            log_richTextBox.ScrollToCaret();
            Application.DoEvents();
        }
    }
}

 

'프로그램 > C#' 카테고리의 다른 글

C# json 파싱하기  (0) 2023.09.05
[C#] DLL을 포함한 단일 EXE배포 방법  (0) 2023.09.04
C# 리스트뷰(ListView) 사용하기  (0) 2023.08.29
C# ChatGPT API사용하기  (0) 2023.07.13
C# 리스트박스(ListBox) 사용법  (0) 2023.07.07

댓글

💲 추천 글