爬虫類—クロールCtripのフライト情報



Reptile Crawling Ctrip Flight Information



機能紹介:Ctripでフライト情報を取得するための開始点、終了点、時間を入力します

コード:



from prettytable import PrettyTable import requests import json def xiecheng(dcity,acity,date): date = date[0:4]+'-'+date[4:6]+'-'+date[6:8] headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0 Win64 x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', 'Content-Type': 'application/json',# declares the text type as json format } City = {' ': 'YIE', ' ': 'AKU', ' ': 'RHT', ' ': 'AXF', ' ': 'AAT', ' ': 'NGQ', 'Macau': 'MFM', ' ': 'AQG', ' ': 'AVA', ' ': 'AOG', ' ': 'RLK', ' ': 'AEB', ' ': 'BAV', ' ': 'BSD', 'Beihai': 'BHY', ' ': 'BJS', ' ': 'DBC', ' ': 'NBS', 'Bijie': 'BFJ', 'Bole': 'BPL', 'Chongqing': 'CKG', ' ': 'BPX', ' ': 'CGD', 'Changzhou': 'CZX', 'Chaoyang': 'CHG', 'Chengdu': 'CTU', 'Chizhou': 'JUH', 'Chifeng': 'CIF', 'Jieyang': 'SWA', 'Changchun ': 'CGQ', 'Changsha': 'CSX', ' ': 'CIH', ' ': 'CDE', ' ': 'CWJ', ' ': 'DAX', 'Dali': 'DLU', 'Dalian': 'DLC', ' ': 'DQA', ' ': 'DAT', ' ': 'DDG', ' ': 'DCY', ' ': 'DOY', 'Dunhuang': 'DNH', ' ': 'LUM', 'Ejina flag': 'EJN', 'Ordos': 'DSN', 'Enshi': 'ENH', ' ': 'ERL', ' ': 'FUO', ' ': 'FOC', ' ': 'FYJ', ' ': 'FUG', ' ': 'KOW', ' Golmud': 'GOQ', 'Guyuan': 'GYU', ' ': 'GYS', 'Guangzhou': 'CAN', ' ': 'KWE', ' ': 'KWL', 'Harbin': 'HRB', 'Hami': 'HMI', 'Haikou ': 'HAK', 'Hailal': 'HLD', ' ': 'HDG', 'Hanzhong': 'HZG', 'Hangzhou': 'HGH', 'Hefei': 'HFE', 'Hetian': 'HTN', 'Black River': 'HEK', 'Hohhot ': 'HET', 'Huai': 'HIA', ' ': 'HJJ', ' ': 'TXN', ' ': 'HUZ', ' ': 'JXA', 'Jinan': 'TNA', 'Jining': 'JNG', 'Plus ': 'JGD', ' ': 'JMU', ' ': 'JGN', ' ': 'JIC', ' ': 'KNH', ' ': 'JNZ', ' ': 'CYI', ' ': 'JHG', ' ': 'JSJ', 'Jinjiang': 'JJN', 'Jinggangshan': 'JGS', 'Jingdezhen': 'JDZ', 'Jiujiang': 'JIU', 'Jiuzhaigou': 'JZH', 'Kashi': 'KHG', 'Kerry': 'KJH', ' Kangding': 'KGT', 'Karmayi': 'KRY', ' ': 'KCA', 'Korla': 'KRL', 'Kunming': 'KMG', 'Lhasa': 'LXA', 'Lanzhou': 'LHW', 'Liping': 'HZH', ' Lijiang': 'LJG', ' ': 'LLB', ' ': 'LYG', ' ': 'LPF', ' ': 'LFQ', ' ': 'LZY', ' ': 'LNJ', ' ': 'LYI', ' Liuzhou': 'LZH', ' ': 'LZO', ' ': 'LYA', ' ': 'LLV', ' ': 'JMJ', ' ': 'LCX', 'Manzhouli': 'NZH', 'Meizhou': 'MXZ', ' Mianyang': 'MIG', 'Mohe': 'OHE', 'Mudanjiang': 'MDG', 'Mazu': 'MFK', 'Nanchang': 'KHN', 'Nan Chong': 'NAO', 'Nanjing': 'NKG', 'Nanning': 'NNG', 'Nantong ': 'NTG', 'Nanyang': 'NNY', ' ': 'NGB', ' ': 'NLH', ' ': 'PZI', ' ': 'SYM', ' ': 'NDG', ' ': 'JIQ', ' And end ': 'IQM', 'Qinhuangdao': 'BPE', ' ': 'TAO', ' ': 'IQN', ' ': 'JUZ', ' ': 'RKZ', 'Rizhao': 'RIZ', 'Sanya': 'SYX', ' Xiamen': 'XMN', 'Shanghai': 'SHA', 'Shenzhen': 'SZX', 'Shen Nongjia': 'HPG', 'Shenyang': 'SHE', 'Shijiazhuang': 'SJW', 'Tacheng': 'TCG', 'Taizhou': 'HYN', ' Taiyuan': 'TYN', 'Yangzhou': 'YTY', 'Tangshan': 'TVS', 'Tengchong': 'TCZ', 'Tianjin': 'TSN', 'Tianshui': 'THQ', 'Tongliao': 'TGO', 'Tongren': 'TEN', 'Turpan ': 'TLQ', 'Wanzhou': 'WXN', ' ': 'WEH', ' ': 'WEF', 'Wenzhou': 'WNZ', ' ': 'WNH', ' ': 'WUA', ' ': 'HLH', ' Urumqi': 'URC', 'Wuxi': 'WUX', ' ': 'WUZ', 'Wuhan': 'WUH', ' ': 'WUS', ' ': 'SIA', ' ': 'XIC', ' ': 'XNN', ' ': 'XIL', 'Shangri-La (Diqing)': 'DIG', ' ': 'XFN', ' ': 'ACX', ' ': 'XUZ', ' ': 'HKG', ' ': 'YNT', ' ': 'ENY', ' ': 'YNJ', ' ': 'YNZ', ' ': 'LDS', ' ': 'YIN', ' ': 'YBP', ' ': 'YIH', ' ': 'YIC', ' ': 'YIW', ' ': 'INC', ' ': 'LLF', ' ': 'UYN', ' ': 'YUS', ' ': 'YCU', ' ': 'ZHA', ' ': 'DYG', ' ': 'ZQZ', ' ': 'YZY', ' ': 'ZAT', 'Zhengzhou ': 'CGO', 'Zhongwei': 'ZHY', 'Zhoushan': 'HSN', ' ': 'ZUH', 'Zunyi (Moutai)': 'WMT', 'Zunyi (Xinzhou)': 'ZYI'} url = 'http://flights.ctrip.com/itinerary/api/12808/products' request_payload = {'flightWay':'Oneway', 'classType':'ALL', 'hasChild':'false', 'hasBaby':'false', 'searchIndex':1, 'portingToken':'3fec6a5a249a44faba1f245e61e2af88', 'airportParams':[{'dcity':city.get(dcity),'acity':city.get(acity),'dcityname':dcity,'acityname':acity,'date':date}]} # The parameter passed in here must be json format response = requests.post(url,data=json.dumps(request_payload),headers=headers).text routeList = json.loads(response).get('data').get('routeList') table=PrettyTable(['Airline','FlightNumber','DepartureDate','ArrivalDate','PunctualityRate','LowestPrice']) for route in routeList: if len(route.get('legs')) == 1: info = {} legs = route.get('legs')[0] flight = legs.get('flight') info['Airline'] = flight.get('airlineName') info['FlightNumber'] = flight.get('flightNumber') info['DepartureDate'] = flight.get('departureDate')[-8:-3] info['ArrivalDate'] = flight.get('arrivalDate')[-8:-3] info['PunctualityRate'] = flight.get('punctualityRate') info['LowestPrice'] = legs.get('characteristic').get('lowestPrice') table.add_row(info.values()) print(dcity,'------->',acity,date) print(table) if __name__ == '__main__': Dcity = input('Please enter the starting point: ') Acity = input('Please enter the end point: ') Date = input('Please enter the date of travel: ') xiecheng(dcity,acity,date)

注意:

  • アクセスされたリンクはPOSTリクエストであり、渡されたパラメータタイプはフォームデータではなく、リクエストペイロードであることがわかりました。 Baiduは、このタイプをjson形式のパラメーターで渡す必要があり、パラメーターアクセスリンクを正常に渡すためにヘッダーで宣言する必要があることを説明する記事を見つけました。
  • 着信時間パラメータは、8桁の時間形式である必要があります。
  • 着信の場所と時刻は判断されないため、入力する場所は市の辞書に記載されている必要があり、時刻は現在の日付より前ではありません。
  • 上昇したデータをチェックアウトすることはWebページと同じですが、どこに行くかなど、内部でCtripが中毒する可能性を排除するものではありません。

Request Payloadリファレンス記事について:



PythonクローラーPOSTリクエストペイロードをリクエストする方法

クロール結果:
画像