728x90
반응형

Selenium

  Selenium은 웹 크롤링, 스크랩핑을 위한 python에서 활용 가능한 package. 이후 구현할 여러 프로그램에서 자주 사용한 코드를 블럭 단위로 설명 예정이다. (일단 작성자는 python 경험은 조금 있으나, html, css는 전무...) 아래는 selenium document 링크다. 다른 package 들에 비해 사용하는 함수들의 몇 개 안되어 거의 참고하진 않았다.

 

Selenium Documentation — Selenium 4.21.0 documentation

selenium.webdriver.common.html5.application_cache

www.selenium.dev

Chrome 실행하기

import time, random
from selenium import webdriver

driverCourt = webdriver.Chrome()                                       # Chrome 실행
driverCourt.get('법원 경매 SITE URL') # 법원 경매 사이트 접속

  Chrome을 실행시켜주는 블럭이다. 여러 포스팅을 참고 시 과거 selenium은 chrome driver를 따로 설치했으나, 현재는 불필요하다. (Selenium을 다룬지 오래되지 않아, driver를 따로 설치하는 것이 예전에도 가능했으나 더 좋은 방식인지... 버전이 개선된건지는 불확실..)일반적으로 "driver"라는 변수로 Chrome을 실행하나,여러 페이지를 동시에 참고해야하는 경우, 세션을 분리해서 실행하는게 더 편하여, "driver" + "세션별 목적" 과 같은 이름으로 실행했다. driver.get("URL") 로 원하는 경로 접속가능 하다.

팝업 종료

main = driverCourt.window_handles           # 켜져있는 모든 페이지를 불러옴
for i, x in enumerate(main):                # 팝업 있으면 종료
    if i != 0:                              # 0번은 실행 페이지라 제외
        driverCourt.switch_to.window(x)     # 팝업 페이지 활성화
        driverCourt.close()                 # 종료
driverCourt.switch_to.window(main[0])       # 처음 페이지로 돌아옴

  함께 켜진 모든 팝업 페이지를 종료하는 블럭이다. 첫 페이지를 제외하고 모든 페이지를 순차적으로 활성화 한 뒤 종료한다. 모든 페이지를 종료한 후 다시 초기 페이지로 돌아와야한다. 또한 새 창, 새 탭 상관없이 현재 세션의 모든 페이지를 불러온다. 이는 단순히 종료를 구현한 블럭이며, 새 창으로 이동해야하는 경우에도 일부 수정하여 활용 가능하다.

Selenium Document 캡처
Document 캡처

728x90

Element 가져오기

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select

# 해당 특성을 가진 첫번째 요소 가져오기
page = driverCourt.find_element(By.CLASS_NAME, 'page2')

# 해당 특성을 가진 모든 요소를 list로 가져오기
children = page.find_elements(By.XPATH, '*')

# Dropdown list 항목을 설정하는 경우 Select 을 통해 설정 가능
purpose = Select(driverCourt.find_element(By.NAME, 'lclsUtilCd'))
purpose.select_by_value("0000802")

  find_element와 find_elements로 모든 요소를 가져온다. "s" 의 차이로 직관적으로 볼 수 있듯이 element는 해당 속성을 가지는 첫번째 요소를 반환한다. elements는 모든 요소를 리스트로 반환한다.

  table 처럼 구성된 페이지에서 parent를 element로 찾고, child를 elements로 불러올 수 있다. 처음 부터 필요한 요소들을 elements로도 불러올 수도 있다. Dropdown 에서 특정 값을 설정해야하는 경우도 있는데, Select클래스를 통해 제어 가능하다. "By.~~" 로 찾고자 하는 요소의 속성을 전달해야하며, By로 활용할 수 있는 속성은 아래 이미지 참고.

Selenium Document 캡처
Selenium Document

값 가져오기

print(driverCourt.find_element(By.CLASS_NAME, 'sp_address').text) # 요소의 텍스트 출력
print(driverCourt.current_url)                                    # 현재 url 출력

  "text" attribute를 통해 element의 text를 확인 가능하다.종종 누락된 값의 원인을 찾기 위해, url을 따로 저장해두는게 유용한 경우도 있었다. (법원 경매 사이트는 불가..)

이후 목표

  • 크롤링, 스크래핑 자체가 데이터 확보가 주 목적이기 때문에 반복이 많을 뿐 어려운 구조는 아니다. 프로그램 개발 중 좋은 블럭을 찾거나 구현하면 본 페이지에 추가 예정이다.
  • 내가 원하는 조건에 맞는 경매 물건 정보를 취합하는 프로그램 구현 예정 이다.
728x90
반응형

+ Recent posts