中国国际航空航班信息获取与保存

查看 95|回复 9
作者:13955925361   
以8月31号北京首都国际机场(PEK)到重庆江北机场(CKG)为例,
获取当天所有航班信息并储存,效果如下图所示,如想获取心仪
航班班次信息,可直接修改e变量中的内容来完成。


QQ20250820-190552.png (2.31 MB, 下载次数: 0)
下载附件
2025-8-20 19:06 上传

              


QQ20250820-184013.png (358.96 KB, 下载次数: 0)
下载附件
2025-8-20 19:06 上传



QQ20250820-183937.png (429.94 KB, 下载次数: 0)
下载附件
2025-8-20 19:06 上传

               


QQ20250820-185241.png (373.3 KB, 下载次数: 1)
下载附件
2025-8-20 19:06 上传

代码如下所示:
[Python] 纯文本查看 复制代码from curl_cffi import requests
import json
import execjs
import os
import csv
from pathlib import Path
os_path = Path.cwd()
headers = {
    "Accept": "application/json, text/plain, */*",
    "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
    "Cache-Control": "no-cache",
    "Connection": "keep-alive",
    "Content-Type": "application/json",
    "Origin": "https://www.airchina.com.cn",
    "Pragma": "no-cache",
    "Referer": "https://www.airchina.com.cn/flight/oneway/pek-ckg/2025-08-30",
    "Sec-Fetch-Dest": "empty",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "same-origin",
    "Sgm-Context": "311410913714150140;311410913714150140",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0",
    "X-Device-Token": "tak01j5DCSFD3LPLZNOSEP5PZAEDBJEML37WIUHIHPW3DTI4ARLJE3HYSMIZE32PESA2I4KI4RRFZNDVQR2YCFQB4PJXRW5CBE6B2FKGYWQAZN7BDKGIQNDQBXRWKFB3S5DL4VXUNRIK3KUNX5ZG4ZXBMDRFYZLR34",
    "X-Locale": "zh-CN",
    "sec-ch-ua": "\"Not;A=Brand\";v=\"99\", \"Microsoft Edge\";v=\"139\", \"Chromium\";v=\"139\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\""
}
cookies = {
    "_gcl_au": "1.1.2089071844.1754130322",
    "_ga": "GA1.1.1826256857.1754130322",
    "HWWAFSESTIME": "1755751386893",
    "HWWAFSESID": "f39167362a3b2245e0",
    "ariauseGraymode": "false",
    "arialoadData": "true",
    "TKAEQLILOIB0YIMO": "tak01j5DCSFD3LPLZNOSEP5PZAEDBJEML37WIUHIHPW3DTI4ARLJE3HYSMIZE32PESA2I4KI4RRFZNDVQR2YCFQB4PJXRW5CBE6B2FKGYWQAZN7BDKGIQNDQBXRWKFB3S5DL4VXUNRIK3KUNX5ZG4ZXBMDRFYZLR34",
    "_ga_CGYVD7S4G4": "GS2.1.s1755751389$o8$g1$t1755751426$j23$l0$h0"
}
url = "https://www.airchina.com.cn/gateway/api/flight/list"
def write_dict_to_csv(filename, data_dict):
    """
    将单行字典数据写入CSV文件,自动判断是否写入表头,并检查重复数据
    参数:
        filename: CSV文件名(如 'movies.csv')
        data_dict: 单行字典数据(如 {'电影名称': '分手清单', ...})
    """
    file_exists = os.path.isfile(filename)
    fieldnames = list(data_dict.keys())
    # 如果文件已存在,检查是否有重复数据
    if file_exists:
        with open(filename, 'r', newline='', encoding='utf-8') as csvfile:
            reader = csv.DictReader(csvfile)
            # 将每行数据转换为元组(因为字典不可哈希)
            existing_data = [tuple(row.values()) for row in reader]
            # 将要写入的数据转换为元组形式进行比较
            new_data = tuple(data_dict.values())
            if new_data in existing_data:
                print(f"数据已存在,跳过写入: {data_dict}")
                return False
    # 写入数据(包括文件不存在或数据不重复的情况)
    with open(filename, 'a' if file_exists else 'w', newline='', encoding='utf-8') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        if not file_exists:
            writer.writeheader()
        writer.writerow(data_dict)
        return True
