빅데이터/Selenium

Selenium 기초 및 활용 하기 01 - 설치 및 기본 기능

H-V 2022. 1. 7. 14:37

유투버 '이수안컴퓨터연구소' 강의 참조

 

 

01 셀레니엄 이란?

  • 최초의 셀레니엄의 목적은 웹사이트 테스트를 위해서 만들어졌다.
  • 셀레니엄을 이용하면 마치 사람이 사용하는것처럼 웹사이트를 열고 원하는 사이트에 들어가서 검색을 하는 등 자동화 테스트용으로 만들어졌다.
  • 셀레니엄은 4가지 종류가 있다 IDE/RC/WebDriver/Grid
  • 현재는 'Selenium WebDriver' 라는 프로그램을 통해 운영체제 및 프로그래밍언어등에 사용이 가능하고 이를 통해 업무 자동화에 사용 된다. 
  • 크롬을 이용해서 셀레니엄을 사용하려면 크롬이 가지고있는 내부 드라이버에 접근을 해야하는데 이를 'Chronium' 이라 불리고 이를 기반으로해서 만들어 졌다. 

 

 

02 셀레니엄 및 크롬 관련 드라이브 설치 

  • 가장 간단한 방법은 VS가 깔려있으면 터미널로 깔면 된다
  • 테스트
    이렇게 했을때 오류가 없으면 설치 성공
  • 크롬으로 셀레니엄을 이용해 웹스크래핑을 하려면 크롬용 웹 드라이버가 필요하다. 
    다음 링크를 확인해서 설치를 해주자 (https://chancoding.tistory.com/136)
  • 크롬으로 셀레니엄을 사용하려면 반드시 크롬드라이버가 사용하고자 하는 폴더에 있어야 가능하다. 

크롬드라이버 버전이 꼭 일치해야 오류가 없다!

 

 

▶ 기본 세팅

import selenium
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

#웹브라우저를 띄우지 않고 진행하기 위한 설정
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

#이렇게 객체를 생성하여 위에서 세팅된 값을 넣어주면 된다!
wd = webdriver.Chrome('chromedriver', options=chrome_options)
  • 셀레니엄도 뷰티풀숩처럼 일단 스크래핑 하고자 하는 사이트를 들고 와야 한다
wd.get("http://suanlab.com/")

 

 

 

01 셀레니엄 간단 기능 보기

  • 스크린샷
    wd.get_screenshot_as_file("suanlab.png")​

 

  • 간단 스크래핑

이 사진에 나와있는 <label> 태그 들고 와보자

for label in wd.find_elements_by_tag_name('label'):
    print(label.text)#객체의 text값을 들고 와야 한다

  • 뷰티풀숩과 매우 흡사하게 접근 한다고 보면 된다. 'label' 태그가 계속 여러번 반복되니 그것을 찾아오고 포문을 돌려서 하나씩 뽑는 형태. 하나의 태그에 접근할때는 단순 'find_element'

 

▶ 뷰티풀숩과 마찬가지로 CSS 셀렉터로도 접근이 가능 하다. 

#wrapper > section > div > div > div:nth-child(1) > div > div:nth-child(1) > label

-> 구조 선택자를 없애야 모든 label을 인덱싱 관계없이 들고올 수 있다.
'#wrapper > section > div > div > div > div > div > label'

for label in wd.find_elements_by_css_selector('#wrapper > section > div > div > div > div > div > label'):
    print(label.text)

 

▶ 셀레니움에서는 CSS 선택자 말고 XPATH 선택자도 엄청 많이 쓰인다.

//*[@id="wrapper"]/section/div/div/div[1]/div/div[1]/label

# 똑같이 특정 인덱스를 없애줘야 포문을 오류없이 돌릴 수 있다.

//*[@id="wrapper"]/section/div/div/div/div/div/label

for label in wd.find_elements_by_xpath('//*[@id="wrapper"]/section/div/div/div/div/div/label'):
    print(label.text)

 

 

  • 클래스로 접근이 안될때에는 CSS 선택자나 XPATH 선택자로 접근해서 다시 클래스로 가져 올 수 있다.
labels = wd.find_element_by_css_selector('#wrapper > section > div > div > div > div')

for label in labels.find_elements_by_class_name('toggle'):
    print(label.text)

→ 최상위 <div> 클래스를 들고 올때에는 하나밖에 없으니 .find_element 단수로 찾아야 한다

 

 

  • 위와 완전히 똑같은 결과를 내지만 코드가 약간 다른 방식이 있다.
from selenium.webdriver.common.by import By

for label in wd.find_elements(By.TAG_NAME, 'label):
	print(label.text)
    
for label in wd.find_elements(By.CSS_SELECTOR, '#wrapper > section > div > div > div > div > div > label'):
	print(label.text)