Python 은 모든 비행기 표를 휴대 하 는 인 스 턴 스 코드 를 찾 습 니 다.

광저우 에서 청 두에 가 는 것 과 같은 휴대용 네트워크 를 열 어 비행기 표를 조회 하 세 요.
이 때 인터넷 주 소 는:http://flights.ctrip.com/booking/CAN-CTU-day-1.html?DDate1=2018-06-15
그 중에서 CAN 은 광 저 우 를,CTU 는 청 두 를 나타 내 고 날 짜 는'2018-06-15'가 비교적 뚜렷 하 다.일반적인 파충 류 는 이 몇 개의 값 을 바 꾸 기만 하면 옮 겨 다 닐 수 있다.그러나 현재 웹 페이지 의 모든 제 이 슨 형식의 데 이 터 를 볼 수 있 는 링크 가 있 는 것 으로 나 타 났 다.아래 와 같다
http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=CAN&ACity1=CTU&SearchType=S&DDate1=2018-06-15(뒤에 생략...)
도시 와 날 짜 를 볼 수 있 습 니 다.이 연결 은 json 파일 로 열 려 있 습 니 다.그 안에 저 장 된 것 은 현재 페이지 의 데이터 입 니 다.다음 과 같이 표 시 됩 니 다.그 중에서"fis"는 항공 편 정보 입 니 다.

매번 기어 오 를 때마다 도시 코드 와 날 짜 를 바 꾸 면 됩 니 다.도시 코드 는 스스로 수 동 으로 한 부 를 정리 합 니 다.

city={"YIE":"   ","AKU":"   ","RHT":"     ","AXF":"     ","AAT":"   ","NGQ":"  ","MFM":"  " 
,"AQG":"  ","AVA":"  ","AOG":"  ","RLK":"    ","AEB":"  ","BAV":"  ","BSD":"  ","BHY":"  ","BJS":"  " 
,"DBC":"  ","NBS":"  ","BFJ":"  ","BPL":"  ","CKG":"  ","BPX":"  ","CGD":"  ","CZX":"  " 
,"CHG":"  ","CTU":"  ","JUH":"  ","CIF":"  ","SWA":"  ","CGQ":"  ","CSX":"  ","CIH":"  ","CDE":"  " 
,"CWJ":"  ","DAX":"  ","DLU":"  ","DLC":"  ","DQA":"  ","DAT":"  ","DDG":"  ","DCY":"  ","DOY":"  " 
,"DNH":"  ","DAX":"  ","LUM":"  ","EJN":"    ","DSN":"    ","ENH":"  ","ERL":"    ","FUO":"  " 
,"FOC":"  ","FYJ":"  ","FUG":"  ","KOW":"  ","GOQ":"   ","GYU":"  ","GYS":"  ","CAN":"  ","KWE":"  " 
,"KWL":"  ","HRB":"   ","HMI":"  ","HAK":"  ","HLD":"   ","HDG":"  ","HZG":"  ","HGH":"  ","HFE":"  " 
,"HTN":"  ","HEK":"  ","HET":"    ","HIA":"  ","HJJ":"  ","TXN":"  ","HUZ":"  ","JXA":"  ","TNA":"  " 
,"JNG":"  ","JGD":"    ","JMU":"   ","JGN":"   ","SWA":"  ","JIC":"  ","KNH":"  ","JNZ":"  " 
,"CYI":"  ","JHG":"  ","JSJ":"   ","JJN":"  ","JGS":"   ","JDZ":"   ","JIU":"  ","JZH":"   ","KHG":"  " 
,"KJH":"  ","KGT":"  ","KRY":"    ","KCA":"  ","KRL":"   ","KMG":"  ","LXA":"  ","LHW":"  ","HZH":"  " 
,"LJG":"  ","LLB":"  ","LYG":"   ","LPF":"   ","LFQ":"  ","LZY":"  ","LNJ":"  ","LYI":"  ","LZH":"  " 
,"LZO":"  ","LYA":"  ","LLV":"  ","JMJ":"  ","LCX":"  ","NZH":"   ","LUM":"  ","MXZ":"  ","MIG":"  " 
,"OHE":"  ","MDG":"   ","MFK":"  " ,"KHN":"  ","NAO":"  ","NKG":"  ","NNG":"  ","NTG":"  ","NNY":"  " 
,"NGB":"  ","NLH":"  ","PZI":"   ","SYM":"  ","NDG":"    ","JIQ":"  ","IQM":"  ","BPE":"   ","TAO":"  " 
,"IQN":"  ","JUZ":"  ","RKZ":"   ","RIZ":"  ","SYX":"  ","XMN":"  ","SHA":"  ","SZX":"  ","HPG":"   " 
,"SHE":"  ","SJW":"   ","TCG":"  ","HYN":"  ","TYN":"  ","YTY":"  ","TVS":"  ","TCZ":"  ","TSN":"  " 
,"THQ":"  ","TGO":"  ","TEN":"  ","TLQ":"   ","WXN":"  ","WEH":"  ","WEF":"  ","WNZ":"  ","WNH":"  " 
,"WUA":"  ","HLH":"    ","URC":"    ","WUX":"  ","WUZ":"  ","WUH":"  ","WUS":"   ","SIA":"  ","XIC":"  " 
,"XNN":"  ","JHG":"    ","XIL":"    ","DIG":"    (  )","XFN":"  ","ACX":"  ","XUZ":"  ","HKG":"  " 
,"YNT":"  ","ENY":"  ","YNJ":"  ","YNZ":"  ","YTY":"  ","LDS":"  ","YIN":"  ","YBP":"  ","YIH":"  " 
,"YIC":"  ","YIW":"  ","INC":"  ","LLF":"  ","UYN":"  ","YUS":"  ","YCU":"  ","ZHA":"  ","DYG":"   " 
,"ZQZ":"   ","YZY":"  ","ZAT":"  ","CGO":"  ","ZHY":"  ","HSN":"  ","ZUH":"  ","WMT":"  (  )","ZYI":"  (  )"} 
잦 은 요청 429 를 방지 하기 위해 UserAgent 도 무 작위 로 값 을 추출 할 수 있 도록 많이 찾 습 니 다.하지만 너무 잦 으 면 인증 코드 를 입력 해 야 하기 때문에 출발 도 시 를 오 를 때마다 10 초 간 멈 춰 라.
먼저 데 이 터 를 저장 할 표를 만 듭 니 다.SQL Server 를 사용 합 니 다.

