안녕하세요!
오늘은 저번 자동 검색에 이어 가장 싼 항공권을 셀레니움으로 네이버 크롤링해서 가져오는 프로그램을 만드는 시간을 가져보겠습니다.
🎫 항공권 네이버 크롤링
네이버 항공권 자동 검색에 이어 이번 프로그램은 anaconda의 jupyter notebook으로 제작했습니다!
📌 네이버 항공권 자동 검색
자동 검색부터 제작하실 분은 여기를 참고하시면 됩니다!
📌 데이터 크롤링하기 위한 필요한 라이브러리
from selenium import webdriver # 셀레니움 라이브러리
from selenium.webdriver.common.by import By # 홈페이지 선택자를 가져오는 라이브러리
import time # 시간을 잠시 멈추기 위한 라이브러리
import pandas as pd # 데이터를 정리하기 위한 라이브러리
from tqdm import tqdm # 얼마나 진행했는지 확인하는 라이브러리
저번 글에서 사용했던 라이브러리를 그대로 사용하니 기존 파일에서 연장해서 진행하셔도 됩니다!
pandas는 한눈에 보기 쉽게 데이터들을 정리하고 제어하기 위한 라이브러리에요.
tqdm은 꼭 필요한 라이브러리는 아니지만 데이터를 수집할 때 생각보다 오래 걸려서 현재 얼마나 진행이 되었는지 확인하는 라이브러리입니다.
📌 모든 항공권 크롤링하기
# 항공권 모든 데이터 크롤링하기
all_contents = driver.find_elements(By.XPATH,'//*[@id="__next"]/div/div[1]/div[6]/div/div[3]')
# 확인용
for l in all_contents:
print(l.text)
검색이 되어있는 상태에서 이 코드를 실행시키면 모든 항공권들의 글자들을 가져올 수 있습니다.
여기에서 항공권 별로 나누는 게 중요하겠죠?
📌 데이터 구간 나누기
# 항공권 구간 데이터를 담을 변수
airplane = []
# 항공권 데이터를 담을 변수
data = []
# 크롤링할 항공권 개수
count = 200
airplane = l.find_elements(By.CLASS_NAME,'concurrent_ConcurrentItemContainer__2lQVG')
# 구간별로 모든 데이터들을 담기 위한 함수
for i, val in tqdm(enumerate(airplane)):
if i < count:
try:
time = val.find_elements(By.CLASS_NAME,'route_time__-2Z1T')
data.append({
'airline' : val.find_element(By.CLASS_NAME,'airline_name__Tm2wJ').text,
'CO2' : val.find_element(By.CLASS_NAME,'emissions_value__AlxrP').text,
'start_time1' : time[0].text,
'start_time2' : time[1].text,
'start_way' : val.find_elements(By.CLASS_NAME,'route_info__1RhUH')[0].text,
'end_time1' : time[2].text,
'end_time2' : time[3].text,
'end_way' : val.find_elements(By.CLASS_NAME,'route_info__1RhUH')[1].text,
'card' : val.find_element(By.CLASS_NAME,'item_type__2KJOZ').text,
'cost' : val.find_element(By.CLASS_NAME,'item_usual__dZqAN').text
})
except:
continue
# 데이터 정리
airplane_df = pd.DataFrame(data)
모든 데이터를 크롤링 했으니 이제 항공권 별로 구간을 나눠야겠죠?
className을 통해 구간을 나눴고 그 안에 있는 가져올 수 있는 데이터 들은 객체에 따로 담았어요.
또 비어있는 데이터를 담지 못하는 경우를 대비해서 try except 문을 사용했어요.
생각보다 오래 걸렸는데 항공권마다 객체를 만들지 않고 List로 만든다면 좀 더 빠르게 될 수도 있을 것 같아요.
그리고 마지막으로 모든 데이터들을 정리해 주는 DataFrame을 사용했습니다.
📌 조건에 맞게 정렬하기
# 출발시간이 가장 빠르고 저렴한 항공권 출력하기
airplane_df.sort_values(['start_time1','cost'],ascending=True)
저는 저번에 자동 검색으로 검색했던 2월 15일 출발 2월 20일 돌아오는 항공권을 출발시간이 가장 빠르고 저렴한 항공권을 출력해 봤어요.
결과는 두구두구!
결과는 ZIPTOKYO 항공사에서 08:55 시에 출발하고 왕복이 386,000원인 항공권이 출력되었습니다!
이런 데이터들을 다시 sort_values 함수로 원하는 조건에 따라 정렬해서 다시 찾을 수 있습니다.
📌 전체코드
from selenium import webdriver # 셀레니움 라이브러리
from selenium.webdriver.common.by import By # 홈페이지 선택자를 가져오는 라이브러리
import time # 시간을 잠시 멈추기 위한 라이브러리
import pandas as pd
from tqdm import tqdm # 얼만큼 진행했는지 확인하는 라이브러리
# 날짜 누르는 함수 정의하기
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(20)
all_contents = driver.find_elements(By.XPATH,'//*[@id="__next"]/div/div[1]/div[6]/div/div[3]')
airplane = []
data = []
count = 200
airplane = l.find_elements(By.CLASS_NAME,'concurrent_ConcurrentItemContainer__2lQVG')
for i, val in tqdm(enumerate(airplane)):
if i < count:
try:
time = val.find_elements(By.CLASS_NAME,'route_time__-2Z1T')
data.append({
'airline' : val.find_element(By.CLASS_NAME,'airline_name__Tm2wJ').text,
'CO2' : val.find_element(By.CLASS_NAME,'emissions_value__AlxrP').text,
'start_time1' : time[0].text,
'start_time2' : time[1].text,
'start_way' : val.find_elements(By.CLASS_NAME,'route_info__1RhUH')[0].text,
'end_time1' : time[2].text,
'end_time2' : time[3].text,
'end_way' : val.find_elements(By.CLASS_NAME,'route_info__1RhUH')[1].text,
'card' : val.find_element(By.CLASS_NAME,'item_type__2KJOZ').text,
'cost' : val.find_element(By.CLASS_NAME,'item_usual__dZqAN').text
})
except:
continue
airplane_df = pd.DataFrame(data)
airplane_df.sort_values(['start_time1','cost'],ascending=True)
자 이렇게 해서 네이버 항공권을 자동으로 검색하고 데이터를 크롤링하는 프로그램 제작이 되었습니다!
원래는 제가 필요해서 쓰려고 했지만 다른 분들도 필요하실 일이 있을 것 같아서 만들어 봤어요.
그럼 다음에 다른 정보로 찾아뵙겠습니다!
셀레니움으로 네이버 항공권 자동으로 검색하기 1편 python