获取当天所有航班信息并储存,效果如下图所示,如想获取心仪
航班班次信息,可直接修改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));