ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 네이버 항공권 크롤링 - 파이썬
    공부 2022. 8. 9. 13:39
    728x90

    beautifulsoup와  selenium을 사용해야 하기 때문에 다운로드한다.

    또한 웹 크롬 드라이버를 다운로드한다.

     

    https://m-flight.naver.com/

     

    네이버 항공권

    설레는 여행의 시작. 네이버 항공권과 함께!

    m-flight.naver.com

    네이버 항공권 페이지에 들어가 선택한 날짜의 원하는  항공편의 모든 항공편을 가져오고자 하였다.

    따라서 selenium을 사용하여 사이트를 열고 스크롤을 끝까지 내려야 했다.

    그 후 beautifulsoup를 이용하여 파싱을 한다.

    반복문을 이용하여 100일 동안 항공권 정보를 가져왔다.

    사이트를 보았을 때 날짜에 따라 사이트 명이 바뀌는 것을 확인하였다. 따라서 이에 따라 원하는 날짜 시점부터 1을 더하여 날짜를 변경하였다. 

     

     

    #selenium을 사용해서 사이트 직접 열기
    driver=webdriver.Chrome()

    url='https://flight.naver.com/flights/domestic/GMP-CJU-'+date+'?adult=1&child=0&infant=0&fareType=YC&selectedFlight='
        driver.get(url)

     

    #스크롤 내리기 위한 파이썬 코드
        driver.execute_script("window.scrollTo(0, 1080)") 
        SCROLL_PAUSE_SEC = 1

        # 스크롤 높이 가져옴
        last_height = driver.execute_script("return document.body.scrollHeight")

        while True:
            # 끝까지 스크롤 다운
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

            # 1초 대기
            time.sleep(SCROLL_PAUSE_SEC)

            # 스크롤 다운 후 스크롤 높이 다시 가져옴
            new_height = driver.execute_script("return document.body.scrollHeight")
            if new_height == last_height:
                break
            last_height = new_height

     

     

    #beautifulsoup를 이용하여 파싱

        html=driver.page_source
        soup=bs(html,'html.parser')

     

     

    #파일 오픈하여 저장

    f = open(f'파일이름','a',encoding='utf-8',newline='') #파일오픈
        csvWriter = csv.writer(f)#열어둔 파일
        for i in searchList:
            csvWriter.writerow(i) 

        f.close()

     

     

    #날짜 변경

    month=[31,28,31,30,31,30,31,31,30,31,30,31]
        i_day=int(day)+1
        i_mon=int(mon)
        i_year=int(year)
        if month[i_mon-1]<i_day:
            i_day=1
            i_mon+=1
            if i_mon>11:
                i_mon=0
                i_year+=1
        date='%d%02d%02d'%(i_year,i_mon,i_day)

     

     

     

    전체 코드

    import csv
    from selenium import webdriver
    from bs4 import BeautifulSoup as bs
    import requests
    import time

    searchList=[["항공사","출발날짜","출발시간","출발공항","도착시간","도착공항","소요시간","가격"]]
    #selenium을 사용해서 사이트 직접 열기
    driver=webdriver.Chrome()
    date='20220806'

    month=[31,28,31,30,31,30,31,31,30,31,30,31]

    for a in range(0,100):
        url='https://flight.naver.com/flights/domestic/GMP-CJU-'+date+'?adult=1&child=0&infant=0&fareType=YC&selectedFlight='
        driver.get(url)
        mon=date[4:6]
        day=date[6:8]
        year=date[0:4]
        print(date)
        time.sleep(10)
        #스크롤 내리기 위한 파이썬 코드
        driver.execute_script("window.scrollTo(0, 1080)") 
        SCROLL_PAUSE_SEC = 1

        # 스크롤 높이 가져옴
        last_height = driver.execute_script("return document.body.scrollHeight")

        while True:
            # 끝까지 스크롤 다운
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

            # 1초 대기
            time.sleep(SCROLL_PAUSE_SEC)

            # 스크롤 다운 후 스크롤 높이 다시 가져옴
            new_height = driver.execute_script("return document.body.scrollHeight")
            if new_height == last_height:
                break
            last_height = new_height

        html=driver.page_source
        soup=bs(html,'html.parser')
        air_names=soup.select('b.name')
        flights_check=soup.select('b.route_time__-2Z1T')
        flights_place=soup.select('i.route_code__3WUFO')
        flights_times=soup.select('i.route_info__1RhUH')
        flight_moneys=soup.select('div.domestic_item__2B--k>b.domestic_price__1qAgw>i.domestic_num__2roTW')
        air_name=[]
        flight_money=[]
        flight_place=[]
        arrival_departure_time=[]
        departure_time=[]
        departure_air=[]
        arrival_time=[]
        arrival_air=[]
        flights_time=[]
        k=0
        for i in air_names:
            air_name.append(i.get_text())
            
        for i in flights_times:
            flights_time.append(i.get_text())


        for i in flights_check:
                arrival_departure_time.append(i.get_text())

        for k in range(len(arrival_departure_time)):
            if k%2==0:
                departure_time.append(arrival_departure_time[k])
            elif k%2==1:
                arrival_time.append(arrival_departure_time[k])

        for i in flights_place:
                flight_place.append(i.get_text())

        for k in range(len(flight_place)):
            if k%2==0:
                departure_air.append(flight_place[k])
            elif k%2==1:
                arrival_air.append(flight_place[k])

        for i in flight_moneys:
            flight_money.append(i.get_text())

        for i in range(len(air_name)):
            temp=[]
            temp.append(air_name[i])
            temp.append(date)
            temp.append(departure_time[i])
            temp.append(departure_air[i])
            temp.append(arrival_time[i])
            temp.append(arrival_air[i])
            temp.append(flights_time[i])
            temp.append(flight_money[i])
            searchList.append(temp)

        
        f = open(f'파일이름','a',encoding='utf-8',newline='') #파일오픈
        csvWriter = csv.writer(f)#열어둔 파일
        for i in searchList:
            csvWriter.writerow(i) 

        f.close()
        print("완료 !")
        searchList=[]
        i_day=int(day)+1
        i_mon=int(mon)
        i_year=int(year)
        if month[i_mon-1]<i_day:
            i_day=1
            i_mon+=1
            if i_mon>11:
                i_mon=0
                i_year+=1
        date='%d%02d%02d'%(i_year,i_mon,i_day)
        

    728x90
    반응형

    '공부' 카테고리의 다른 글

    서블릿  (0) 2022.08.16
    데이터베이스  (0) 2022.08.10
    클라이언트 서버 채팅  (0) 2022.07.29
    DB  (0) 2022.07.28
    kafka  (0) 2022.07.28

    댓글

Designed by Tistory.