반응형
[셀레니움 응용] 네이버 항공권 검색 2편 달력 선택
파이썬 셀레니움을 사용하여 네이버 항공권 정보를 얻어오는 방법을 소개합니다.
목차:
1. 달력 Xpath 분석
유동적으로 날짜(월, 일)를 선택하기 위해 달력의 Html, Xpath를 분석합니다.
선택 값에 따라 변하는 규칙(패턴)을 파악하여 날짜를 선택할 수 있도록 합니다.
- 달력 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)의 값을 갖는 것을 확인할 수 있습니다.
- 달력의 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)의 값을 갖는 것을 확인할 수 있습니다.
- 달력의 월(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
반응형
'셀레니움 > 응용' 카테고리의 다른 글
[셀레니움 응용] 네이버 항공권 검색 3편 가격 검색 (2) | 2021.11.07 |
---|---|
[셀레니움 응용] 네이버 항공권 검색 1편 출발지 도착지 선택 (0) | 2021.11.05 |