Selenium

밤비나·2023년 4월 5일
0

EDA

목록 보기
6/7

Selenium은 웹 브라우저 자동화 도구로, 웹 페이지를 열고 클릭, 입력 등의 작업을 자동으로 수행할 수 있다. 이를 통해 웹 페이지에서 데이터를 수집하거나, 웹 애플리케이션의 기능을 테스트하는 등의 작업을 할 수 있다.

Selenium의 주요 기능

  • 동적 웹 페이지 크롤링: 일반적인 웹 크롤러는 HTML 문서를 다운로드하고 파싱하여 데이터를 추출한다. 하지만, 동적으로 생성되는 웹 페이지의 경우에는 JavaScript 코드가 실행되어야만 페이지의 모든 내용을 볼 수 있다. Selenium은 웹 브라우저를 자동으로 제어하여 JavaScript 코드를 실행하고, 페이지의 모든 내용을 볼 수 있도록 한다.

  • 로그인 크롤링: 일부 웹 사이트는 로그인이 필요한 경우가 있다. 이 경우에는 로그인 정보를 입력하고 로그인 버튼을 클릭해야만 데이터를 추출할 수 있다. Selenium을 사용하면 웹 브라우저를 제어하여 로그인 정보를 입력하고 로그인 버튼을 클릭할 수 있다.

  • 캡차 우회: 일부 웹 사이트는 캡차를 사용하여 자동 크롤링을 방지한다. 하지만, Selenium을 사용하면 웹 브라우저를 제어하여 캡차를 우회할 수 있다.

  • 스크린샷: Selenium은 웹 페이지를 스크린샷으로 저장할 수 있다. 이를 활용하면 웹 페이지의 디자인이나 구조를 쉽게 파악할 수 있다.

  • 웹 페이지 테스트: Selenium을 사용하면 웹 페이지의 기능을 테스트할 수 있다. 예를 들어, 웹 페이지에서 제대로 작동하지 않는 링크를 찾아내거나, 웹 페이지의 폼 입력 기능을 자동으로 테스트할 수 있다. 이를 통해 크롤링하려는 웹 페이지가 제대로 작동하는지 확인할 수 있다.


셀레니움을 사용하기 위해서는 구글 크롬 드라이버를 다운 받아 경로에 저장해야 한다.

셀레니움 설치

conda install selenium
from selenium import webdriver

driver = webdriver.Chrome('./driver/chromedriver.exe')
driver.get('https://chimhaha.net/')
  • 스크롤 가능한 높이 가져오기
last_height = driver.execute_script('return document.body.scrollHeight')
# 화면 최대 크기 설정
driver.maximize_window()

# 화면 최소 크기 설정
driver.minimize_window()

# 화면 크기 설정
driver.set_window_size(600,600)

# 새로 고침
driver.refresh()

# 뒤로 가기
driver.back()

# 앞으로 가기
driver.forward()

By

Selenium에서 By는 WebElement를 찾기 위한 다양한 방법을 제공하는 클래스이다. WebElement는 HTML 페이지의 요소를 나타내는 객체다.

By.ID : id 속성을 사용하여 요소를 찾는다.
By.NAME : name 속성을 사용하여 요소를 찾는다.
By.CLASS_NAME : class 속성을 사용하여 요소를 찾는다.
By.TAG_NAME : 태그 이름을 사용하여 요소를 찾는다.
By.LINK_TEXT : 링크 텍스트를 사용하여 요소를 찾는다.
By.PARTIAL_LINK_TEXT : 링크 텍스트의 부분 문자열을 사용하여 요소를 찾는다.
By.XPATH : XPath 표현식을 사용하여 요소를 찾는다.
By.CSS_SELECTOR : CSS 선택자를 사용하여 요소를 찾는다.

from selenium.webdriver.common.by import By

first_content = driver.find_element(By.CSS_SELECTOR, '#nav > div.navWrap > nav > ul > li:nth-child(10) > div > a')
first_content.click()
# 새로운 탭 생성
driver.execute_script('window.open("https://chimhaha.net/notice")')

# 탭 이동
driver.switch_to.window(driver.window_handles[0])

# 탭 닫기
driver.close()

driver.quit()

ActionChains

마우스나 키보드와 같은 작업을 자동화하는 데 사용되는 클래스이다. 이를 사용하면 마우스 클릭, 드래그 앤 드롭, 키보드 입력 등 다양한 작업을 자동으로 수행할 수 있다.

  • 화면 스크롤, 스크린샷
# 스크롤 가능한 높이(길이)
driver.execute_script('return document.body.scrollHeight')

# 화면 스크롤 하단 이동
driver.execute_script('window.scrollTo(0,document.body.scrollHeight);')

# 현재 보이는 화면 스크린샷 저장
driver.save_screenshot('./last_height.png')

# 화면 스크롤 상단 이동
driver.execute_script('window.scrollTo(0,0);')

# 특정 태그 지점까지 스크롤 이동
from selenium.webdriver import ActionChains

some_tag = driver.find_element(By.CSS_SELECTOR,'#content > div.cover-list > div > ul > li:nth-child(2) > a > span.title')
action = ActionChains(driver)
action.move_to_element(some_tag).perform()

# 특정 태그 지점까지 스크롤 이동
from selenium.webdriver import ActionChains

some_tag = driver.find_element(By.CSS_SELECTOR,'#boardList > a:nth-child(14)')
action = ActionChains(driver)
action.move_to_element(some_tag).perform()
  • 검색어 입력
driver = webdriver.Chrome('./driver/chromedriver.exe')
driver.get('https://chimhaha.net/')

keyword = driver.find_element(By.CSS_SELECTOR, '#list > div.searchAndWrite > div:nth-child(2) > form > div > input[type=text]')
keyword.send_keys('궤도')

search_btn = driver.find_element(By.CSS_SELECTOR, '#list > div.searchAndWrite > div:nth-child(2) > form > div > button')
search_btn.click()

keyword = driver.find_element(By.CSS_SELECTOR, '#list > div.searchAndWrite > div:nth-child(2) > form > div > input[type=text]')
keyword.clear() # 검색어 지우기
keyword.send_keys('4월')

search_btn = driver.find_element(By.CSS_SELECTOR, '#list > div.searchAndWrite > div:nth-child(2) > form > div > button')
search_btn.click()

Selenium + beautifulSoup

driver.page_source는 현재 브라우저의 페이지 소스를 문자열로 반환하는 메서드이다. 이 메서드는 현재 페이지의 HTML 소스 코드를 가져올 때 유용하다.

Selenium과 BeautifulSoup을 함께 사용하면 더욱 강력한 크롤링 및 웹 스크래핑을 할 수 있다.

Selenium은 동적으로 로드되는 웹 페이지를 쉽게 스크래핑할 수 있다. 그러나 Selenium만 사용하면 페이지의 특정 부분을 추출하거나 HTML 소스를 다루기 어려울 수 있다. 이 때 BeautifulSoup을 사용하면 HTML 소스를 쉽게 파싱하여 페이지의 특정 요소를 추출할 수 있다.

from bs4 import BeautifulSoup

req = driver.page_source
soup = BeautifulSoup(req, 'html.parser')

soup.select('.item')
contents = soup.select('.item')
len(contents)

contents[2]
profile
씨앗 데이터 분석가.

0개의 댓글