개발 블로그

[Python] Selenium translation 셀레늄으로 번역기 돌리기 본문

Programming Language/Python

[Python] Selenium translation 셀레늄으로 번역기 돌리기

draidev 2022. 3. 29. 20:33

엑셀파일의 문자열 데이터를 가공한 후 selenium을 활용하여 구글번역기에 단어를 입력하고 번역한 결과를 가져와 저장하는 프로그램입니다.

(엑셀파일은 [Python] 웹 스크래핑 (1) 게시물에서 생성한 엑셀파일을 사용하였습니다.)

목차>

더보기

목차

    00 import

    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.chrome.service import Service
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from bs4 import BeautifulSoup 
    import time
    import pandas as pd
    import warnings
    warnings.filterwarnings("ignore")

     

    01_01

    • pd.read_excel( )함수로 엑셀파일을 DataFrame객체로 읽어옵니다.
    • 그중에서 본문의 내용이 담겨있는 'Article'속성의 첫 번째 인스턴스를 번역하기 위해 article변수에 대입해줍니다.
    • Service생성자를 통해서 ChromeDriver를 install해줍니다.
    • webdriver.Chrome( )으로 생성한 객체타입은 아래와 같습니다. 이를 driver변수에 대입했습니다.
    selenium.webdriver.chrome.webdriver.WebDriver
    df = pd.read_excel('result_220329_0101.xlsx')
    article = df['Article'][0]
    
    service = Service(executable_path=ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)
    translator_url = 'https://translate.google.co.kr/?sl=auto&tl=en&op=translate&hl=ko'
    driver.get(translator_url)

     

    01_02

    구글번역기 사이트에 접속하여 번역할 언어를 입력하는 부분의 태그와 속성을 파악합니다.

    이때 마땅한 요소가 id, class, name등과 같은 일반 로케이터에서 발견되지 못하면 XPath를 사용하여 웹페이지에서 요소를 찾습니다. (참고 블로그 : XPath란?)

     

    원본 언어를 입력하는 창의 XPath를 구하고 번역된 언어가 나오는 창의 XPath를 구해 변수에 대입해줍니다.

     

    Copy full XPath

    • driver.maximize_window( ) : 브라우저 창을 최대화합니다. 창이 작아졌을때 번역화면이 가려져서 XPath로 접근하지 못할 수 있습니다.
    • find_element_by_xpath( )함수를 통해서 요소를 찾습니다.
    • clear( )함수는 해당요소를 비워줍니다.
    • send_keys( )함수는 요소에 전달인자의 값을 입력합니다.
    driver.maximize_window()
    
    origin_xpath = '/html/body/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[3]/c-wiz[1]/span/span/div/textarea'
    driver.find_element_by_xpath(origin_xpath).clear()
    driver.find_element_by_xpath(origin_xpath).send_keys(article)
    
    # 번역하는데 걸리는 시간을 고려하여 3초간 멈춥니다.
    time.sleep(3)
    
    translation_xpath = '/html/body/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[3]/c-wiz[2]/div[6]/div/div[1]/span[1]/span/span'
    translated_texts = driver.find_element_by_xpath(translation_xpath).text
    
    print('기사글 [ {} ]의 번역이 끝났습니다.'.format(df['Title'][0]))
    print(translated_texts)
    
    # chromedriver창을 닫아줍니다.
    driver.close()
    driver.quit()

    번역된 내용이 잘 출력됐습니다!

    print(translated_texts)

    02 전체 기사 내용 번역 후 엑셀파일 저장

    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.chrome.service import Service
    from selenium import webdriver
    import time
    import pandas as pd
    import warnings
    warnings.filterwarnings("ignore") 
    
    df = pd.read_excel('result_220329_0101.xlsx')
    
    service = Service(executable_path=ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)
    # hl=ko : Korean & tl=en : English
    translator_url = 'https://translate.google.co.kr/?sl=auto&tl=en&op=translate&hl=ko'
    driver.get(translator_url)
    
    driver.maximize_window()
    
    eng_translated_texts = []
    for row_index, row in df.iterrows():
        origin_xpath = '/html/body/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[3]/c-wiz[1]/span/span/div/textarea'
        driver.find_element_by_xpath(origin_xpath).clear()
        driver.find_element_by_xpath(origin_xpath).send_keys(df['Article'][row_index])  # 본문 내용 속성에 접근후 행인덱스로 하나씩 접근
        time.sleep(3)
    
        translation_xpath = '/html/body/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[3]/c-wiz[2]/div[6]/div/div[1]/span[1]/span/span'
        translated_texts = driver.find_element_by_xpath(translation_xpath).text
    
        print('기사글 [ {} ]의 번역이 끝났습니다.'.format(df['Title'][row_index]))
        print(translated_texts) 
        eng_translated_texts.append(translated_texts)
    
    driver.close()
    driver.quit()
    
    df['Translated_article'] = eng_translated_texts  # DataFrame에 새로운 열 추가
    df.to_excel('translation_result.xlsx', index=False, encoding='utf-8')
    
    print('엑셀파일 저장이 완료되었습니다.')

     

    03_01 konlpy 자연어 처리 후 많이 사용된 단어들만 번역하기

    konlpy 게시물 참고 : [Python] konlpy 한국어 텍스트 분석과 시각화

    • from collections import Counter
    • from konlpy.tag import Okt

    위 두개의 라이브러리를 추가해 줍니다.

    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.chrome.service import Service
    from selenium import webdriver
    import time
    import pandas as pd
    import warnings
    from collections import Counter
    from konlpy.tag import Okt
    warnings.filterwarnings("ignore") 
    
    df = pd.read_excel('result_220329_0101.xlsx')
    
    service = Service(executable_path=ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)
    
    # 번역할 기사내용을 하나의 리스트로 만든다.
    articles = df['Article'].tolist()
    articles = ''.join(articles)
    
    tokenizer = Okt()
    """ 토큰화, 정규화, 어근화, 품사 태깅"""
    raw_pos_tagged = tokenizer.pos(articles, norm=True, stem=True)
    
    """ 불용어 리스트 """
    del_list = ['하다', '되다', '돼다', '있다', '않다', '그렇다', '그래서']
    word_cleaned = []
    # 의미있는 단어만 뽑아낸다.
    for word in raw_pos_tagged:
        if word[1] not in ['Josa','Eomi','Punctuation','Foreign']:
            if (len(word[0]) != 0) & (word[0] not in del_list):
                word_cleaned.append(word[0])
    
    # 각 단어의 출현 빈도를 구해서 딕셔너리로 만든다
    word_count = Counter(word_cleaned)
    word_dic = dict(word_count)
    
    # 출현 빈도를 기준으로 내림차순 정렬
    sorted_word = sorted(word_dic.items(),key=lambda x:x[1], reverse=True)
    
    translation_target = sorted_word[:100]
    print(translation_target[-1])

    내림차순으로 하여 마지막 100번째 단어의 출현횟수가 20인것을 확인합니다.

    print(translation_target[-1])

     

    20을 마스크로 하여 등장횟수가 20 이상인 단어들을 모은 딕셔너리를 따로 만듭니다.

    그 뒤의 과정은 위에서 진행한 번역과정과 동일합니다.

    # 등장횟수가 20이상인 단어만 번역할 딕셔너리에 추가
    translation_target = {}
    for key in word_dic:
        if word_dic[key] >= 20:
            translation_target[key] = word_dic[key]
    
    
    service = Service(executable_path=ChromeDriverManager().install()) 
    driver = webdriver.Chrome(service=service)
    
    translate_url = 'https://translate.google.co.kr/?sl=auto&tl=en&op=translate&hl=ko'
    driver.get(translate_url) 
    print(driver.current_url)
    time.sleep(3)
    
    translation_result = {}
    for key in translation_target:
        origin_xpath = '/html/body/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[3]/c-wiz[1]/span/span/div/textarea'
        driver.find_element_by_xpath(origin_xpath).clear()
        driver.find_element_by_xpath(origin_xpath).send_keys(key)  # 본문 내용 속성에 접근후 행인덱스로 하나씩 접근
        time.sleep(3)
    
        translation_xpath = '/html/body/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[3]/c-wiz[2]/div[6]/div/div[1]/span[1]/span/span'
        translated_texts = driver.find_element_by_xpath(translation_xpath).text
        translation_result[translated_texts] = translation_target[key]
    
    print('번역이 완료 되었습니다.')
    
    driver.close()
    driver.quit()

     

    03_02 WordCloud 생성

    이제 translation_result 딕셔너리에 저장되어 있는 값으로 WordCloud를 만들고 마무리 합니다.

    참고 게시물 : [Python] Wordcloud 만들기

    # 엑셀 파일에 번역한 결과 저장
    df1 = pd.DataFrame()
    df1['word'] = translation_result.keys()
    df1['frequency'] = translation_result.values()
    df1.to_excel('translation_result.xlsx',index=False,encoding='utf-8')
    
    # WordCloud 만들기
    apple_logo = np.array(Image.open('./images//apple1.jpg'))
    image_colors = ImageColorGenerator(apple_logo)
    
    word_cloud = WordCloud(font_path="C:/Windows/Fonts/malgun.ttf",
                           width = 2000, height = 1000,
                           mask = apple_logo,
                           background_color = 'white').generate_from_frequencies(translation_result)
    
    word_cloud = word_cloud.recolor(color_func=image_colors)
    word_cloud.to_file(filename='selenium_Apple.jpg')
    plt.figure(figsize=(15,15))
    plt.imshow(word_cloud, interpolation='bilinear')
    plt.axis("off")
    plt.tight_layout(pad=0)
    plt.show()

    plt.show( )

    최종코드

    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.chrome.service import Service
    from selenium import webdriver
    import time
    import pandas as pd
    import warnings
    from collections import Counter
    from konlpy.tag import Okt
    from PIL import Image 
    from wordcloud import WordCloud, ImageColorGenerator
    import numpy as np
    import matplotlib.pyplot as plt
    
    warnings.filterwarnings("ignore") 
    
    df = pd.read_excel('result_220329_0101.xlsx')
    
    # 번역할 기사내용을 하나의 리스트로 만든다
    articles = df['Article'].tolist()
    articles = ''.join(articles)
    
    tokenizer = Okt()
    """ 토큰화, 정규화, 어근화, 품사 태깅"""
    raw_pos_tagged = tokenizer.pos(articles, norm=True, stem=True)
    
    """ 불용어 리스트 """
    del_list = ['하다', '되다', '돼다', '있다', '않다', '그렇다', '그래서']
    word_cleaned = []
    # 의미있는 단어만 뽑아낸다
    for word in raw_pos_tagged:
        if word[1] not in ['Josa','Eomi','Punctuation','Foreign']:
            if (len(word[0]) != 0) & (word[0] not in del_list):
                word_cleaned.append(word[0])
    
    # 각 단어의 출현 빈도를 구해서 딕셔너리로 만든다
    word_count = Counter(word_cleaned)
    word_dic = dict(word_count)
    
    # 등장횟수가 20이상인 단어만 번역할 딕셔너리에 추가
    translation_target = {}
    for key in word_dic:
        if word_dic[key] >= 20:
            translation_target[key] = word_dic[key]
    
    
    service = Service(executable_path=ChromeDriverManager().install()) 
    driver = webdriver.Chrome(service=service)
    
    translate_url = 'https://translate.google.co.kr/?sl=auto&tl=en&op=translate&hl=ko'
    driver.get(translate_url) 
    print(driver.current_url)
    time.sleep(3)
    
    translation_result = {}
    for key in translation_target:
        origin_xpath = '/html/body/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[3]/c-wiz[1]/span/span/div/textarea'
        driver.find_element_by_xpath(origin_xpath).clear()
        driver.find_element_by_xpath(origin_xpath).send_keys(key)  # 본문 내용 속성에 접근후 행인덱스로 하나씩 접근
        time.sleep(1)
    
        translation_xpath = '/html/body/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[3]/c-wiz[2]/div[6]/div/div[1]/span[1]/span/span'
        translated_texts = driver.find_element_by_xpath(translation_xpath).text
        translation_result[translated_texts] = translation_target[key]
    
    print('번역이 완료 되었습니다.')
    
    driver.close()
    driver.quit()
    
    # 엑셀 파일에 번역한 결과 저장
    df1 = pd.DataFrame()
    df1['word'] = translation_result.keys()
    df1['frequency'] = translation_result.values()
    df1.to_excel('translation_result.xlsx',index=False,encoding='utf-8')
    
    # WordCloud 만들기
    apple_logo = np.array(Image.open('./images//apple1.jpg'))
    image_colors = ImageColorGenerator(apple_logo)
    
    word_cloud = WordCloud(font_path="C:/Windows/Fonts/malgun.ttf",
                           width = 2000, height = 1000,
                           mask = apple_logo,
                           background_color = 'white').generate_from_frequencies(translation_result)
    
    word_cloud = word_cloud.recolor(color_func=image_colors)
    word_cloud.to_file(filename='selenium_Apple.jpg')
    plt.figure(figsize=(15,15))
    plt.imshow(word_cloud, interpolation='bilinear')
    plt.axis("off")
    plt.tight_layout(pad=0)
    plt.show()
    Comments