[데이터 엔지니어링 데브코스] TIL 9일차 - 파이썬으로 웹다루기(4)

박단이·2023년 10월 26일
0

데브코스 TIL

목록 보기
8/56

오늘 공부한 내용🤓

  1. Selenium을 이용한 웹 브라우저 조작
    • 필요한 라이브러리 : Selenium, webdriver-manager
    • Selenium을 통해 웹 브라우저를 이동할 수 있고 마우스를 이용한 클릭, 스크롤, 키보드를 통한 입력 등을 python으로 자동화할 수 있다.
      이때, 빠르게 클릭하거나 입력한다면 렌더링 도중에 스크래핑할 수도 있고 막힐 수도 있기 때문에 time.sleep()을 사용한다.
    • 페이지의 구성이 끝나기 전에, 즉 렌더링이 실행되는 도중에 스크래핑을 진행하는 경우 제대로된 데이터를 받아올 수 없으므로 대기(wait)를 명령한다.
      • Implicit Wait : 지정한 시간동안 기다린다.
      • Explicit Wait : 특정 요소에 대한 제약을 통해 기다린다.
  2. python 코드
# 필요한 라이브러리
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# driver 객체 생성
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

# 페이지 열기
driver.get("원하는 url")

# 페이지 소스 확인
driver.page_source

# with ~ as .. 구문을 통한 driver 구동
## webdriver를 실행한 후 자동으로 꺼지게 하기 위함
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
    driver.get("http://www.example.com")
    print(driver.page_source)
    ...
    
# 요소 찾기
from selenium.webdriver.common.by import By
## By에는 TAG_NAME, ID, CLASS_NAME 등 여러가지가 있다.

## 요소 1개 찾기
driver.find_element(By.TAG_NAME, "p")

## 요소 모두 찾기
driver.find_elements(By.TAG_NAME, "p")

### find_element와 find_elements의 반환 값은 selenium 객체이며 
### text등을 사용하여 값을 확인할 수 있다.
### find_elements는 모든 값을 순서대로 list에 담아서 반환한다.


# 대기(Wait)
## Implicit Wait
driver.implicitly_wait(10)  # 실행될 때까지 10초 기다린다.
### 무작정 10초 모두 기다리는 것이 아니라 
### 실행이 완료될 때까지 기다리는 최대 시간이 10초인 것이다.
### 10초 이전에 완료된다면 바로 다음 단계로 넘어간다.

## Explicit Wait
### until(): 인자의 조건이 만족될 때까지  
### until_not() 인자의 조건이 만족되지 않을 때까지  
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

### 10초가 될 때까지 ID가 'id'인 요소가 나타나면 값을 반환한다.
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'id')))


# 클릭 이벤트 발생시키기
## 1. 대상 요소를 찾는다.
## 2. 실행하고자 하는 내용을 ActionChain을 통해 전달한다.
## 3. perform()을 통해 실행한다.
from selenium.webdriver import ActionChains

button = driver.find_element(By.id, 'button')
ActionChains(driver).click(button).perform()


# 입력 이벤트 발생시키기
## 1. 대상 요소를 찾는다.
## 2. 입력하고자 하는 내용을 ActionChain을 통해 전달한다.
## 3. perform()을 통해 실행한다.
from selenium.webdriver import ActionChains

id_input = driver.find_element(By.ID, 'id')
ActionChains(driver).send_keys_to_element(id_input, 'id').perform()

궁금한 내용 / 어려운 내용❓

  • selenium과 함께 BeautifulSoup을 사용하면 더 유연하게 사용할 수 있을 것 같다. 같이 쓰는 실습을 해보고 싶다.

느낀 점😊

지금까지 대기하는건 time.sleep()만 사용해왔었는데 implicitly_wait()WebDriverWait을 사용하면 조금더 유용할 것이라는 생각이 들었다. 아직은 간단한 코드라고 느껴서 그런지 너무 재미있다!!!

profile
데이터 엔지니어를 꿈꾸는 주니어 입니다!

0개의 댓글