with open('中国国际航空.js','r',encoding='utf-8')as f:
    js_code=f.read()
ctx = execjs.compile(js_code)
e={
    "Trip": [
        {
            "Date": "2025-08-30",
            "Dep": "PEK",
            "Arrival": "CKG"
        }
    ],
    "Passenger": {
        "adult": 1,
        "child": 0,
        "baby": 0
    },
    "notchType": None,
    "aimPrice": None,
    "RequestParameterSecurityIdentificationBit": True
}
filename= e['Trip'][0]['Date'] + '(' +e['Trip'][0]['Dep'] + '-' + e['Trip'][0]['Arrival']+')'.replace('-','_')+'.csv'
params=ctx.call('c',e)
data = {
    "params": params,
    "RequestParameterEncryptionIdentificationBit": True
}
data = json.dumps(data, separators=(',', ':'))
response = requests.post(url, headers=headers, cookies=cookies, data=data).json()
print(response)
data_list=response['Data']['Journeys']
info=response['Data']['Airports']
for data in data_list:
    a=data['OriginCode']
    b=data['DestCode']
    c=info[a]['name']
    d=info['name']
    e=c+'(' + a +')'
    f=d+'(' + b +')'
    dit={
         '出发地':e,
         '目的地':f,
         '航班':data['Segments'][0]['MarketingCarrier'],
         '出发时间':data['Segments'][0]['Dep']['AircraftScheduledDateTime'].split('.')[0].replace('T', ' '),
         '到达时间':data['Segments'][0]['OperatingLeg'][0]['Arrival']['AircraftScheduledDateTime'].split('.')[0].replace('T', ' '),
         '头等舱':data['Fares']['2']['Price'],
         '经济舱':data['Fares']['5']['Price']}
    print(dit)
    write_dict_to_csv(filename, dit)
print(f"数据已保存到: {filename}")

JS代码:
[JavaScript] 纯文本查看 复制代码
const sm2 = require('sm-crypto').sm2;
// e={
//     "Trip": [
//         {
//             "Date": "2025-08-05",
//             "Dep": "PEK",
//             "Arrival": "CKG"
//         }
//     ],
//     "Passenger": {
//         "adult": 1,
//         "child": 0,
//         "baby": 0
//     },
//     "notchType": null,
//     "aimPrice": null,
//     "RequestParameterSecurityIdentificationBit": true
// }
const c = function(e) {
    try {
        const publicKey = '04064c2a3bcafba2c1ca4f5fb8ecd876b23d70fc4479b78f3c8066c02a8c17749458bca86361bc563d2501b61e2ac93a676a1305893aafcc6be2ea48ecb048672e';
        const t = encodeURIComponent(JSON.stringify(e));
        // SM2 加密(mode=1 表示 C1C3C2 格式)
        const encrypted = sm2.doEncrypt(t, publicKey, 1);
        return encrypted;
    } catch (n) {
        console.log(n);
        return "";
    }
};
// console.log(c(info));

数据, 下载次数

micsem   

要是可以做一个数据库,跟踪机票价格变化就好了
13955925361
OP
  


micsem 发表于 2025-8-20 19:10
要是可以做一个数据库,跟踪机票价格变化就好了

你小子,是一点苦都不想吃呀
zr2019   

学习一下,谢谢分享
sfentrtn   

哈哈福尔摩斯里面各种靠航班找犯人
yinuo2012   

这都可以,厉害了
af8889   

厉害了,楼主!!!!!!!
l290063948   

支持楼主,学习了
xu8145   

支持楼主,求楼主联系方式,有私单需求
野杂鱼   

楼主牛叉啦!学习学习啦!
您需要登录后才可以回帖 登录 | 立即注册

返回顶部