CREATE TABLE KKFlight( 
  ID int IDENTITY(1,1),  --  ID 
  ItinerarDate  date,      --     
  Airline     varchar(100),  --     
  AirlineCode   varchar(100),  --       
  FlightNumber  varchar(20),  --    
  FlightNumberS  varchar(20),  --   -  (    ) 
  Aircraft    varchar(50),  --     
  AircraftSize  char(2),    --    (L ;M ;S ) 
  AirportTax   decimal(10,2), --      
  FuelOilTax   decimal(10,2), --    
  FromCity    varchar(50),  --     
  FromCityCode  varchar(10),  --       
  FromAirport   varchar(50),  --     
  FromTerminal  varchar(20),  --      
  FromDateTime  datetime,    --     
  ToCity     varchar(50),  --     
  ToCityCode   varchar(10),  --       
  ToAirport    varchar(50),  --     
  ToTerminal   varchar(20),  --      
  ToDateTime   datetime,    --     
  DurationHour  int,      --  (  h) 
  DurationMinute int,      --  (  m) 
  Duration    varchar(20),  --  (   ) 
  Currency    varchar(10),  --   
  TicketPrices  decimal(10,2), --   
  Discount    decimal(4,2),  --     
  PunctualityRate decimal(4,2),  --    
  AircraftCabin  char(1),    --  (F   ;C   ;Y   ) 
  InsertDate   datetime default(getdate()), --     
) 
모든 도 시 를 기어 오 르 기 때문에 도 시 는 제한 하지 않 고 날짜 만 제한 합 니 다.즉,언제 부터 언제 까지 의 데 이 터 를 기어 오 르 는 것 입 니 다.모든 스 크 립 트 는 다음 과 같 습 니 다:

