[Python] 셀레니움을 이용해 영한 번역 CLI 만들기

2021. 3. 2. 13:33유용한 끄적임

 

 


시작하기전

 

 

글의 내공이 뛰어난 경우에는 그냥 읽어도 문제가 없지만, 좀 엉뚱(?)하게 쓰인 글을 볼 때는 머리를 쥐어짜내야 하는 고통을 겪기 싫기에 googletrans를 이용하여 알아서 복붙하면 줄바꿈을 제거하고 딱 되도록 간단하게 만들어서 사용했는데.

 

구글 토큰 문제로 더이상 이용할 수 없게 되자 울며 겨자먹기로 구글 번역 사이트에 복붙하던 중...

 

줄바꿈이 그대로 복붙되기 때문에 매번 찾아서 없애는 데 애를 먹네요.

불편함에 비롯된 스트레스가 극에 달해 그냥 만들었어요.

 

 


설치

 

 

언어는 Python이고 필요한 라이브러리는 selenium와 lxml 입니다.

$ pip3 install selenium lxml

 

그리고 아래 사이트에 방문해서 본인 크롬 버전에 맞는 드라이버를 다운받으면 됩니다.

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

chromedriver.chromium.org

 

 

 


코드

 

# Libraries
from selenium import webdriver
from lxml.html import fromstring
from time import sleep

# Create chrome browser
options = webdriver.ChromeOptions()
options.add_argument("headless")
browser = webdriver.Chrome('크롬 드라이버 위치를 넣어주세요', options=options)

# Welcome!
print('''
안녕하세요, OOO님. 영한 번역을 시작하겠습니다.
''')

# Get the translated results.
def extract_translated(page_source) :
    elem = fromstring(page_source)
    translated = " ".join(elem.xpath('//div[1]/span[1]/span/span/text()'))
    if not translated : translated = " ".join(elem.xpath("//c-wiz/div/div/div/text()"))
    return translated

# Input and Output
def input_text() :
    print("\n> ", end="")
    text, line = '', ''
    while line!= ' ' :
        line =input()
        text+=line
    return text
    
def print_translated(translated) :
    print("-"*20, "Translation Result", "-"*20+'\n')
    print(translated, "\n\n"+"-"*60)


try :
    while True :
        src, dst = 'en', 'ko' # 언어를 자유롭게 바꿔도 된다.
        text = input_text()
        if text == 'q ' : raise KeyboardInterrupt()

        base_url = "https://translate.google.co.kr/?hl=ko&sl={}&tl={}&text={}&op=translate".format(src, dst, text)
        browser.get(base_url)

        translated = extract_translated(browser.page_source)
        transcount = 0
        # 로드 중이라는 글씨가 나오면 기다려준다. 단 5초 넘으면 자동 종료
        while '로드 중...' in translated and transcount < 50:
            sleep(0.1)
            translated  = extract_translated(browser.page_source)
            transcount += 1
        translated = "죄송합니다. 번역에 실패했습니다." if '로드 중...' in translated else translated

        print_translated(translated)

# If you want to quit, then enter the 'ctrl+c' or 'q \n'
except KeyboardInterrupt as ki :
    print("Key interrupt is detected. bye!")
except Exception as e :
    print("Error {} occur.".format(e))
finally :
    browser.quit()

 

 

 


사용법

 

만약 hello world를 번역하고 싶다면

 

> hello world(엔터)

(띄어쓰기)(엔터)

 

를 하면 됩니다.

 

끝내고 싶을 때는 ctrl+c 또는 q를 번역해주세요.

 

 

아! 그냥 알아서 개조하셔도 될꺼같네요.

 

 

 


끝내면서

 

구체적인 원리는 밝히지 않았어요. (귀찮기도 하고... 코드가 복잡하지도 않죠?)

 

참고로 백그라운드에서 실행되기 때문에 사용 후에는 꼭 프로그램을 제대로 종료하면 좋아요. (그냥 창을 닫아버리셔도 됩니다)