인공지능 데브코스 6기

[인공지능 데브코스 TIL] 0830 웹 스크래핑 기초 (3): Selenium

비쵸비쵸비 2023. 9. 7. 16:37
728x90

프로그래머스 인공지능 데브코스 2주차 강의를 정리한 글입니다.


동적 웹 페이지

  • 정적 웹 사이트: HTML 내용이 고정
  • 동적 웹 사이트: HTML 내용이 변함
    • ex) 피드를 새로고침할 때마다 새로운 글이 올라오는 것
    • 응답이 된 후 렌더링이 될 때 까지의 지연시간 존재
      → request 이후 바로 parsing을 하면 안될 수 있다

-데이터 처리가 완전히 되지 않은 상태에서 request하면 불완전한 데이터 받을 수 있다.
→ 임의로 시간을 지연한 후 데이터 처리가 끝난 후 정보를 가져오는 비동기처리가 필요하다.
→ 키보드 입력, 마우스 클릭 등을 할 수 있도록 웹 브라우저를 파이썬으로 조작하는 Selenium활용!

Selenium

  • Selenum: 웹 브라우저를 조작하는 라이브러리
  • WebDriver: 웹 브라우저를 제어할 수 있는 자동화 프레임워크
    • install webdriver-manager
#webdriver 모듈 불러오기
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("http://www.example.com")

webdriver 모듈에서 Chrome()객체를 생성하고, 특정 페이지를 열도록 요청을 보낸다.

with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver: 
    driver.get("http://www.example.com")
    print(driver.page_source) # html 문서 확인

자동으로 크롬 창이 닫히게 하기 위해 with as구문을 이용할 수 있다.

driver에서 특정 요소 추출하기

  • 요소 하나 찾기: .find_element(by, target)
    • by : 대상을 찾는 기준 : ID, TAG_NAME, CLASS_NAME, ...
    • target : 대상의 속성
  • 요소 여러개 찾기: .find_elements(by, target)
    • by : 대상을 찾는 기준 : ID, TAG_NAME, CLASS_NAME, ...
    • target : 대상의 속성
from selenium.webdriver.common.by import By

# p 태그에 해당하는 요소 하나 찾기
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
    driver.get("http://www.example.com")
    print(driver.find_element(By.TAG_NAME, "p").text)

# p 태그에 해당하는 요소 여러개를 찾기

with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
    driver.get("http://www.example.com")
    for element in driver.find_elements(By.TAG_NAME, "p"):
        print("Text:", element.text)

wait and call

implicit wait

  • 지정한 시간동안 기다림: ex) 5초간 기다려!
  • driver.implicitly_wait(10): 10초간 기다리되, 그 전에 렌더링이 끝나면 바로 실행

explicit wait

  • 특정 요소에 대한 제약을 통한 기다림: ex) 이 태그를 가져올 수 있을 때까지 기다려!
  • WebDriverWait()
    • until: 인자의 조건이 만족될 때까지
    • until_not() 인자의 조건이 만족되지 않을 때까지
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

# ID가 `target`인 요소가 존재할 때까지 기다린 후 다음 명령 진행
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "target")))

마우스 이벤트 처리하기

예를 들어 버튼을 찾은 후 이를 클릭하는 경우

1) find_element()를 통해 버튼 찾기
2) click으로 클릭 동작 전달
3) .perform()을 통해 동작

# id가 button인 버튼을 찾아 클릭하는 예시
button = driver.find_element(By.ID, "button")
ActionChains(driver).click(button).perform() # 액션들을 하나로 묶어줌

클릭 이외의 이벤트들 입력법은 >여기<

키보드 이벤트 처리하기

예를 들어 입력창(input태그)에 키보드 입력하는 경우

1) find_element()를 통해 버튼 찾기
2) send_keys_to_element를 통해 입력하고자 하는 내용을 전달
3) .perform()을 통해 동작

# id가 textInput인 요소에 "abc"를 입력하는 예제
text_input = driver.find_element(By.ID, "textInput")
ActionChains(driver).send_keys_to_element(text_input, "abc").perform()

그 외 키보드 이벤트들 입력법은 >여기<

실습: 자동 로그인하기

# 네이버에 요청 보내기
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://www.naver.com/")
driver.implicitly_wait(10)
time.sleep(1)

# 로그인 버튼 찾기
button = driver.find_element(By.CLASS_NAME, "MyView-module__naver_logo____Y442")
ActionChains(driver).click(button).perform()
time.sleep(1)

# 아이디 입력
id_input = driver.find_element(By.ID,"id")
ActionChains(driver).send_keys_to_element(id_input,"idhere").perform()
time.sleep(2)

# 패스워드 입력
pw_input = driver.find_element(By.ID,"pw")
ActionChains(driver).send_keys_to_element(pw_input,"passwordhere").perform()
time.sleep(1)

# 로그인 버튼 누르기
button = driver.find_element(By.ID, "log.login")
ActionChains(driver).click(button).perform()
time.sleep(1)
728x90