새로새록

셀레니엄 활용예시 본문

소프트웨어융합/코드잇 정리.py

셀레니엄 활용예시

류지나 2022. 1. 20. 18:32

코드잇참조


코스타 - 사진저장, 엑셀저장

import time
from selenium import webdriver
from openpyxl import Workbook

# 워크북 생성
wb = Workbook(write_only=True)
ws = wb.create_sheet()
ws.append(['이미지 주소', '내용', '해시태그', '좋아요 수', '댓글 수'])

# 웹 드라이버 설정
driver = webdriver.Chrome()
driver.implicitly_wait(3)

driver.get('https://workey.codeit.kr/costagram/index')
time.sleep(1)

# 로그인
driver.find_element_by_css_selector('.top-nav__login-link').click()
time.sleep(1)

driver.find_element_by_css_selector('.login-container__login-input').send_keys('codeit')
driver.find_element_by_css_selector('.login-container__password-input').send_keys('datascience')

driver.find_element_by_css_selector('.login-container__login-button').click()
time.sleep(1)

# 페이지 끝까지 스크롤
last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(0.5)

    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

# 모든 썸네일 요소 가져오기
posts = driver.find_elements_by_css_selector('.post-list__post')

for post in posts:
    # 썸네일 클릭
    post.click()
    time.sleep(0.5)

    # 포스팅 정보 가져오기
    style_attr = driver.find_element_by_css_selector('.post-container__image').get_attribute('style')
    image_url = style_attr.split('"')[1]
    content = driver.find_element_by_css_selector('.content__text').text.strip()
    hashtags = driver.find_element_by_css_selector('.content__tag-cover').text.strip()
    like_count = driver.find_element_by_css_selector('.content__like-count').text.strip()
    comment_count = driver.find_element_by_css_selector('.content__comment-count').text.strip()
    ws.append([image_url, content, hashtags, like_count, comment_count])

    # 닫기 버튼 클릭
    driver.find_element_by_css_selector('.close-btn').click()
    time.sleep(0.5)

driver.quit()

wb.save('코스타그램.xlsx')

import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select

driver = webdriver.Chrome()
driver.implicitly_wait(3)

# 선거 웹사이트 접속
driver.get('http://info.nec.go.kr/main/showDocument.xhtml?electionId=0020200415&topMenuId=CP&secondMenuId=CPRI03')
time.sleep(1)

# '국회의원선거'탭 클릭 
driver.find_element_by_css_selector('#electionId2').click()

# 서울특별시 선택
cityCode_select = Select(driver.find_element_by_css_selector('#cityCode'))
cityCode_select.select_by_visible_text('서울특별시')

# 종로구 선택
sggCityCode_select = Select(driver.find_element_by_css_selector('#sggCityCode'))
sggCityCode_select.select_by_visible_text('종로구') 

# '검색'버튼 클릭
driver.find_element_by_css_selector('#spanSubmit').click()

# 필요한 국회의원 정보 가져오기

# 웹 드라이버 종료
driver.quit()

기본 기능

먼저 기본적인 기능들을 소개해 드릴게요.

웹 페이지 내비게이션

웹 페이지로 이동

driver.get('URL')

뒤로가기(이전 페이지로 이동)

driver.back()

앞으로가기(이후 페이지로 이동)

driver.forward()

새로고침

driver.refresh()

현재 URL 가져오기

driver.current_url

웹 브라우저 창 (window) 제어

*어떤 웹사이트들은 브라우저 창 크기에 따라 콘텐츠가 다르게 디스플레이되거나, 창 크기가 너무 작으면 아예 로딩이 안될 수 있습니다.

풀스크린

driver.fullscreen_window()

최대화

driver.maximize_window()

최소화

driver.minimize_window()

크기 조절

driver.set_window_size(800, 600) # 창 크기 (800, 600)으로 설정

스크린샷

driver.get_screenshot_as_file('image_name.png') # image_name.png라는 파일에 저장

더 알고 싶다면?

여기서 웹 드라이버의 모든 기능을 알아보세요!

웹 브라우저 창 여러 개 다루기

웹사이트에서 링크를 클릭하면 새로운 창에 웹사이트가 열리는 경우도 있습니다. Selenium으로 여러 창을 다루는 방법을 알려드릴게요.

아래 코드를 실행하면 쿠팡의 '커피' 검색 페이지로 이동합니다.

import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(3)

# 쿠팡 '커피' 검색 결과 페이지 접속
driver.get('https://www.coupang.com/np/search?component=&q=%EC%BB%A4%ED%94%BC&channel=user')
time.sleep(1)

 

