Selenium

geunyeongii·2022년 10월 9일
0
post-thumbnail

모듈설치

%pip install selenium
%pip install webdriver-manager

selenium으로부터 webdriver 모듈을 불러오기

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

객체 생성 및 요청

# http://www.example.com 으로 요청을 보낸다.
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://www.example.com")
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://www.example.com")
driver.page_source

with-as 구문

  • with-as 구문을 통해 주어진 명령이 끝나면 driver를 자동으로 종료하도록 설정.
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver :
    driver.get("https://www.example.com")
    print(driver.page_source)

Driver에서 특정 요소 추출하기

selenium은 받아온 응답으로부터 특정 요소를 추출할 수도 있다.
이미 브라우저를 활용하기 때문!

응답을 가지고 있는 driver/요소에 대해서 다음과 같은 메서드를 적용할 수 있다.

요소 하나 찾기

  • .find_element(by, target)
    • by : 대상을 찾는 기준 : ID, TAG_NAME, CLASS_NAME, ...
    • target : 대상의 속성

요소 여러개 찾기

  • .find_elements(by, target)
    • by : 대상을 찾는 기준 : ID, TAG_NAME, CLASS_NAME, ...
    • target : 대상의 속성
# p 태그에 해당하는 요소 하나를 찾아보자
from selenium.webdriver.common.by import By

with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver :
    driver.get("https://www.example.com")
    print(driver.find_element(By.TAG_NAME, "p").text)

Implicit / Explicit Wait

Selenium은 동적 웹 사이트에 대한 지원을 진행하기 위해 명시적 기다림(Explicit Wait)암묵적 기다림(Implicit Wait) 을 지원한다.

  • Explicit Wait: 다 로딩이 될 때까지 지정한 시간 동안 기다림 (e.g. 다 로딩이 될 때까지 5초동안 기다려!)
  • Implicit Wait: 특정 요소에 대한 제약을 통한 기다림 (e.g. 이 태그를 가져올 수 있을 때까지 기다려!)
# 스크래핑에 필요한 라이브러리를 불러와봅시다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

class name이 "btn-md"인 요소가 나올 때 까지 최대 100000초 기다리다가, 나오면 바로 객체를 go_pay변수에 담고 Click 버튼을 누르게 시킨다.

  • explicit wait을 쓰면 해당 객체가 나올 때 까지 기다리는게 가능하다.
go_pay = WebDriverWait(driver,100000).until(EC.presence_of_element_located((By.CLASS_NAME,"btn-md")))
ActionChains(driver).click(go_pay).perform()
time.sleep(1)

XPath?

class 이름이 조금 특이하다? (ex-15fjalsghue)
이는 스크래핑을 방지할 목적으로 랜덤하게 class 이름을 생성하기 때문.

이러한 경우에서 쓸 수 있는 방법이 여러가지가 있는데,
그 중 한가지 방법인, 위치를 활용한 방법이 있다.

XPath는 XML, HTML 문서 등의 요소의 위치를 경로로 표현하는 것을 의미한다.
마치 데스크탑/폴더1/폴더2/음악.mp3와 같이.

이를 적용해서 데이터를 온전히 가져와보자

day = WebDriverWait(driver,100000).until(EC.presence_of_element_located((By.XPATH,'//*[@id="branch-bid"]/section/ul/li[3]/a/div/div[1]')))

최대 100000초 동안 기다리다가 //*[@id="branch-bid"]/section/ul/li[3]/a/div/div[1] 위치가 발견될 떄 day변수에 객체를 반환한다.

버튼 클릭

from selenium.webdriver import ActionChains

button = driver.find_element(By.ID, "button")
ActionChains(driver).click(button).perform()

키보드 값 입력

  • name 속성 안에 cardNumber라는요소를 card변수에 담고
    두번째 줄의 send_keys_to_element의 매개변수로 받아 입력할 카드 번호 "123456789"를 입력한다.
card = driver.find_element(By.NAME,"cardNumber")
ActionChains(driver).send_keys_to_element(card,"123456789").perform()
profile
✏️세상의 모든 기록 ✏️

0개의 댓글