-
네이버 항공권 크롤링 - 파이썬공부 2022. 8. 9. 13:39728x90
beautifulsoup와 selenium을 사용해야 하기 때문에 다운로드한다.
또한 웹 크롬 드라이버를 다운로드한다.
네이버 항공권 페이지에 들어가 선택한 날짜의 원하는 항공편의 모든 항공편을 가져오고자 하였다.
따라서 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반응형