Selenium이란?
- 웹개발자들이 원래 사용하는 용도로, 주로 웹브라우저 호환성 문제 점검할 때 사용된다.
- 스크래핑(크롤링) 용도로는 브라우저 제어를 자동화하는 용도로 사용
- HTML코드와 request.get으로 받아온 코드가 다를 때
1) 대부분 post 요청을 해야할 때 이런 일 발생한다. 하지만, post 요청에 맞게 코드를 고쳐도 안될 때 있다. 그럴 경우 Selenium을 사용한다.
2) 타고타고 들어가서 주소창을 복사하고 다시 붙여넣기 했을 때 그 창이 안열리는 경우가 있다. 이 경우에도 Selenium을 사용한다.
- 자동화라서 편리하지만, 그만큼 메모리를 많이 차지하고 컴퓨터가 느려지기에 최후수단으로 사용해야 한다.
Selenium에서 작업할 때는 창이 총 3개 띄워져 있어야 한다.
1) 주피터노트북(코드창)
2) 메인브라우저(크롬 개발자용 도구로 태그 찾아보는 용도)
3) 가상브라우저
1. 라이브러리 설치 및 임포트
!pip install selenium==4.1.0
!pip install webdriver-manager==3.5.2
# 자동으로 크롬드라이버(가상브라우저) 파일을 다운로드해주는 라이브러리
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") # 불필요한 Warning 메시지를 꺼줍니다.
2. 가상브라우저 함수 맛보기
### 세트로 들고다니기 !
### 가상브라우저는 절대로 만지면 안됨 (코드로 명령만!)
### 메인브라우저로 가상브라우저에 들어갈 URL 들어가기
# 자동으로 크롬드라이버(가상브라우저) 파일을 다운로드 후 세팅
service = Service(executable_path=ChromeDriverManager().install())
# 세팅된 크롬드라이버를 연결해 가상브라우저 실행
driver = webdriver.Chrome(service=service)
# 가상브라우저를 지정 URL로 이동시키기
url = ' '
driver.get(url)
print(driver.current_url)
# 현재 페이지의 HTML 통째로 들고오는 기능
driver.page_source
3. driver.find_ 함수 맛보기
: find_element, find_elements는 각각 find(), find_all() 함수와 비슷하며, find_element_ 함수를 더 많이 사용한다. 주로 아래 네 가지가 잘 쓰인다.
1) find_element_by_class_name(' ')
- .click() / .send_keys(' ') / .clear()과 함께 잘 사용된다.
- send_keys(' ') : 포착한 태그에 ' '를 가상브라우저에 던져주는 역할
- driver.find_element_by_xpath(origin_xpath).send_keys('파이썬은 쉽습니다')
2) find_element_by_id(' ')
3) find_element_by_css_selector(' > > > ... ')
- css selector : #yDmH0d > c-wiz > div > div.WFnNle > c-wiz > div.OlSOob > c-wiz > div.ccvoYb > div.AxqVh > div.OPPzxe > c-wiz.rm1UF.UnxENd > span > span > div > textarea
- class: . & id: #
4) find_element_by_xpath(' ')
- class나 id에 의존하지 않고 구조에 의존
- css full 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
1. Selenium/ GoogleTranslator 번역 자동화
# 이전 게시글에서 했던 코드
from collections import Counter
from konlpy.tag import Okt
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 not word[1] in ["Josa", "Eomi", "Punctuation", "Foreign"]: # 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)
sorted_word_dic
상위 N개의 단어를 번역 진행하여 Word Cloud를 만들려 한다.
상위 N개를 뽑아내 translate_target 변수에 저장한다.
translation_target = sorted_word_dic[:100] # >24
translation_target = {}
for key in word_dic:
if word_dic[key] >= 24: # 위에서 확인한 빈도수를 기반으로 번역 대상 단어를 선정합니다.
translation_target[key] = word_dic[key]
단어를 기반으로 Selenium을 사용하여 가상 브라우저에서 번역을 진행한다.
translation_result = {}
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)
# enumerate 함수 사용해서 index로 번호 달아줄 수도 있음
for key in translation_target: # 상위 100번째 빈도수에 해당하는 단어까지 담겨있는 dict
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) # 네트워크의 속도에 따라 잠깐씩 쉬어주면서 진행합니다.
translated_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_contents = driver.find_element_by_xpath(translated_xpath).text
translation_result[translated_contents] = translation_target[key] # 번역이 완료된 단어 dict의 value로 기존 dict의 value를 꽂아줍니다.
print('단어 {}의 번역 완료 : {}'.format(key, translated_contents))
print('전체 번역이 끝났습니다!')
driver.close()
driver.quit()
번역 과정 중에 아직 잘못 번역되는 경우가 많이 발생하니 직접 다시 볼 수 있는 경우에는 보고 잘못된 번역은 직접 수정하여 정확도를 높인다.
translation_result['AI'] = translation_result['TO THE'] # AI
translation_result['go'] = translation_result['good morning my love'] # 가다
translation_result['KT'] = translation_result['CT.'] # KT
translation_result['LG'] = translation_result['LG.'] # LG
translation_result['Bitcoin'] = translation_result['Bit coin'] # 비트코인
del translation_result['TO THE']
del translation_result['good morning my love']
del translation_result['CT.']
del translation_result['LG.']
del translation_result['Bit coin']
마지막으로, word_cloud에 넣어주면 완성된다.
from PIL import Image
from wordcloud import WordCloud, ImageColorGenerator
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline # notebook을 실행한 브라우저에서 바로 그림을 볼 수 있게 해주는 것
python_coloring = np.array(Image.open("python_mask.jpg"))
image_colors = ImageColorGenerator(python_coloring)
word_cloud = WordCloud(font_path="C:/Windows/Fonts/malgun.ttf",
width=2000, height=1000,
mask=python_coloring,
background_color='white').generate_from_frequencies(translation_result)
plt.figure(figsize=(15,15))
plt.imshow(word_cloud.recolor(color_func=image_colors), interpolation='bilinear')
# plt.imshow(word_cloud.recolor(colormap='Blues'), interpolation='bilinear')
plt.axis("off")
plt.tight_layout(pad=0)
plt.show()
2. Selenium/ Papago 번역 자동화
Papago는 Google 번역기보다 더 느리기 때문에 오류가 날 가능성이 더 높다.
만일 번역을 자동화하길 원한다면 1번을 권장한다.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
translation_result_papago = {}
service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
translate_url = 'https://papago.naver.com/?sk=ko&tk=en'
driver.get(translate_url)
print(driver.current_url)
time.sleep(3)
for key in translation_target: # 상위 100번째 빈도수에 해당하는 단어까지 담겨있는 dict
driver.find_element_by_id('txtSource').clear()
driver.find_element_by_id('txtSource').send_keys(key)
time.sleep(3) # 네트워크의 속도에 따라 잠깐씩 쉬어주면서 진행합니다.
wait = WebDriverWait(driver, timeout=10) # timeout : 지정한 조건의 충족까지 대기할 최대 시간 (만약 10초 내에 충족되지 않으면 에러가 발생)
wait.until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, "#targetEditArea > p")))
# 위 CSS Selector로 지정한 Tag의 존재가 포착될 때까지 대기 후 아래 코드를 실행 (가능한 조건 전체 목록 @ https://j.mp/3mCnc5G)
translated_contents = driver.find_element_by_id('txtTarget').text
translation_result_papago[translated_contents] = translation_target[key] # 번역이 완료된 단어 dict의 value로 기존 dict의 value를 꽂아줍니다.
print('단어 {}의 번역 완료 : {}'.format(key, translated_contents))
print('전체 번역이 끝났습니다!')
driver.close()
driver.quit()
'멋쟁이 사자처럼 AI SCHOOL 5기 > Today I Learned' 카테고리의 다른 글
[3주차 총정리] Wadis 마감 상품 재고 체크 & 메일 발송 크롤링 (0) | 2022.03.29 |
---|---|
[3주차 총정리] Selenium으로 브라우저 제어 자동화하기(2) _ 인터파크 투어 크롤링 (0) | 2022.03.29 |
[3주차 총정리] Okt 텍스트 분석 후에 Word Cloud 제작하기 (0) | 2022.03.29 |
[3주차 총정리] Web Scrapping (네이버 여러 뉴스 기사) (0) | 2022.03.28 |
[2주차 총정리] Web Scrapping (네이버 단일 뉴스 기사) (0) | 2022.03.26 |