You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态航班网站爬取求助:弹窗内航班组构数据爬取及代码实现方案

动态航班组构信息爬取脚本分步编写计划(Python/PHP)

Python 版本分步计划

1. 整理已分析的请求核心信息

  • 把抓包得到的航班列表接口和组构信息接口的URL、请求方法(GET/POST)、必填请求头(如User-Agent、Cookie、X-Requested-With)、参数(如日期范围、航班ID)整理成清晰清单
  • 确认接口是否需要动态签名、token等参数,单独记录其生成逻辑(如果有)

2. 编写通用请求工具函数

用requests库实现可复用的请求函数,处理请求发送、异常捕获和响应解析:

import requests

def make_request(url, method='GET', params=None, headers=None, data=None):
    try:
        if method.upper() == 'GET':
            resp = requests.get(url, params=params, headers=headers)
        else:
            resp = requests.post(url, headers=headers, data=data)
        resp.raise_for_status()
        return resp.json()  # 接口返回JSON用这个,非JSON则返回resp.text
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
        return None

3. 获取航班日期与对应ID列表

调用航班列表接口,提取每个航班的日期和唯一标识ID,存储为结构化数据:

# 替换为你抓包到的真实接口和参数
flight_list_url = "https://example.com/api/flights"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...",
    "Cookie": "你的Cookie内容",
}
flight_params = {
    "start_date": "2024-05-01",
    "end_date": "2024-05-10",
}

flight_data = make_request(flight_list_url, params=flight_params, headers=headers)
flight_items = []
if flight_data:
    for item in flight_data.get('data', []):
        flight_items.append({
            "date": item.get('flight_date'),
            "flight_id": item.get('flight_id')
        })

4. 循环请求组构信息接口

遍历航班列表,用每个航班的ID调用组构接口,关联日期存储结果:

# 替换为真实组构信息接口
seat_map_url = "https://example.com/api/seat-map"
seat_map_results = []

for flight in flight_items:
    seat_params = {
        "flight_id": flight['flight_id'],
        "date": flight['date']
    }
    seat_data = make_request(seat_map_url, params=seat_params, headers=headers)
    if seat_data:
        seat_map_results.append({
            "flight_date": flight['date'],
            "flight_id": flight['flight_id'],
            "seat_map_info": seat_data.get('seat_map', {})
        })

5. 数据保存与异常优化

  • 将结果保存为JSON或CSV文件:
import json

with open("flight_seat_map.json", "w", encoding="utf-8") as f:
    json.dump(seat_map_results, f, ensure_ascii=False, indent=4)
  • 给请求添加重试机制(如失败后重试2次,每次间隔1秒),避免单个请求失败中断脚本

PHP 版本分步计划

1. 整理请求元数据

  • 列出航班列表、组构信息接口的URL、请求方法、必填请求头、参数,重点标记Cookie、Referer等影响请求合法性的字段
  • 记录动态参数(如token)的生成规则(如果有)

2. 编写通用cURL请求函数

实现可复用的请求函数,处理GET/POST请求、请求头和响应解析:

function makeRequest($url, $method = 'GET', $params = [], $headers = []) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 生产环境建议开启SSL验证

    // 格式化请求头
    $curlHeaders = [];
    foreach ($headers as $key => $value) {
        $curlHeaders[] = "$key: $value";
    }
    curl_setopt($ch, CURLOPT_HTTPHEADER, $curlHeaders);

    if ($method === 'POST') {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
    } else {
        $url .= '?' . http_build_query($params);
        curl_setopt($ch, CURLOPT_URL, $url);
    }

    $response = curl_exec($ch);
    if (curl_errno($ch)) {
        echo "请求失败: " . curl_error($ch);
        curl_close($ch);
        return null;
    }
    curl_close($ch);
    return json_decode($response, true); // 非JSON响应直接返回$response
}

3. 获取航班日期与ID列表

调用航班列表接口,解析响应并提取核心数据:

// 替换为真实接口和参数
$flightListUrl = "https://example.com/api/flights";
$headers = [
    "User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...",
    "Cookie" => "你的Cookie内容",
];
$flightParams = [
    "start_date" => "2024-05-01",
    "end_date" => "2024-05-10",
];

$flightData = makeRequest($flightListUrl, 'GET', $flightParams, $headers);
$flightItems = [];
if ($flightData && isset($flightData['data'])) {
    foreach ($flightData['data'] as $item) {
        $flightItems[] = [
            "date" => $item['flight_date'],
            "flight_id" => $item['flight_id']
        ];
    }
}

4. 批量请求组构信息

遍历航班数组,调用组构接口并关联日期存储结果:

// 替换为真实组构信息接口
$seatMapUrl = "https://example.com/api/seat-map";
$seatMapResults = [];

foreach ($flightItems as $flight) {
    $seatParams = [
        "flight_id" => $flight['flight_id'],
        "date" => $flight['date']
    ];
    $seatData = makeRequest($seatMapUrl, 'GET', $seatParams, $headers);
    if ($seatData) {
        $seatMapResults[] = [
            "flight_date" => $flight['date'],
            "flight_id" => $flight['flight_id'],
            "seat_map_info" => $seatData['seat_map'] ?? []
        ];
    }
}

5. 数据持久化与优化

  • 将结果保存为JSON文件:
file_put_contents("flight_seat_map.json", json_encode($seatMapResults, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
  • 添加重试逻辑,如请求失败时延迟1秒后重试2次,降低被反爬拦截的概率

内容的提问来源于stack exchange,提问作者Help

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:55:36