[Python] 파이썬 네이버 API 뉴스 연동(2)

2023. 12. 31. 14:23카테고리 없음

1. 파이썬 네이버 API 뉴스 연동(2)

 파이썬으로 불러오기 위하여 네이버에서 제공하는 두개의 연동키를 발급받아서 처리를 하여야 한다. 

https://api.ncloud-docs.com/docs/common-ncpapi

 

Ncloud API

 

api.ncloud-docs.com

Access Key와 Secret Key를 발급받아야 한다고 되어있다. 일단 가이드대로 두개의 키를 발급받는다. 

두개의 키를 발급받아 아래와 같이 연동처리를 진행한다. 

1편에서 지정한 키워드를 불러와서 순차적으로 for문을 돌면서 처리하는 아주 단순한 방식이다. 

SQLITE를 이용하다보니 조금 느린 부분이 있다. 

 

XXXXXXXXX 표시된 부분에 발급받은 키를 넣으면 된다.

import json
import os
import sys
import urllib.request
import sqlite3

# print(sqlite3.version)
# print(sqlite3.sqlite_version)

class NaverNewsClass:
    def __init__(self):

        self.DBINFO = "NEWSDB.db"
        ar_list = self.getNewsKeyWord()
        for key in ar_list:
            self.getNaverNews(key)

    def getNaverNews(self, strWord):
        try:
            client_id = "XXXXXXXXXXXXX"
            client_secret = "XXXXXXXXXXXX"
            encText = urllib.parse.quote(strWord)
            url = "https://openapi.naver.com/v1/search/news.json?sort=date&display=100&query=" + encText  # json 결과
            request = urllib.request.Request(url)
            request.add_header("X-Naver-Client-Id", client_id)
            request.add_header("X-Naver-Client-Secret", client_secret)
            response = urllib.request.urlopen(request)
            rescode = response.getcode()
            if (rescode == 200):
                response_body = response.read()
                response_body = response_body.decode('utf-8')
                # print(response_body)
                result = json.loads(response_body)

                for i in range(50):
                    strTitle = result['items'][i]['title']
                    strLink = result['items'][i]['link']
                    strPubDate = result['items'][i]['pubDate']

                    self.setNaverInsert(strTitle, strLink, strWord, strPubDate)
            else:
                print("Error Code:" + rescode)

        except Exception as e:
            print(f"____ getNaverNews ____ {e}")





    def setNaverInsert(self, strTitle, strLink, strWord, strPubDate):
        try:
            # print(f" _____ strTitle _____ {strTitle}")
            # print(f" _____ strLink _____ {strLink}")
            # print(f" _____ strPubDate _____ {strPubDate}")

            strTitle = strTitle.replace("'", "`")
            strTitle = strTitle.replace("<b>", "")
            strTitle = strTitle.replace("</b>", "")
            strTitle = strTitle.replace("&nbsp;", "")
            strTitle = strTitle.replace("&quot;", "")
            strTitle = strTitle.replace("&quot;", "")
            strTitle = strTitle.replace("&lt;", "")
            strTitle = strTitle.replace("&gt;", "")

            strPubDate = strPubDate.replace("\"", "")
            strPubDate = strPubDate.replace("&nbsp;", " ")
            strPubDate = str(strPubDate)

            strLink = strLink.strip()

            #   링크가 등록되어 있는지를 확인한다.
            isYN = self.getCheckURL(strLink)

            if isYN == "N":
                conn = sqlite3.connect(f"{self.DBINFO}", isolation_level=None)
                cursor = conn.cursor()
                sql = f"INSERT INTO NewsDB (news_title, news_url, news_section, news_pubdate) " \
                      f" VALUES ('{strTitle}','{strLink}','{strWord}','{strPubDate}')"
                cursor.execute(sql)
                conn.commit()
        except Exception as e:
            print(f"____ setNaverInsert ____ {e}")



    def getCheckURL(self, strLink):
        try:
            conn = sqlite3.connect(f"{self.DBINFO}", isolation_level=None)
            cursor = conn.cursor()
            sql = f"SELECT news_url FROM NewsDB WHERE news_url = '{strLink}' LIMIT 1 "
            print(sql)
            cursor.execute(sql)
            rows = cursor.fetchall()
            cursor.close()

            isYN = "N"
            if len(rows) > 0:
                isYN = "Y"
            return isYN

        except Exception as e:
            print(f"____ getCheckURL ____ {e}")



    def getNewsKeyWord(self):
        try:
            ar_keyword = []
            conn = sqlite3.connect(f"{self.DBINFO}", isolation_level=None)
            cursor = conn.cursor()
            sql = f"SELECT k_word FROM NewsKeyWord WHERE k_use = 'Y' "
            # print(sql)
            cursor.execute(sql)
            rows = cursor.fetchall()
            cursor.close()

            for rs in rows:
                k_word = rs[0]
                # print(k_word)

                ar_keyword.append(k_word)
            return ar_keyword
        except Exception as e:
            print(f" ___ getNewsKeyWord ___ {e}")



if __name__ == "__main__":
    NaverNewsClass()
반응형