selenium 기초

yeoni·2023년 5월 10일
0

1. 셀레늄

Selenium Documentation

설치 코드

  • conda install selenium (윈도우, mac intel)
  • pip install selenium

Beautiful Soup 만으로 해결할 수 없는 것

  • 접근할 웹 주소를 알 수 없을 때
  • 자바스크립트를 사용하는 웹페이지의 경우(동적페이지)
  • 웹 브라우저로 접근하지 않으면 안될 때

Selenium:

  • 웹 브라우저를 원격 조작하는 도구
  • 자동으로 URL을 열고 클릭 등이 가능
  • 스크롤, 문자의 입력, 화면 캡처 등등

2. selenium webdriver 사용하기

  • 윈도우에서는 'chromedriver.exe'처럼 'exe'를 붙여함
  • 작업 다하면 'quit()'로 꼭 닫기 → 자원이 계속 사용되는 것 방지
  • 'https://' or 'http://' 넣지 않으면 안 나오는 경우 존재
  • 화면 크기 설정: maximize_window, minimize_window, set_window_size()
  • 화면 내 이동, 탭 이동, 클릭, 닫기
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome(executable_path='../driver/chromedriver') # executable_path 생략 가능
driver.get('https://pinkwink.kr')

driver.quit() # 화면 끄기

# 보이는 화면의 태그를 가져와야 에러가 뜨지 않는다
# 화면 최대 크기 설정
driver.maximize_window()

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

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

# 새로고침
driver.refresh()

# 뒤로 가기
driver.back()

# 앞으로 가기
driver.forward()

# 클릭
frist_content = driver.find_element(By.CSS_SELECTOR, '#content > div.cover-masonry > div > ul > li:nth-child(1)')
frist_content.click()

# 새로운 탭 생성
# 자바 명령
driver.execute_script('window.open("http://naver.com")')

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

# 닫기
driver.close() # 현재 탭 종료
driver.quit() # 전체 종료

find_element, find_elements

  • find_element: 해당 객체 하나 찾기
  • find_elements: 해당 객체 모두 찾기
from selenium import webdriver
from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, '//button[text()="Some text"]') # 하나 객체
driver.find_elements(By.XPATH, '//button') # 여러 객체

# find_element, find_elements 함수
'''
ID = "id"
NAME = "name"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

find_element(By.ID, "id")
find_element(By.NAME, "name")
find_element(By.XPATH, "xpath")
find_element(By.LINK_TEXT, "link text")
find_element(By.PARTIAL_LINK_TEXT, "partial link text")
find_element(By.TAG_NAME, "tag name")
find_element(By.CLASS_NAME, "class name")
find_element(By.CSS_SELECTOR, "css selector")
'''

3. 화면 스크롤

from selenium import webdriver
driver = webdriver.Chrome(executable_path='../driver/chromedriver')
driver.get('http://pinkwink.kr')

# 스크롤 가능한 높이(길이)
# 자바스크립트 코드 실행
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(1)')
action = ActionChains(driver) #제어
action.move_to_element(some_tag).perform() # .perform() -> 수행

driver.quit()

4. 검색어 입력

  • CSS_SELECTOR
  • XPATH → 이름 쌍따옴표를 가져오기 때문에 작은 땨옴표를 사용하기
    • '//': 최상위
    • '*': 자손 태그
    • '/': 자식 태그
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome('../driver/chromedriver')
driver.get('https://www.naver.com')

#CSS_SELECTOR
# 실행하고 keyword에 값을 넣으면 중첩 -> 'clear()'로 방지
keyword = driver.find_element(By.CSS_SELECTOR, '#query')
keyword.clear()
keyword.send_keys('파이썬')

# 실행하고 다시 넣으려고 하는데 error -> 이때는 태그가 맞지 않아서
search_btn = driver.find_element(By.CSS_SELECTOR, '#search_btn')
search_btn.click()

#XPATH
driver.find_element(By.XPATH, '//*[@id="query"]').send_keys('xpath')
driver.find_element(By.XPATH, '//*[@id="search_btn"]').click()
driver.quit()
---------------------------------------------------------
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome('../driver/chromedriver')
driver.get('https://pinkwink.kr')

# 1. 돋보기 버튼 선택
from selenium.webdriver import ActionChains
search_tag = driver.find_element(By.CSS_SELECTOR, '.search')
action = ActionChains(driver)
action.click(search_tag).perform()

# 2. 검색어 입력
driver.find_element(By.CSS_SELECTOR, '#header > div.search.on > input[type=text]').send_keys('딥러닝')

# 3. 버튼 클릭
driver.find_element(By.CSS_SELECTOR, '#header > div.search.on > button').click()

5. selenium + BeautifulSoup

  • html 코드 가져오기
# 현재 화면의 html 코드 가져오기
from bs4 import BeautifulSoup
req = driver.page_source
soup = BeautifulSoup(req, 'html.parser')

soup.select('.post-item')

contents = soup.select('.post-item')
``
profile
데이터 사이언스 / just do it

0개의 댓글