안녕하세요!
요즘 크롤링이 재밌어서 셀레니움에 관심이 가고 있어요.
오늘은 네이버 항공권 홈페이지를 python 셀레니움으로 자동 검색해 보는 시간을 가져보겠습니다.
📍 네이버 항공권 자동 검색
본 코딩은 anaconda의 jupyter notebook으로 제작하였습니다.
📌 셀레니움 라이브러리 로딩
from selenium import webdriver # 셀레니움 라이브러리
from selenium.webdriver.common.by import By # 홈페이지 선택자를 가져오는 라이브러리
import time # 시간을 잠시 멈추기 위한 라이브러리
필요한 라이브러리를 가져와서 import 해주었습니다.
📌 크롬 홈페이지 열기
driver = webdriver.Chrome()
driver.get('https://flight.naver.com/flights/')
네이버는 크롤링에 대해 따로 제한을 두지 않기 때문에 디버깅 모드를 사용하지 않았습니다.
혹시나 “Chrome이 자동화된 테스트 소프트웨어에 의해 제어되고 있습니다.”라는 문구가 보기 싫다면 아래 글을 참고해 주세요!
네이버 항공권 홈페이지에 들어가면 이런 화면이 나오는데 이 버튼을 제어해서 자동 검색하는 프로그램을 만들어보겠습니다!
📌 필요한 입력값 적기
start_area = input("출발지를 적어주세요 : ")
end_area = input("도착지를 적어주세요 : ")
start_day_input = input('출발 날자를 적어주세요(숫자로 0000 00 00) : ')
end_day_input = input('오는 날자를 적어주세요(숫자로 0000 00 00) : ')
# 출발하는날 날짜를 공백 기준으로 나누고 나중에 검색해야할 0000.00. 형식으로 다시 저장
start_list = start_day_input.split(" ")
start_day = start_list[2]
start_month = start_list[0] + "." + start_list[1] + "."
# 돌아오는 날
end_list = end_day_input.split(" ")
end_day = end_list[2]
end_month = end_list[0] + "." + end_list[1] + "."
사람마다 여행 가는 행선지가 다르기 때문에 초기에 입력값을 받아줍니다.
이후에 이러한 데이터를 가지고 필요한 항공권 정보들을 가져올 거예요!
그리고 출발 날짜의 년, 월, 일을 따로 저장하기 위해서 split으로 나눴습니다.
📌 행선지 입력하기
# 버튼 찾기
start_area_button = driver.find_element(By.XPATH, '//*[@id="__next"]/div/div/div[4]/div/div/div[2]/div[1]/button[1]/b')
end_area_button = driver.find_element(By.XPATH, '//*[@id="__next"]/div/div/div[4]/div/div/div[2]/div[1]/button[2]/b')
# 가는 곳 누르기
start_area_button.click()
time.sleep(1)
search_area = driver.find_element(By.CLASS_NAME, 'autocomplete_input__1vVkF')
search_area.send_keys(start_area)
time.sleep(1)
finish_area = driver.find_element(By.CLASS_NAME, 'autocomplete_inner__3Owyw')
finish_area.click()
time.sleep(1)
# 오는 곳 누르기
end_area_button.click()
time.sleep(1)
search_area = driver.find_element(By.CLASS_NAME, 'autocomplete_input__1vVkF')
search_area.send_keys(end_area)
time.sleep(1)
finish_area = driver.find_element(By.CLASS_NAME, 'autocomplete_inner__3Owyw')
finish_area.click()
time.sleep(1)
행선지 버튼을 찾고 앞에 적어두었던 입력값을 자동으로 넣어줍니다.
그러면 가는 곳을 자동으로 검색해서 입력해 줍니다.
검색어의 최상단에 나오는 버튼을 기준으로 했기 때문에 검색이 안되는 곳은 입력이 안됩니다!
📌 날짜 입력하기
# 날짜 누르는 함수 정의하기
def select_day(input_month, input_day):
all_day = driver.find_elements(By.CLASS_NAME,'sc-kDDrLX.ctbFvd.month')
month_day = []
for i in all_day:
month = i.find_elements(By.CLASS_NAME,'sc-iqcoie.dCaTmH')
for j in month:
if j.text == input_month:
month_day = i.find_elements(By.CSS_SELECTOR,'.day b')
for i in month_day:
if i.text == input_day:
i.click()
break
# 출발, 돌아오는 날짜 버튼 찾기
day_area_start = driver.find_element(By.XPATH,'//*[@id="__next"]/div/div/div[4]/div/div/div[2]/div[2]/button[1]')
day_area_end = driver.find_element(By.XPATH,'//*[@id="__next"]/div/div/div[4]/div/div/div[2]/div[2]/button[2]')
# 출발하는 날짜 버튼 누르기
day_area_start.click()
time.sleep(1)
# 출발 날짜
select_day(start_month, start_day)
time.sleep(1)
# 돌아오는 날짜
try:
day_area_end.click()
time.sleep(1)
select_day(end_month, end_day)
except:
select_day(end_month, end_day)
time.sleep(1)
달력이 한 페이지에 다 있고 달마다 날짜로 표현되는 숫자가 같기 때문에 조금 복잡해 보일 수 있어요.
달력마다 div 태그로 나눠져 있는 것을 확인했으며 그 div 태그에 있는 연도와 월이 같다면 그 안에 있는 날짜의 숫자를 가져오는 방식이에요.
또 돌아오는 날짜에 메인화면으로 돌아가는 경우, 돌아가지 않는 경우를 고려해서 try except 문을 사용했습니다.
돌아오는 날짜도 같은 방식이니 참고해 주세요!
📌 검색 버튼 누르기
# 마지막 검색버튼 누르기
search = driver.find_element(By.XPATH,'//*[@id="__next"]/div/div/div[4]/div/div/div[2]/button')
search.click()
driver.implicitly_wait(10)
마지막 검색 버튼을 누르면 다음과 같은 화면이 나옵니다!
📌 전체 코드
from selenium import webdriver # 셀레니움 라이브러리
from selenium.webdriver.common.by import By # 홈페이지 선택자를 가져오는 셀레니움 라이브러리
import time # 시간을 잠시 멈추기 위한 라이브러리
# 날짜 누르는 함수 정의하기
def select_day(input_month, input_day):
all_day = driver.find_elements(By.CLASS_NAME,'sc-kDDrLX.ctbFvd.month')
month_day = []
for i in all_day:
month = i.find_elements(By.CLASS_NAME,'sc-iqcoie.dCaTmH')
for j in month:
if j.text == input_month:
month_day = i.find_elements(By.CSS_SELECTOR,'.day b')
for i in month_day:
if i.text == input_day:
i.click()
break
driver = webdriver.Chrome()
driver.get('https://flight.naver.com/flights/')
start_area = input("출발지를 적어주세요 : ")
end_area = input("도착지를 적어주세요 : ")
start_day_input = input('출발 날자를 적어주세요(숫자로 0000 00 00) : ')
end_day_input = input('오는 날자를 적어주세요(숫자로 0000 00 00) : ')
# 출발하는날 날짜를 공백 기준으로 나누고 나중에 검색해야할 0000.00. 형식으로 다시 저장
start_list = start_day_input.split(" ")
start_day = start_list[2]
start_month = start_list[0] + "." + start_list[1] + "."
# 돌아오는 날
end_list = end_day_input.split(" ")
end_day = end_list[2]
end_month = end_list[0] + "." + end_list[1] + "."
# 버튼 찾기
start_area_button = driver.find_element(By.XPATH, '//*[@id="__next"]/div/div/div[4]/div/div/div[2]/div[1]/button[1]/b')
end_area_button = driver.find_element(By.XPATH, '//*[@id="__next"]/div/div/div[4]/div/div/div[2]/div[1]/button[2]/b')
# 가는 곳 누르기
start_area_button.click()
time.sleep(1)
search_area = driver.find_element(By.CLASS_NAME, 'autocomplete_input__1vVkF')
search_area.send_keys(start_area)
time.sleep(1)
finish_area = driver.find_element(By.CLASS_NAME, 'autocomplete_inner__3Owyw')
finish_area.click()
time.sleep(1)
# 오는 곳 누르기
end_area_button.click()
time.sleep(1)
search_area = driver.find_element(By.CLASS_NAME, 'autocomplete_input__1vVkF')
search_area.send_keys(end_area)
time.sleep(1)
finish_area = driver.find_element(By.CLASS_NAME, 'autocomplete_inner__3Owyw')
finish_area.click()
time.sleep(1)
# 출발, 돌아오는 날짜 버튼 찾기
day_area_start = driver.find_element(By.XPATH,'//*[@id="__next"]/div/div/div[4]/div/div/div[2]/div[2]/button[1]')
day_area_end = driver.find_element(By.XPATH,'//*[@id="__next"]/div/div/div[4]/div/div/div[2]/div[2]/button[2]')
# 출발하는 날짜 버튼 누르기
day_area_start.click()
time.sleep(1)
# 출발 날짜
select_day(start_month, start_day)
time.sleep(1)
# 돌아오는 날짜
try:
day_area_end.click()
time.sleep(1)
select_day(end_month, end_day)
except:
select_day(end_month, end_day)
time.sleep(1)
# 마지막 검색버튼 누르기
search = driver.find_element(By.XPATH,'//*[@id="__next"]/div/div/div[4]/div/div/div[2]/button')
search.click()
driver.implicitly_wait(10)
지금까지 네이버 항공권을 셀레니움을 이용해서 자동으로 검색해 주는 프로그램을 간단하게 만들어봤어요!
다음에는 검색된 항공 데이터를 가지고 크롤링 하는 시간을 가져보겠습니다.
가장 싼 항공권을 네이버 크롤링해서 가져오기 2편 python