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 이 휴대 하 는 모든 비행기 표를 찾 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.