상세 컨텐츠

본문 제목

[K-DIGITAL] 파이썬 Selenium으로 크롤링하기(1)

PYTHON/K-DIGITAL

by ranlan 2021. 6. 25. 23:53

본문

728x90

멋쟁이사자처럼 X K-DIGITAL Training - 06.15

 

 

Selenium 이용하여 기사 본문 번역하기

 

라이브러리

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) 그려주는 데이터 시각화 라이브러리

 

 

 

Selenium이란

웹 브라우저 동작 테스트 자동화(조종)

- 자바스크립트가 동적으로 만든 데이터 크롤링을 위해

- 사이트의 다양한 HTML 요소에 클릭, 키보드 입력 등 이벤트를 주기 위해 사용

 

설치

!pip install selenium

크롬 드라이버 설치

라이브러리 import

from selenium import webdriver

가상 브라우저 준비 (* 가상브라우저는 손대지 말것!)

- 크롬드라이버 위치가 다를 시 절대경로나 상대경로 이용

driver = webdriver.Chrome(executable_path='(driver) chromedriver.exe') 

driver

 

 

++ 맥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

driver

 

예제) '파이썬을 잘하고 싶어요'

- Xpath 복사

copy full 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

종료

- driver.close() : 브라우저 창 닫음

- driver.quit() : 프로세스 종료

driver.close()
driver.quit()

 

 

 

워드클라우드 (영어ver)

[참고] 2021.06.25 - [python/k-digital] - [K-DIGITAL] 파이썬 텍스트 데이터 분석

 

[K-DIGITAL] 파이썬 텍스트 데이터 분석

멋쟁이사자처럼 X K-DIGITAL Training - 06.14 스크랩한 기사로 텍스트 데이터 분석 및 워드클라우드 만들기 라이브러리 import numpy as np import pandas as pd import nltk from konlpy.tag import Okt import..

juran-devblog.tistory.com

단어 빈도 계산

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()

728x90

관련글 더보기

댓글 영역