#쿠팡'커피' 검색 결과 페이지의 모든 아이템을 클릭하고, 
#상세 페이지에서 필요한 정보를 모은 다음, 상세 페이지를 닫아줄 수 있습니다.

import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(3)

# 쿠팡 '커피' 검색 결과 페이지 접속
driver.get('https://www.coupang.com/np/search?component=&q=%EC%BB%A4%ED%94%BC&channel=user')
time.sleep(1)

products = driver.find_elements_by_css_selector('li.search-product')

# 검색 결과 페이지로 계속 돌아올 것이기 때문에 저장해 놓기
search_result_window = driver.current_window_handle

for product in products:
    # 아이템 클릭
    product.click()
    time.sleep(1)

    # 아이템 상세 페이지로 포커스 이동
    driver.switch_to.window(driver.window_handles[1])
    
    # 아이템 상세 페이지에서 필요한 정보 가져오기

    # 아이템 상세 페이지 닫기
    driver.close()

    # 검색 결과 페이지로 포커스 이동 - 그래야 아이템 (product)를 클릭할 수 있음
    driver.switch_to.window(search_result_window)

driver.quit()

 


iframe 스위칭

driver.switch_to.window() # 탭/창으로 이동
driver.switch_to.frame() # 프레임으로 이동

driver.switch_to.frame() 안에는

  • iframe 웹 요소
  • iframe의 id 속성값
  • iframe의 name 속성값 (name 속성값은 중복될 수 있습니다)
  • iframe 인덱스

 

다시 HTML 코드를 보면 보면 iframe이 총 두 개 있고, 첫 번째 iframe의 id와 name은 모두 'mainFrame'입니다. 웹 페이지의 모든 내용은 'mainFrame' 안에 있습니다. 'mainFrame' iframe으로 이동하려면 아래 코드 중 하나를 써 주면 됩니다.

# 웹 요소 파라미터로 사용
driver.switch_to.frame(driver.find_element_by_css_selector('#mainFrame')

# iframe의 id 또는 name 속성값 사용
driver.switch_to.frame('mainFrame')

# iframe 인덱스 사용
driver.switch_to.frame(0)

이제 iframe 안으로 이동했으니, iframe에 해당하는 HTML 코드를 접근할 수 있습니다.

예를 들어 블로그 글의 내용은 <div class="se-main-container"> 안에 있는데, 이 태그를 가져와서 .text를 붙이면, 글 내용을 가져올 수 있겠죠?

import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(3)

# 코드잇 네이버 블로그 접속
driver.get('https://blog.naver.com/codeitofficial')
time.sleep(1)

# 'mainFrame'으로 이동
driver.switch_to.frame('mainFrame')

# 블로그 글 내용 출력
print(driver.find_element_by_css_selector('div.se-main-container').text)

driver.quit()

 

driver.get('URL')

driver.switch_to.frame('A')
driver.switch_to.frame('C')

그럼 현재 iframe에서 밖으로 나오는 건 어떻게 할까요?

# 상위 iframe으로 이동
driver.switch_to.parent_frame()

# 웹 페이지 / 최상위 프레임 / 메인 프레임으로 이동 
driver.switch_to.default_content()

위 메소드들을 사용하면 됩니다. C에서 driver.switch_to.parent_frame()을 실행하면 A로 이동하고, driver.switch_to.default_content()를 실행하면 메인 프레임으로 이동하는 거죠.


Headless 모드 사용하기

그럼 headless Chrome (구글 크롬을 headless 모드로 사용하는 것)을 어떻게 사용하는지 알아보겠습니다.

먼저 selenium 라이브러리에서 Options를 임포트해 줍니다.

from selenium.webdriver.chrome.options import Options

그리고 옵션을 만들어 준 다음, headless 옵션을 설정해 주고, 브라우저 창 크기도 (1920, 1080)으로 설정해 줍니다.

options = Options()
options.add_argument("--headless")
options.add_argument("window-size=1920,1080")

브라우저 창 크기를 충분히 크게 설정해 주지 않으면 웹사이트의 내용이 잘 로딩되지 않고 (음악 웹사이트도 가로 길이가 너무 짧으면 내용이 보이지 않습니다) 스크롤이 원활하게 안 될 수도 있습니다.

그리고 크롬 드라이버를 생성할 때 이 옵션을 넣어줍니다.

driver = webdriver.Chrome("chromedriver 경로", options=options)
# 또는
driver = webdriver.Chrome(options=options) # 경로 설정이 필요 없는 경우 (chromedriver가 C:\Windows 또는 /usr/local/bin에 위치해 있는 경우)

한번 이번 챕터에서 실행해 봤던 Selenium 코드를 headless 모드로 실행해 보세요!