일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Django
- selenium
- 잡담
- 이것이 코딩 테스트다
- find_all()
- pos_tag
- semi-project
- Roc curve
- EarlyStopping
- category_encoders
- SMTP
- pandas
- 트러블슈팅
- 크롤링
- PYTHON
- json
- 머신러닝
- aof
- 그리디
- stopwords
- ML
- 인공지능
- auc
- IOPub
- beautifulsoup
- Trouble shooting
- AI
- 파일입출력
- 원소주
- Logistic linear
Archives
- Today
- Total
개발 블로그
[Python] Selenium translation 셀레늄으로 번역기 돌리기 본문
엑셀파일의 문자열 데이터를 가공한 후 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를 구해 변수에 대입해줍니다.
- 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()
번역된 내용이 잘 출력됐습니다!
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인것을 확인합니다.
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()
최종코드
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()
'Programming Language > Python' 카테고리의 다른 글
TypeError: dict_to_df() takes 1 positional argument but 2 were given 클래스 함수에서 발생한 에러 (1) | 2024.01.25 |
---|---|
[Jupyter Notebook] Error : IOPub data rate exceeded. (0) | 2022.04.04 |
[Python] Wordcloud 만들기 (0) | 2022.03.29 |
[Python] konlpy 한국어 텍스트 분석과 시각화 (4) | 2022.03.29 |
[Python] 웹 스크래핑 (1) (0) | 2022.03.29 |
Comments