본문 바로가기
카테고리 없음

Selenium 네이버쇼핑 예제

by TIS_Ha 2023. 12. 4.
반응형

셀레니움(selenium)은 웹 애플리케이션 테스트를 위한 도구이다.

특히 웹 브라우저를 제어하여 웹페이지상에서 동작하는 테스트를 자동화 할 수 있다.

웹 상에서 정적인 페이지를 탐색하는데 사용하던 beautifulSoup 같은 패키지가 하지 못하는 동적인 크롤링을 지원한다.

 

동적으로 HTML을 만드는 경우

  • 스크롤하거나 클릭 시 데이터가 생성되는 경우
  • URL 주소가 변경되지 않았는데 데이터가 변하는 경우
  • 표, 테이블 형태의 데이터

셀레니움 동작 방식

웹 페이지를 헤더 등을 가지고 HTTP 프로토콜로 통신하는 리퀘스트(requests) 방식과 달리 webdriver API를 사용해 운영체제에 설치한 크롬(Chrome) 등 브라우저를 직접 띄워 HTML 문서를 가져오는 방식으로 제어한다.

따라서 로그인이 필요한 서비스나 어떤 것을 클릭해야 보이는 정보도 웹 페이지에서 가져올 수 있다.

웹 페이지를 만들고 정상적으로 동작하는지 디버깅 자동화용으로 사용하기도 한다.

 

셀레니움 동작 예제

네이버 -> 네이버쇼핑 이동-> 검색어 입력 ->네이버쇼핑 상품정보 가져오기

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time

# 브라우저 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)

# 불필요한 에러 메시지 없애기
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])

# 브라우저 생성
browser = webdriver.Chrome(options=chrome_options)

# 웹 사이트 열기
browser.get('https://www.naver.com')

# 쇼핑 메뉴 클릭하기
browser.find_element(By.CSS_SELECTOR, ".service_icon.type_shopping").click()
time.sleep(2)

# 새창을 바라보게 만들기
new_window = browser.window_handles[1]
browser.switch_to.window(new_window)

# 화면 최대화
browser.maximize_window()

# 검색창 클릭
search = browser.find_element(By.CSS_SELECTOR, "input._searchInput_search_text_3CUDs")
search.click()

# 검색어 입력
search.send_keys("아이폰14")
search.send_keys(Keys.ENTER)

# 스크롤 전 높이 / window.scrollY : 현재 스크롤된 높이를 알 수 있는 자바스크립트 명령어
before_h = browser.execute_script("return window.scrollY")

# 무한 스크롤
while True:
    # 맨 아래로 스크롤을 내린다. /send_keys : END 키 클릭
    browser.find_element(By.CSS_SELECTOR, "body").send_keys(Keys.END)

    # 스크롤 사이 페이지 로딩 시간
    time.sleep(1)

    # 스크롤 후 높이 after: 10 before: 0
    after_h = browser.execute_script("return window.scrollY")
    if after_h == before_h:
        break
    before_h = after_h

# 상품 정보 불러오기
items = browser.find_elements(By.CSS_SELECTOR, ".product_item__MDtDF")
for item in items:
    # 상품명 가져오기
    name = item.find_element(By.CSS_SELECTOR, ".product_title__Mmw2K").text
    # 상품가격 가져오기
    try:
        price = item.find_element(By.CSS_SELECTOR, ".price_num__S2p_v").text
    except:
        price = "판매중단"
    # 상품URL 가져오기
    link = item.find_element(By.CSS_SELECTOR, ".product_title__Mmw2K > a").get_attribute('href')
    print(name,price,link)

 

참고강의 URL : https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%AC%EB%A1%A4%EB%A7%81-%EA%B8%B0%EC%B4%88/dashboard

반응형

댓글