가장 싼 항공권을 네이버 크롤링해서 가져오기 2편 python



🎫 항공권 네이버 크롤링




📌 네이버 항공권 자동 검색


네이버 항공권 자동검색



📌 데이터 크롤링하기 위한 필요한 라이브러리


Python
from selenium import webdriver # 셀레니움 라이브러리
from selenium.webdriver.common.by import By # 홈페이지 선택자를 가져오는 라이브러리
import time # 시간을 잠시 멈추기 위한 라이브러리
import pandas as pd # 데이터를 정리하기 위한 라이브러리
from tqdm import tqdm # 얼마나 진행했는지 확인하는 라이브러리



📌 모든 항공권 크롤링하기



Python
# 항공권 모든 데이터 크롤링하기
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)




📌 데이터 구간 나누기


Python
# 항공권 구간 데이터를 담을 변수
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)


구간별 크롤링




📌 조건에 맞게 정렬하기


Python
# 출발시간이 가장 빠르고 저렴한 항공권 출력하기
airplane_df.sort_values(['start_time1','cost'],ascending=True)





📌 전체코드


Python
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