#-*- coding: utf-8 -*- 
# python 3.5.0 
import json 
import time 
import random 
import datetime 
import sqlalchemy 
import urllib.request 
import pandas as pd 
from operator import itemgetter 
from dateutil.parser import parse 
class FLIGHT(object): 
  def __init__(self): 
    self.Airline = {} #       
    self.engine = sqlalchemy.create_engine("mssql+pymssql://kk:kk@HZC/Myspider") 
    self.url = '' 
    self.headers = {} 
    self.city={"AAT":"   ","ACX":"  ","AEB":"  ","AKU":"   ","AOG":"  ","AQG":"  ","AVA":"  ","AXF":"     ","BAV":"  ","BFJ":"  ","BHY":"  " 
    ,"BJS":"  ","BPE":"   ","BPL":"  ","BPX":"  ","BSD":"  ","CAN":"  ","CDE":"  ","CGD":"  ","CGO":"  ","CGQ":"  ","CHG":"  ","CIF":"  " 
    ,"CIH":"  ","CKG":"  ","CSX":"  ","CTU":"  ","CWJ":"  ","CYI":"  ","CZX":"  ","DAT":"  ","DAX":"  ","DBC":"  ","DCY":"  ","DDG":"  " 
    ,"DIG":"    (  )","DLC":"  ","DLU":"  ","DNH":"  ","DOY":"  ","DQA":"  ","DSN":"    ","DYG":"   ","EJN":"    ","ENH":"  " 
    ,"ENY":"  ","ERL":"    ","FOC":"  ","FUG":"  ","FUO":"  ","FYJ":"  ","GOQ":"   ","GYS":"  ","GYU":"  ","HAK":"  ","HDG":"  " 
    ,"HEK":"  ","HET":"    ","HFE":"  ","HGH":"  ","HIA":"  ","HJJ":"  ","HKG":"  ","HLD":"   ","HLH":"    ","HMI":"  ","HPG":"   " 
    ,"HRB":"   ","HSN":"  ","HTN":"  ","HUZ":"  ","HYN":"  ","HZG":"  ","HZH":"  ","INC":"  ","IQM":"  ","IQN":"  ","JDZ":"   " 
    ,"JGD":"    ","JGN":"   ","JGS":"   ","JHG":"    ","JIC":"  ","JIQ":"  ","JIU":"  ","JJN":"  ","JMJ":"  ","JMU":"   ","JNG":"  " 
    ,"JNZ":"  ","JSJ":"   ","JUH":"  ","JUZ":"  ","JXA":"  ","JZH":"   ","KCA":"  ","KGT":"  ","KHG":"  ","KHN":"  ","KJH":"  ","KMG":"  " 
    ,"KNH":"  ","KOW":"  ","KRL":"   ","KRY":"    ","KWE":"  ","KWL":"  ","LCX":"  ","LDS":"  ","LFQ":"  ","LHW":"  ","LJG":"  ","LLB":"  " 
    ,"LLF":"  ","LLV":"  ","LNJ":"  ","LPF":"   ","LUM":"  ","LXA":"  ","LYA":"  ","LYG":"   ","LYI":"  ","LZH":"  ","LZO":"  " 
    ,"LZY":"  ","MDG":"   ","MFK":"  ","MFM":"  ","MIG":"  ","MXZ":"  ","NAO":"  ","NBS":"  ","NDG":"    ","NGB":"  ","NGQ":"  " 
    ,"NKG":"  ","NLH":"  ","NNG":"  ","NNY":"  ","NTG":"  ","NZH":"   ","OHE":"  ","PZI":"   ","RHT":"     ","RIZ":"  ","RKZ":"   " 
    ,"RLK":"    ","SHA":"  ","SHE":"  ","SIA":"  ","SJW":"   ","SWA":"  ","SYM":"  ","SYX":"  ","SZX":"  ","TAO":"  ","TCG":"  ","TCZ":"  " 
    ,"TEN":"  ","TGO":"  ","THQ":"  ","TLQ":"   ","TNA":"  ","TSN":"  ","TVS":"  ","TXN":"  ","TYN":"  ","URC":"    ","UYN":"  ","WEF":"  " 
    ,"WEH":"  ","WMT":"  (  )","WNH":"  ","WNZ":"  ","WUA":"  ","WUH":"  ","WUS":"   ","WUX":"  ","WUZ":"  ","WXN":"  ","XFN":"  ","XIC":"  " 
    ,"XIL":"    ","XMN":"  ","XNN":"  ","XUZ":"  ","YBP":"  ","YCU":"  ","YIC":"  ","YIE":"   ","YIH":"  ","YIN":"  ","YIW":"  ","YNJ":"  " 
    ,"YNT":"  ","YNZ":"  ","YTY":"  ","YUS":"  ","YZY":"  ","ZAT":"  ","ZHA":"  ","ZHY":"  ","ZQZ":"   ","ZUH":"  ","ZYI":"  (  )"} 
    """{"KJI":"   "}""" 
    self.UserAgent = [ 
      "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36", 
      "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7", 
      "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0) Gecko/16.0 Firefox/16.0", 
      "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10", 
      "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", 
      "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", 
      "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1500.55 Safari/537.36", 
      "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17" 
      "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre", 
      "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0", 
      "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11" 
    ] 
  #             
  def set_url_headers(self,startdate,enddate): 
    startDate=datetime.datetime.strptime(startdate,'%Y-%m-%d') 
    endDate=datetime.datetime.strptime(enddate,'%Y-%m-%d') 
    while startDate<=endDate: 
      today = startDate.strftime('%Y-%m-%d') 
      for fromcode, fromcity in sorted(self.city.items(), key=itemgetter(0)): 
        for tocode, tocity in sorted(self.city.items(), key=itemgetter(0)): 
          if fromcode != tocode: 
            self.url = 'http://flights.ctrip.com/domesticsearch/search/SearchFirstRouteFlights?DCity1=%s&ACity1=%s&SearchType=S&DDate1=%s&IsNearAirportRecommond=0&LogToken=027e478a47494975ad74857b18283e12&rk=4.381066884522498182534&CK=9FC7881E8F373585C0E5F89152BC143D&r=0.24149333708195565406316' % (fromcode,tocode,today) 
            self.headers = { 
              "Host": "flights.ctrip.com", 
              "User-Agent": random.choice(self.UserAgent), 
              "Referer": "https://flights.ctrip.com/booking/%s-%s-day-1.html?DDate1=%s" % (fromcode,tocode,today), 
              "Connection": "keep-alive", 
            } 
            print("%s : %s(%s) ==> %s(%s) " % (today,fromcity,fromcode,tocity,tocode)) 
            self.get_parse_json_data(today) 
        time.sleep(10) 
      startDate+=datetime.timedelta(days=1) 
  #           
  def get_one_page_json_data(self): 
    req = urllib.request.Request(self.url,headers=self.headers) 
    body = urllib.request.urlopen(req,timeout=30).read().decode('gbk') 
    jsonData = json.loads(body.strip("'<>() ").replace('\'', '\"')) 
    return jsonData 
  #          ,         
  def get_parse_json_data(self,today): 
    jsonData = self.get_one_page_json_data() 
    df = pd.DataFrame(columns=['ItinerarDate','Airline','AirlineCode','FlightNumber','FlightNumberS','Aircraft','AircraftSize'  
    ,'AirportTax','FuelOilTax','FromCity','FromCityCode','FromAirport','FromTerminal','FromDateTime','ToCity','ToCityCode','ToAirport' 
    ,'ToTerminal','ToDateTime','DurationHour','DurationMinute','Duration','Currency','TicketPrices','Discount','PunctualityRate','AircraftCabin'])  
    if bool(jsonData["fis"]): 
      #              
      company = jsonData["als"] 
      for k in company.keys(): 
        if k not in self.Airline: 
          self.Airline[k]=company[k] 
      index = 0 
      for data in jsonData["fis"]: 
        df.loc[index,'ItinerarDate'] = today #     
        #df.loc[index,'Airline'] = self.Airline[data["alc"].strip()] #     
        df.loc[index,'Airline'] = self.Airline[data["alc"].strip()] if (data["alc"].strip() in self.Airline) else None #     
        df.loc[index,'AirlineCode'] = data["alc"].strip() #       
        df.loc[index,'FlightNumber'] = data["fn"] #    
        df.loc[index,'FlightNumberS'] = data["sdft"] #     (    ) 
        df.loc[index,'Aircraft'] = data["cf"]["c"] #     
        df.loc[index,'AircraftSize'] = data["cf"]["s"] #    (L ;M ;S ) 
        df.loc[index,'AirportTax'] = data["tax"] #      
        df.loc[index,'FuelOilTax'] = data["of"] #    
        df.loc[index,'FromCity'] = data["acn"] #     
        df.loc[index,'FromCityCode'] = data["acc"] #       
        df.loc[index,'FromAirport'] = data["apbn"] #     
        df.loc[index,'FromTerminal'] = data["asmsn"] #      
        df.loc[index,'FromDateTime'] = data["dt"] #     
        df.loc[index,'ToCity'] = data["dcn"] #     
        df.loc[index,'ToCityCode'] = data["dcc"] #       
        df.loc[index,'ToAirport'] = data["dpbn"] #     
        df.loc[index,'ToTerminal'] = data["dsmsn"] #      
        df.loc[index,'ToDateTime'] = data["at"] #     
        df.loc[index,'DurationHour'] = int((parse(data["at"])-parse(data["dt"])).seconds/3600) #  (  h) 
        df.loc[index,'DurationMinute'] = int((parse(data["at"])-parse(data["dt"])).seconds%3600/60) #  (  m) 
        df.loc[index,'Duration'] = str(df.loc[index,'DurationHour']) + 'h' + str(df.loc[index,'DurationMinute']) + 'm' #  (   ) 
        df.loc[index,'Currency'] = None #   
        df.loc[index,'TicketPrices'] = data["lp"] #   
        df.loc[index,'Discount'] = None #     
        df.loc[index,'PunctualityRate'] = None #    
        df.loc[index,'AircraftCabin'] = None #  (F   ;C   ;Y   ) 
        index = index + 1 
      df.to_sql("KKFlight", self.engine, index=False, if_exists='append')  
      print("done!~") 
if __name__ == "__main__": 
  fly = FLIGHT() 
  fly.set_url_headers('2018-06-16','2018-06-16') 
총결산
위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 Python 이 휴대 하 는 모든 비행기 표를 찾 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기