David의 개발 이야기!

파파고API를 활용한 번역프로그램 만들기! 본문

크롤링 공부

파파고API를 활용한 번역프로그램 만들기!

david.kim2028 2021. 12. 15. 01:01
반응형

파파고 API를 이용해 "코리아헤럴드"신문을 번역프로그램을 만들어보는 실습을 하였다.

 

[ 코리아 헤럴드 크롤링 코드 ] 

keyword = input("영어로 키워드 입력 >> ")
page_num = 1
while True:
    url = "http://www.koreaherald.com/search/index.php?q={}&sort=1&mode=list&np={}&mp=1".format(keyword, page_num)
    code = req.urlopen(url)
    soup = BeautifulSoup(code, "html.parser")
    articles = soup.select("ul.main_sec_li > li > a")
    if len(articles) == 0:
        break
    for i in articles:
        title = i.select_one("div.main_l_t1")
        print("제목 :", title.text)
        link = "http://www.koreaherald.com" + i.attrs["href"]
        code_news = req.urlopen(link)
        soup_news = BeautifulSoup(code_news, "html.parser")
        contents = soup_news.select_one("div#articleText")
        # 데이터 가공 result 변수에 값이 저장된다!
        result = re.sub(r'(\\[x]..)|(\\r)|(\\n)|(\\t)|(\(Yonhap\))', "", contents.text.strip())
        # print(result)
        # print()

 

[ 파파고 API를 이용해 번역하는 코드 ] 

파파고 API를 이용하는 부분은, NAVER에서 어떻게 활용하라고 예제코드를 올려놓아서 활용하였다!

 #API 문서에 5000개까지만 번역할 수 있게끔 해서 IF문 사용!
 if len(result) > 5000:
            result = result[0:5000]
        api_id = "**************"
        api_pw = "**************"

        client_id = api_id  # 개발자센터에서 발급받은 Client ID 값
        client_secret = api_pw  # 개발자센터에서 발급받은 Client Secret 값
        encText = urllib.parse.quote(result)
        
        #영어에서 한국어로 바꾸는 것이니 source=en&target=ko&text= 주의!
        data = "source=en&target=ko&text=" + encText
        url = "https://openapi.naver.com/v1/papago/n2mt"
        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, data=data.encode("utf-8"))
        rescode = response.getcode()
        if (rescode == 200):
            response_body = response.read()
            result = response_body.decode('utf-8')
            #print(result)
            result_dict = json.loads(result)  # json -> 딕셔너리
            print(result_dict["message"]["result"]["translatedText"])
            print()
        else:
            print("Error Code:" + rescode)
    page_num += 1

중간에 주석에 #print(result) 가 있는데, 딕셔너리형태처럼 보이는 JSON형식 이 나온다!

따라서, JSON형식을 딕셔너리자료형으로 바꾸어주어야한다!

이때 이용하는 것이, json.load 이다!

 

요 부분은 아래에 다시 정리해두었다!

https://david-kim2028.tistory.com/5

 

 

[ 전체 코드 ]

import urllib.request as req
from bs4 import BeautifulSoup
import re
import os
import sys
import urllib.request
import json

keyword = input("영어로 키워드 입력 >> ")
page_num = 1
while True:
    url = "http://www.koreaherald.com/search/index.php?q={}&sort=1&mode=list&np={}&mp=1".format(keyword, page_num)
    code = req.urlopen(url)
    soup = BeautifulSoup(code, "html.parser")
    articles = soup.select("ul.main_sec_li > li > a")
    if len(articles) == 0:
        break
    for i in articles:
        title = i.select_one("div.main_l_t1")
        print("제목 :", title.text)
        link = "http://www.koreaherald.com" + i.attrs["href"]
        code_news = req.urlopen(link)
        soup_news = BeautifulSoup(code_news, "html.parser")
        contents = soup_news.select_one("div#articleText")
        # 데이터 가공
        result = re.sub(r'(\\[x]..)|(\\r)|(\\n)|(\\t)|(\(Yonhap\))', "", contents.text.strip())
        # print(result)
        # print()

        if len(result) > 5000:
            result = result[0:5000]
        api_id = "--------"
        api_pw = "--------"

        client_id = api_id  # 개발자센터에서 발급받은 Client ID 값
        client_secret = api_pw  # 개발자센터에서 발급받은 Client Secret 값
        encText = urllib.parse.quote(result)
        data = "source=en&target=ko&text=" + encText
        url = "https://openapi.naver.com/v1/papago/n2mt"
        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, data=data.encode("utf-8"))
        rescode = response.getcode()
        if (rescode == 200):
            response_body = response.read()
            result = response_body.decode('utf-8')
            result_dict = json.loads(result)  # json -> 딕셔너리
            print(result_dict["message"]["result"]["translatedText"])
            print()
        else:
            print("Error Code:" + rescode)
    page_num += 1

 

반응형
Comments