멋쟁이사자처럼 X K-DIGITAL Training - 06.15
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 numpy as np
from collections import Counter
from konlpy.tag import Okt
from PIL import Image
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt
%matplotlib inline
selenium selenium(셀레늄) 라이브러리
bs4.BeautifulSoup HTML과 XML 파싱하기 위한 파이썬 패키지
time 시간을 다루기 위한 모듈
pandas 데이터프레임 생성하여 행과 열의 데이터를 다룰 수 있게 해줌
numpy 수치 연산 라이브러리
collectioins.Counter 객체 안 동일한 값의 자료가 몇 개인지 파악하는데 사용하는 객체
Okt.knolpy 한국어 정보처리를 위한 파이썬 패키지
PIL.Image 이미지 분석 및 처리
wordcloud 워드클라우드 관련 라이브러리
matplotlib 차트나 플롯(plot) 그려주는 데이터 시각화 라이브러리
웹 브라우저 동작 테스트 자동화(조종)
- 자바스크립트가 동적으로 만든 데이터 크롤링을 위해
- 사이트의 다양한 HTML 요소에 클릭, 키보드 입력 등 이벤트를 주기 위해 사용
설치
!pip install selenium
크롬 드라이버 설치
라이브러리 import
from selenium import webdriver
가상 브라우저 준비 (* 가상브라우저는 손대지 말것!)
- 크롬드라이버 위치가 다를 시 절대경로나 상대경로 이용
driver = webdriver.Chrome(executable_path='(driver) chromedriver.exe')
++ 맥ver 추가
설치
brew install chromedriver
실행
# mac Chrome (brew로 chromedriver 설치한 경우)
driver = webdriver.Chrome()
구글 번역 페이지 open
- driver.get(url) : 해당 url 브라우저에 띄움- current_url : 현재 url
translate_url = 'https://translate.google.co.kr/?um=1&ie=UTF-8&hl=ko#view=home&op=translate&sl=auto&tl=en'
# hl=ko : Korean & tl=en : English
driver.get(translate_url)
print(driver.current_url)
>> https://translate.google.co.kr/?sl=auto&tl=en&op=translate&hl=ko
예제) '파이썬을 잘하고 싶어요'
- Xpath 복사
- 텍스트 입력
find_element_by_xpath(xpath) : id, name, class 등으로 웹 페이지 요소 찾기 어려울 때
send_keys : 키보드 입력
origin_xpath = '/html/body/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[2]/c-wiz[1]/span/span/div/textarea'
driver.find_element_by_xpath(origin_xpath).send_keys('파이썬을 잘하고 싶어요')
- 번역 결과 출력
translation_xpath = '/html/body/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[2]/c-wiz[2]/div[5]/div/div[1]/span[1]/span/span'
translated_contents = driver.find_element_by_xpath(translation_xpath)
translated_contents.text
>> 'I want to do Python well.'
기사글 번역)
데이터 준비
df = pd.read_excel('result_210623_1530.xlsx', encoding='utf-8')
기사글 번역
article = df.Article[8]
article = articlce.replace(' \n', '') # 전처리
origin_xpath = '/html/body/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[2]/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)
time.sleep(3)
translation_xpath = '/html/body/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[2]/c-wiz[2]/div[5]/div/div[1]/span[1]/span/span'
translated_contents = driver.find_element_by_xpath(translation_xpath).text
print('기사글 [ {} ] 의 번역이 끝났습니다.'.format(df['Title'][0]))
print(translated_contents)
종료
- driver.close() : 브라우저 창 닫음
- driver.quit() : 프로세스 종료
driver.close()
driver.quit()
[참고] 2021.06.25 - [python/k-digital] - [K-DIGITAL] 파이썬 텍스트 데이터 분석
단어 빈도 계산
articles = df['Article'].tolist()
articles = ''.join(articles)
twitter = Okt()
raw_pos_tagged = twitter.pos(articles, norm=True, stem=True)
del_list = ['하다', '있다', '되다', '이다', '돼다', '않다', '그렇다', '아니다', '이렇다', '그렇다', '어떻다']
del_list.append('김형')
word_cleaned = []
for word in raw_pos_tagged:
if not word[1] in ["Josa", "Eomi", "Punctuation", "Foreign"]:
if (len(word[0]) != 1) & (word[0] not in del_list):
word_cleaned.append(word[0])
word_counted = Counter(word_cleaned)
word_dic = dict(word_counted)
sorted_word_dic = sorted(word_dic.items(), key=lambda x:x[1], reverse=True)
빈도순으로 상위 100개만 선택하여 번역
- 100위 단어의 빈도수 확인
translation_target = sorted_word_dic[:100]
translation_target[-1]
>> ('이수경', 9)
- 단어 사전('단어': 빈도 수) 생성
translation_target = {} # dict
for item in word_dic:
# item == dict.key -> dict[key] = value
if word_dic[item] >= 9:
# translation_target = {'key': 'count(value)'} dict
translation_target[item] = word_dic[item]
번역
translation_result = {}
driver = webdriver.Chrome(executable_path='(driver) chromedriver.exe')
# driver = webdriver.PhantomJS('(driver) phantomjs.exe')
# url open
translate_url = 'https://translate.google.co.kr/?um=1&ie=UTF-8&hl=ko#view=home&op=translate&sl=auto&tl=en'
driver.get(translate_url)
print(driver.current_url)
time.sleep(3)
# translate
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[2]/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)
translated_xpath = '/html/body/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[2]/c-wiz[2]/div[5]/div/div[1]/span[1]/span/span'
translated_contents = driver.find_element_by_xpath(translated_xpath).text
translation_result[translated_contents] = translation_target[key]
print('단어 \'{}\'의 번역 완료 : {}'.format(key, translated_contents))
print('전체 번역이 끝났습니다!')
# 종료
driver.close()
driver.quit()
워드클라우드 생성
cloud_image = np.array(Image.open("image/wordcloud3.jpg"))
image_colors = ImageColorGenerator(cloud_image)
word_cloud = WordCloud(font_path="C:/Windows/Fonts/malgun.ttf",
width=2000, height=1000,
mask=cloud_image,
background_color='white').generate_from_frequencies(translation_result)
plt.figure(figsize=(15,15))
plt.imshow(word_cloud.recolor(color_func=image_colors), interpolation='bilinear')
## Matplotlib colormap 활용하여 색 변경
# plt.imshow(word_cloud.recolor(colormap='Blues'), interpolation='bilinear')
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()
[K-DIGITAL] 인공지능과 머신러닝 (0) | 2021.06.28 |
---|---|
[K-DIGITAL] 파이썬 Selenium으로 크롤링하기(2) + SQLite (0) | 2021.06.28 |
[K-DIGITAL] 파이썬 텍스트 데이터 분석 (0) | 2021.06.25 |
[K-DIGITAL] 파이썬 웹 크롤링 - 뉴스 기사 스크랩(2) (0) | 2021.06.23 |
[K-DIGITAL] 파이썬 웹 크롤링 - 뉴스 기사 스크랩 (0) | 2021.06.23 |
댓글 영역