Selenium개발2024. 5. 13. 13:57
Table of Contents
모듈설치
%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()
'개발' 카테고리의 다른 글
Spring Boot에 Mysql Docker 연결 (0) | 2024.05.14 |
---|---|
BeautifulSoup (0) | 2024.05.13 |
Fork된 Repository 업데이트 하기 (0) | 2024.05.13 |
[Flask] SQLAlchemy ORM 활용법 (0) | 2024.05.13 |
Gtithub SHH Key 설정 (0) | 2024.05.13 |
@widesec :: 보안 기술로그
IT/보안