본문 바로가기
공부 & 프로젝트/파이썬

[파이썬] 웹크래핑 기초 5-3: Selenium 활용 - 네이버 항공권

by donnanoa82 2025. 10. 20.

오늘도 셀레니움 공부를 위해 화띵 ..!

나도코딩님의 영상보면서 활용편 공부 (25-26 chapter. selenium 활용 1-1, 1-2 (네이버 항공권)

https://www.youtube.com/watch?v=yQ20jZwDjTE


네이버 항공권

목적: 특정 일자, 장소에 맞춰 나오는 결과들을 가지고 웹스크래핑 

예시: 아래 이미지와 같이 노란 음영 부분의 결과를 웹스크래핑 

 

셀레니움 세팅

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

options = Options()
options.add_argument("--start-maximized")
options.add_experimental_option("detach", True)

 

1. 네이버 이동

여기까진 이제 익숙해졌을 거라고 생각함

근데 이벤트 뜨는 거 삭제 코드를 짠 이유는 네이버 항공권 사이트 들어가면 이벤트 뜨는거에 막혀서 다음 코드로 진행이 안되기 때문 ... ! 

# 1. 네이버 이동
browser = webdriver.Chrome(options= options)
url = "https://flight.naver.com/"
browser.get(url)

# 이벤트 뜨는 거 삭제 (7일간 보지 않기 클릭)
browser.find_element(By.XPATH, '//*[@id="layer"]/button[1]').click()

 

2. 가는 날, 오는 날 선택

= 가는 날 선택하여 원하는 날짜 (가는 날, 오는 날) 선택

# 2. 가는날 선택
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div/div[2]/div[2]/button[1]').click()

# # 이번 달 27일, 28일 선택 (10/27, 10/28)
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[8]/div[2]/div[1]/div[2]/div/div/div[2]/table/tbody/tr[5]/td[2]/button/b').click()
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[8]/div[2]/div[1]/div[2]/div/div/div[2]/table/tbody/tr[5]/td[3]/button/b').click()

 

이미 기초와 심화편에서 알려줬으나, 다시 반복하자면 ; 

  • ctrl + shift + I 클릭 (또는 f12) > 개발자 도구 > 노란 음영 아이콘 클릭 > 원하는 부분 ("가는날") 부분 클릭 > 개발자 도구에 있는 파란색 박스 확인 > (Xpath 사용 시) 우클릭 > copy > copy xpath 

 

 

이번 달 27일,  다음 달 27일 클릭 

'나도코딩'님 영상에서는 문제 없이 잘 돌아갔는데, 내가 봤을 땐 사이트의 구성이 달라져서 문제가 생기는 듯 함

# 이번 달 27일, 다음 달 27일 선택 (10/27, 11/27)
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[8]/div[2]/div[1]/div[2]/div/div/div[2]/table/tbody/tr[5]/td[2]/button/b').click()
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[8]/div[2]/div[1]/div[2]/div/div/div[3]/table/tbody/tr[3]/td[1]/button').click()

 

불가능. . . 화면에서 다음 달 27일이 나오지 않아서 그런 듯 함. 아직 스크롤 내리는 건 배우지 않았고, chat gpt로 스크롤 내리는 코드 달라고 해서 해봤는데 작동이 안됨 . .  

 

왜 스크롤 때문이라고 생각했냐면, 아래 이미지와 같이 화면이 나오고 저 화면의 끝 일자인 '8'일을 선택 코드 넣을 땐 잘 작동됨

근데 '9'일부터 작동이 안됨 

스크롤 내리는 것 제대로 배우고 나서 다시 이 내용은 수정할 예정. 

이 사진에서 보면 딱 8일까지만 보이고 아래는 스크롤을 내려야만 확인 가능

 

3. 제주도 선택 & 항공권 검색 클릭

 

중간에 time.sleep(2)를 해준 이유 :

  • 너무 빠르게 클릭 되면서 로딩 속도에 맞지 않아서 제주도 선택과 항공권 검색 클릭 부분 실행되지 XX
  • => 대기 시간을 부여해줌으로써 로딩된 후, 클릭될 수 있도록 시간 부여 
# 3. 제주도 선택 & 항공권 검색 클릭
# 목적지 선택
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div/div[2]/div[1]/button[2]/b').click()
time.sleep(2)
# 제주도 선택
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[8]/div[2]/div[2]/div[2]/ul[1]/li[1]/button').click()
time.sleep(2)
# 항공권 검색 클릭
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div/div[2]/button/span').click()

 

4. 항공권 정보 수집

위에서도 time.sleep을 주었는데, 다른 방법도 공유 :

1. time.sleep(원하는 초) : 원하는 초 만큼 대기 시간 제공

# 항공권 검색 클릭
browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div/div[2]/button/span').click()
time.sleep(5)

# 결과 출력
# 첫 번째
elm= browser.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[4]/div/div[2]/div[2]/div[1]')
print(elm.text)

2. 아래 코드 확인

time.sleep의 경우, 시간 낭비 가능성 있음

  예) 원하는 초 만큼 제공 하기 때문에 만약 로딩이 1초 걸렸으나,time.sleep(10)으로 한 경우 9초의 시간 낭비 

=> 2번의 방법 추천

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

try :   # 10 초 초과 시, error 발생. 따라서 error가 나면 바로 종료시키기 위해 try, finally 사용
    elm = WebDriverWait(browser, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="__next"]/div/main/div[4]/div/div[2]/div[2]/div[1]'))  #browser에 대해 xpath값에 해당하는 element가 위치할 때 까지 최대 10초 동안 기다림 
)
    # 성공했을 때 동작 수행
####출력 방법 1
    print(elm[0].text) 
####출력 방법 2
    for e in elm:
        print(e.text)
finally :
    browser.quit()

 

이미 적혀있지만 다시 설명하자면, 

  • WebDriverWait(browser, 10) : 브라우저에 대해 10초 동안 기다림 (최대 10초)
  • .until(EC.presence_of_all_elements_located() : elements 가 위치할 때 까지 기다림 
  • (By.XPATH, '원하는 부분의 xpath') : 해당 xpath 값
  • 즉, browser에 대해 xpath값에 해당하는 element가 위치할 때 까지 최대 10초 동안 기다림 
  • 주의할 점 ! By.XPATH값 넣을 때, 괄호 2번 감싸기

10초 초과하게 되면 error 발생. error 없애기 위해 보통 try를 사용하고, error 나면 바로 종료시키기 위해 finally 사용

 

출력 부분 2가지 방법:

print(elm.text) 로 했더니, 진행 안됨.

  •  print(elm[0].text)
    첫 번째 텍스트 출력을 의미하는 [0]을 추가 입력
  • for e in elm:
            print(e.text)
    elm에 나온 값을 for를 통해 모두 출력

터미널에 나온 결과값