반응형

[셀레니움 응용] 네이버 항공권 검색 2편 달력 선택

파이썬 셀레니움을 사용하여 네이버 항공권 정보를 얻어오는 방법을 소개합니다.




목차:




1. 달력 Xpath 분석

유동적으로 날짜(월, 일)를 선택하기 위해 달력의 Html, Xpath를 분석합니다.
선택 값에 따라 변하는 규칙(패턴)을 파악하여 날짜를 선택할 수 있도록 합니다.


  1. 달력 1주 차의 요일 Xpath를 분석합니다.
     '//*[@id="__next"]/div/div[1]/div[11]/div[2]/div[1]/div[2]/div/div[2]/table/tbody/tr[1]/td[ 1 ]/button/b' #일
     '//*[@id="__next"]/div/div[1]/div[11]/div[2]/div[1]/div[2]/div/div[2]/table/tbody/tr[1]/td[ 2 ]/button/b' #월
     '//*[@id="__next"]/div/div[1]/div[11]/div[2]/div[1]/div[2]/div/div[2]/table/tbody/tr[1]/td[ 3 ]/button/b' #화
     '//*[@id="__next"]/div/div[1]/div[11]/div[2]/div[1]/div[2]/div/div[2]/table/tbody/tr[1]/td[ 4 ]/button/b' #수
     '//*[@id="__next"]/div/div[1]/div[11]/div[2]/div[1]/div[2]/div/div[2]/table/tbody/tr[1]/td[ 5 ]/button/b' #목
     '//*[@id="__next"]/div/div[1]/div[11]/div[2]/div[1]/div[2]/div/div[2]/table/tbody/tr[1]/td[ 6 ]/button/b' #금
     '//*[@id="__next"]/div/div[1]/div[11]/div[2]/div[1]/div[2]/div/div[2]/table/tbody/tr[1]/td[ 7 ]/button/b' #토
    • td[ ] 태그의 숫자가 일(1), 월(2), 화(3), 수(4), 목(5), 금(6), 토(7)의 값을 갖는 것을 확인할 수 있습니다.

  1. 달력의 n주 차의 Xpath를 분석합니다.
     '//*[@id="__next"]/div/div[1]/div[11]/div[2]/div[1]/div[2]/div/div[2]/table/tbody/tr[ 1 ]/td[1]/button/i' #1주차
     '//*[@id="__next"]/div/div[1]/div[11]/div[2]/div[1]/div[2]/div/div[2]/table/tbody/tr[ 2 ]/td[1]/button/i' #2주차
     '//*[@id="__next"]/div/div[1]/div[11]/div[2]/div[1]/div[2]/div/div[2]/table/tbody/tr[ 3 ]/td[1]/button/i' #3주차
     '//*[@id="__next"]/div/div[1]/div[11]/div[2]/div[1]/div[2]/div/div[2]/table/tbody/tr[ 4 ]/td[1]/button/i' #4주차
    • tr[ ] 태그의 숫자가 N 주차(N)의 값을 갖는 것을 확인할 수 있습니다.

  1. 달력의 월(month) Xpath를 분석합니다.
     '//*[@id="__next"]/div/div[1]/div[11]/div[2]/div[1]/div[2]/div/div[ 2 ]/table/tbody/tr[1]/td[1]/button/i' # 이번 달 작성일 기준 11월
     '//*[@id="__next"]/div/div[1]/div[11]/div[2]/div[1]/div[2]/div/div[ 3 ]/table/tbody/tr[1]/td[1]/button/i' # 다음 달 작성일 기준 12월
     '//*[@id="__next"]/div/div[1]/div[11]/div[2]/div[1]/div[2]/div/div[ 4 ]/table/tbody/tr[1]/td[1]/button/i' # 2달 후 작성일 기준 1월
    • div/div[ ] 태그의 숫자가 이번 달(2)부터 다음 달(3)의 순서로 값을 갖는 것을 확인할 수 있습니다.

달력 선택의 Xpath를 분석한 결과 /div[Month]/table/tbody/tr[Week]/td[Day] 임을 알 수 있습니다.




2. 날짜 선택하기

정해진 출발, 돌아올 날짜를 달력에서 선택

  • 검색 정확도를 높이기 위해 공항명이 아닌 공항코드 (IATA 3 Letter Airport Code)로 검색
  • 예를들어 "인천" 이 아닌 "ICN" 으로 검색
  • 다른 설명은 주석 참고
# 이 프로젝트에서는 왕복 항공권을 기준으로 작성되었습니다.
# selenium Ver : 3.14.1
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# 웹드라이버 열기 (네이버 항공권)
driver = webdriver.Chrome()
driver.get("https://flight.naver.com/")
time.sleep(1)

# 입력칸에 출발지, 목적지를 입력하고 목록 중 첫번 째를 선택하는 함수
def airway(parts):
    for part in parts:
        # Xpath를 분석 > 출발지:button[1], 도착지:button[2]인 것을 반복문을 통해 간소화 list Index : 0, 1
        index = parts.index(part)
        driver.find_element_by_xpath(f'//*[@id="__next"]/div/div[1]/div[4]/div/div/div[2]/div[1]/button[{int(index)+1}]').click()
        driver.find_element_by_xpath('//*[@id="__next"]/div/div[1]/div[9]/div[1]/div/input').send_keys(part)
        time.sleep(0.1)
        driver.find_element_by_xpath('//*[@id="__next"]/div/div[1]/div[9]/div[2]/section/div').click()
        time.sleep(0.5)
# 가는날, 오는날 선택하는 함수
def select_dates(month, week, day):
    print(f"week 번호 : {week}   요일 번호 : {day}")
    driver.find_element_by_xpath(f'//*[@id="__next"]/div/div[1]/div[9]/div[2]/div[1]/div[2]/div/div[{month}]/table/tbody/tr[{week}]/td[{day}]/button/b').click()
    time.sleep(0.1)

# 출발, 도착지 [김포, 제주]
ports = {'김포':'GMP','인천':'ICN','제주':'CJU','김해':'PUS','대구':'TAE'}
points = [ports['김포'],ports['제주']]
print(points)
airway(points)

# 가는 날 클릭
driver.find_element_by_xpath('//*[@id="__next"]/div/div[1]/div[4]/div/div/div[2]/div[2]/button[1]').click()
time.sleep(1)

# 이번 달
month = 2
# 3주 차 // 2주 차 = 2 // 현재에 맞게 수정하세요.
week = 3
# 요일 선택
day_go = '토요일'
# 체류 기간
day_n_nights = 4

# 검색 할 요일 선택
days = ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일']
day = days.index(day_go)+1      # 선택한 요일
select_dates(month, week, day)  # 출발날짜 : select_dates 함수에 월, 주차, 요일 입력 후 클릭
day = day+day_n_nights-1        # 도착날짜 계산 > +체류 기간
# 체류기간에 따라 바뀌는 주(week) 계산
if day > 7:
    week+=day//7
    day = day%7
try:
    # 만약 체류 기간이 2개의 달(11월~12월)에 걸쳐있을 경우
    select_dates(month, week, day)
except:
    if week >= 4:
        month += 1
        week = 1
        select_dates(month, week, day)


관련글 모아보기



python3.9 | camp-lee@naver.com


python3.9 | camp-lee@naver.com


python3.9 | camp-lee@naver.com

반응형

+ Recent posts