如何使用 TalorData 抓取 Google Flights 搜尋數據

了解如何使用 TalorData 抓取 Google Flights 搜尋資料。本技術指南涵蓋了航線參數、日期、乘客資訊、貨幣、Python requests 庫的使用、航班資料解析、價格監控、多航線追蹤、往返及多城市搜尋、CSV 匯出以及常見錯誤等內容。

如何使用 TalorData 抓取 Google Flights 搜尋數據
Cecilia Hill
最後更新於
5 分鐘閱讀

Google Flights search data 適合用來取得即時航班資訊,例如路線、航空公司、票價、中轉、飛行時間、出發時間、抵達時間、booking options 和 fare changes。

對旅遊平台、OTA、價格監控團隊、市場研究團隊和 AI travel agents 來說,這些資料可以支撐:

Workflow

可以追蹤什麼

Flight price monitoring

不同路線、日期、市場的票價

Airline visibility tracking

哪些航空公司出現在某條路線

Route analysis

直飛、中轉、layovers、duration

Travel deal discovery

低於常態的票價

OTA product enrichment

在旅遊產品中加入航班選項

AI travel planning

給 agent 即時航班上下文

Market research

航線供給、航空公司組合與價格區間

重點是結構化。瀏覽器頁面不容易保存、比較或餵給系統。JSON data 更適合用於 dashboards、alerts、reports 和 AI workflows。

這篇指南會建立一個 Python workflow:透過 TalorData 發送 Google Flights request,解析 response,提取航班資料,最後匯出乾淨表格。

基本流程:

Route + date + passenger settings
   ↓
TalorData SERP API
   ↓
Google Flights data in JSON
   ↓
Parse flights, prices, airlines, stops, duration
   ↓
Save to CSV or database
   ↓
Use for monitoring, dashboards, or AI agents

可以收集哪些航班資料?

Google Flights workflow 最常用的欄位通常是 route、date、schedule、airline、price 和 booking context。結構化航班 response 通常可包含 departure and arrival airports、flight duration、layovers、carbon emissions、prices 和 price insights。

Data field

為什麼重要

Departure airport

定義出發地

Arrival airport

定義目的地

Outbound date

票價比較必需

Return date

Round-trip tracking 必需

Airline

追蹤航空公司曝光

Flight number

識別具體航班

Departure time

用於時段篩選

Arrival time

用於行程比較

Duration

比較旅行品質

Stops

分析直飛與中轉

Layover airports

分析航線結構

Price

票價監控核心欄位

Currency

國際比較必需

Booking token or link

繼續查 booking options

Collected timestamp

價格歷史必需

做 price monitoring 時,timestamp 不是可有可無。今天收集的 fare,明天可能就不一樣。

核心 Google Flights 參數

Google Flights request 通常從 route、date、passenger、localization 和 output settings 開始。Airport ID 通常是三位 IATA airport code,例如 JFKLAXLHRSIN,有些 API 也支援 location identifiers,用於更寬泛的城市或地區搜尋。

Parameter

Purpose

Example

engine

選擇 Google Flights

google_flights

departure_id

出發機場或地點 ID

JFK

arrival_id

抵達機場或地點 ID

LAX

outbound_date

出發日期

2026-08-15

return_date

Round trip 回程日期

2026-08-22

flight_type or type

One-way、round-trip、multi-city

one_way / round_trip

adults

成人乘客數

1

children

兒童乘客數

0

currency

價格貨幣

USD

hl

介面語言

en

gl

國家上下文

us

travel_class

Economy、business 等

economy

stops

中轉篩選

nonstop

no_cache

Freshness control

true

One-way search 的核心是 departure_idarrival_idoutbound_date。Round trip 需要加入 return_date。Multi-city itinerary 則使用 multi-city payload。

基本請求結構

Endpoint 和 authentication format 請以你的 TalorData account 為準。下面是簡單 one-way flight search 的 request shape。

{
  "engine": "google_flights",
  "departure_id": "JFK",
  "arrival_id": "LAX",
  "outbound_date": "2026-08-15",
  "flight_type": "one_way",
  "adults": 1,
  "currency": "USD",
  "hl": "en",
  "gl": "us",
  "no_cache": true
}

Round trip:

{
  "engine": "google_flights",
  "departure_id": "JFK",
  "arrival_id": "LAX",
  "outbound_date": "2026-08-15",
  "return_date": "2026-08-22",
  "flight_type": "round_trip",
  "adults": 1,
  "currency": "USD",
  "hl": "en",
  "gl": "us",
  "no_cache": true
}

Step 1:設定 API key

將 TalorData API key 和 endpoint 存成環境變數。

export TALORDATA_API_KEY="your_api_key_here"
export TALORDATA_SERP_ENDPOINT="your_talordata_serp_endpoint_here"

Windows PowerShell:

setx TALORDATA_API_KEY "your_api_key_here"
setx TALORDATA_SERP_ENDPOINT "your_talordata_serp_endpoint_here"

安裝 dependencies:

pip install requests pandas

Step 2:建立可重用 Python client

這個 function 會發送 Google Flights request 並返回 JSON。

import os
import requests
from typing import Any, Dict, Optional


TALORDATA_API_KEY = os.getenv("TALORDATA_API_KEY")
TALORDATA_SERP_ENDPOINT = os.getenv("TALORDATA_SERP_ENDPOINT")


def fetch_google_flights(
    departure_id: str,
    arrival_id: str,
    outbound_date: str,
    return_date: Optional[str] = None,
    flight_type: str = "one_way",
    adults: int = 1,
    children: int = 0,
    currency: str = "USD",
    hl: str = "en",
    gl: str = "us",
    travel_class: str = "economy",
    no_cache: bool = True,
    extra_params: Optional[Dict[str, Any]] = None
) -> Dict[str, Any]:
    """
    Fetch Google Flights search data with TalorData SERP API.
    """
    if not TALORDATA_API_KEY:
        raise RuntimeError("Missing TALORDATA_API_KEY environment variable.")

    if not TALORDATA_SERP_ENDPOINT:
        raise RuntimeError("Missing TALORDATA_SERP_ENDPOINT environment variable.")

    payload: Dict[str, Any] = {
        "engine": "google_flights",
        "departure_id": departure_id,
        "arrival_id": arrival_id,
        "outbound_date": outbound_date,
        "flight_type": flight_type,
        "adults": adults,
        "children": children,
        "currency": currency,
        "hl": hl,
        "gl": gl,
        "travel_class": travel_class,
        "no_cache": no_cache
    }

    if return_date:
        payload["return_date"] = return_date

    if extra_params:
        payload.update(extra_params)

    response = requests.post(
        TALORDATA_SERP_ENDPOINT,
        json=payload,
        headers={
            "Authorization": f"Bearer {TALORDATA_API_KEY}",
            "Content-Type": "application/json"
        },
        timeout=45
    )

    response.raise_for_status()
    return response.json()

基本執行:

if __name__ == "__main__":
    data = fetch_google_flights(
        departure_id="JFK",
        arrival_id="LAX",
        outbound_date="2026-08-15",
        flight_type="one_way",
        adults=1,
        currency="USD"
    )

    print(data)

Step 3:檢查 raw response

建立 parser 前,先檢查第一份 response。

import json

print(json.dumps(data, indent=2, ensure_ascii=False)[:6000])

Google Flights-style response 常見容器包括:

best_flights
other_flights
flights
price_insights
airports
search_parameters

實際結構可能因 request type、route 和 result mode 而不同。不要太早把 parser 刻成石碑。先用手電筒看 JSON 洞穴牆。

Step 4:解析 flight results

Google Flights response 常會把結果分成 best_flightsother_flights。每個 itinerary 可能包含一個或多個 flight segments。

from typing import Any, Dict, List


def get_flight_groups(data: Dict[str, Any]) -> List[Dict[str, Any]]:
    groups = []

    for group_name in ["best_flights", "other_flights", "flights"]:
        value = data.get(group_name)

        if isinstance(value, list):
            for item in value:
                item["_group"] = group_name
                groups.append(item)

    return groups


def parse_google_flights(data: Dict[str, Any]) -> List[Dict[str, Any]]:
    itineraries = get_flight_groups(data)
    rows = []

    for position, itinerary in enumerate(itineraries, start=1):
        segments = itinerary.get("flights", [])

        first_segment = segments[0] if segments else {}
        last_segment = segments[-1] if segments else {}

        departure_airport = first_segment.get("departure_airport", {})
        arrival_airport = last_segment.get("arrival_airport", {})

        airlines = sorted({
            segment.get("airline")
            for segment in segments
            if segment.get("airline")
        })

        flight_numbers = [
            segment.get("flight_number")
            for segment in segments
            if segment.get("flight_number")
        ]

        rows.append({
            "position": position,
            "group": itinerary.get("_group"),
            "airlines": ", ".join(airlines),
            "flight_numbers": ", ".join(flight_numbers),
            "departure_airport_name": departure_airport.get("name"),
            "departure_airport_id": departure_airport.get("id"),
            "departure_time": departure_airport.get("time"),
            "arrival_airport_name": arrival_airport.get("name"),
            "arrival_airport_id": arrival_airport.get("id"),
            "arrival_time": arrival_airport.get("time"),
            "duration": itinerary.get("total_duration") or itinerary.get("duration"),
            "stops": max(len(segments) - 1, 0),
            "price": itinerary.get("price"),
            "extracted_price": itinerary.get("extracted_price"),
            "currency": itinerary.get("currency"),
            "booking_token": itinerary.get("booking_token"),
            "departure_token": itinerary.get("departure_token"),
            "carbon_emissions": itinerary.get("carbon_emissions"),
            "layovers": itinerary.get("layovers"),
        })

    return rows

使用方式:

data = fetch_google_flights(
    departure_id="JFK",
    arrival_id="LAX",
    outbound_date="2026-08-15"
)

rows = parse_google_flights(data)

for row in rows[:5]:
    print(row["position"], row["airlines"], row["price"], row["stops"])

Step 5:保存成 CSV

import pandas as pd


data = fetch_google_flights(
    departure_id="JFK",
    arrival_id="LAX",
    outbound_date="2026-08-15",
    flight_type="one_way",
    adults=1,
    currency="USD"
)

rows = parse_google_flights(data)

df = pd.DataFrame(rows)
df.to_csv("google_flights_results.csv", index=False)

print(df.head())

CSV 可能長這樣:

position

airlines

departure_airport_id

arrival_airport_id

duration

stops

price

1

JetBlue

JFK

LAX

356

0

248

2

Delta

JFK

LAX

375

0

265

3

United

EWR

LAX

390

0

270

Step 6:加入 search context

沒有 search context 的 flight result 很難比較。每次都要保存 route、date、passenger、currency、language、country 和 timestamp。

from datetime import datetime, timezone


def add_search_context(
    rows: List[Dict[str, Any]],
    departure_id: str,
    arrival_id: str,
    outbound_date: str,
    return_date: Optional[str],
    flight_type: str,
    adults: int,
    currency: str,
    hl: str,
    gl: str
) -> List[Dict[str, Any]]:
    collected_at = datetime.now(timezone.utc).isoformat()

    for row in rows:
        row["departure_id"] = departure_id
        row["arrival_id"] = arrival_id
        row["outbound_date"] = outbound_date
        row["return_date"] = return_date
        row["flight_type"] = flight_type
        row["adults"] = adults
        row["currency"] = currency
        row["hl"] = hl
        row["gl"] = gl
        row["collected_at"] = collected_at

    return rows

Step 7:追蹤價格變化

Fare monitoring 通常關心每條 route 和 date 的最低價格。

df["price_num"] = pd.to_numeric(df["extracted_price"], errors="coerce")

cheapest = df.sort_values(
    by=["price_num", "stops"],
    ascending=[True, True]
).head(10)

cheapest.to_csv("cheapest_google_flights.csv", index=False)

print(cheapest[[
    "position",
    "airlines",
    "departure_airport_id",
    "arrival_airport_id",
    "stops",
    "duration",
    "price",
    "price_num"
]])

可追蹤的 signals:

Signal

Meaning

Lowest price changed

Fare movement

Airline changed

Carrier visibility shift

Direct flight disappeared

Route availability change

Stops increased

路線便利性下降

Duration increased

Route quality 變差

Booking token changed

Offer 或 itinerary 變化

做 recurring jobs 時,不要覆蓋舊資料。應該 append 到 database 或 daily CSV。

Step 8:監控多條路線

routes = [
    {"departure_id": "JFK", "arrival_id": "LAX"},
    {"departure_id": "SFO", "arrival_id": "SEA"},
    {"departure_id": "LHR", "arrival_id": "CDG"},
]

all_rows = []

for route in routes:
    data = fetch_google_flights(
        departure_id=route["departure_id"],
        arrival_id=route["arrival_id"],
        outbound_date="2026-08-15",
        flight_type="one_way",
        adults=1,
        currency="USD"
    )

    rows = parse_google_flights(data)

    for row in rows:
        row["departure_id"] = route["departure_id"]
        row["arrival_id"] = route["arrival_id"]
        row["outbound_date"] = "2026-08-15"

    all_rows.extend(rows)

pd.DataFrame(all_rows).to_csv("multi_route_google_flights.csv", index=False)

適合:

Use case

What to compare

Route price monitoring

每條路線最低價

Airline benchmarking

哪些 carrier 更常出現

Direct flight availability

直飛與中轉

Market analysis

航線供給與價格

Travel deal detection

異常低價

AI travel tools

按路線提供當前選項

Step 9:處理 round trips

Round-trip data 可能更複雜,因為 outbound selection 可能決定 return options。

簡單 round-trip request:

data = fetch_google_flights(
    departure_id="JFK",
    arrival_id="LAX",
    outbound_date="2026-08-15",
    return_date="2026-08-22",
    flight_type="round_trip",
    adults=1,
    currency="USD"
)

如果 response 返回 departure_token,你可以用第二次 request 取得 return-flight options。Google Flights-style API 常用 departure token 或 booking token 從初始結果繼續查下一段或 booking options。

Step 10:Multi-city flight search

Multi-city itinerary 使用多段 flight segments。

multi_city_json = [
    {
        "departure_id": "JFK",
        "arrival_id": "LHR",
        "date": "2026-08-15"
    },
    {
        "departure_id": "LHR",
        "arrival_id": "CDG",
        "date": "2026-08-20"
    },
    {
        "departure_id": "CDG",
        "arrival_id": "JFK",
        "date": "2026-08-25"
    }
]

data = fetch_google_flights(
    departure_id="",
    arrival_id="",
    outbound_date="",
    flight_type="multi_city",
    adults=1,
    currency="USD",
    extra_params={
        "multi_city_json": multi_city_json
    }
)

Multi-city 適合:

Workflow

Example

Complex trip planning

New York → London → Paris → New York

Business travel

多段差旅

Travel agent tools

客製 itinerary

Fare comparison

比較組合路線

AI travel planners

生成 multi-leg options

常見錯誤

不保存 timestamp

航班價格會變。每次 snapshot 都要有 collection time。

比較不同乘客設定

一位成人和兩位成人可能返回不同總價。要保存 passenger settings。

混用 currencies

比較前要保存 currency,並做價格標準化。

只看 price

低價但中轉兩次,未必比稍貴的直飛更好。

忽略 route context

JFK → LAXNYC → Los Angeles area 不是同一個搜尋。

覆蓋舊資料

做 price monitoring 時,應該 append snapshots,而不是替換舊資料。

結語

使用 TalorData 抓取 Google Flights search data,本質上是把航班搜尋轉成結構化、可重複的資料流程。開始免費試用Google Flights API>>

先從 route 和 date parameters 開始:departure_idarrival_idoutbound_date,需要 round trip 時加 return_date。再加入 passenger count、currency、language、country、travel class 和 filters。接著解析 airline、flight number、price、duration、stops、airports、times 和 booking tokens。

資料一旦結構化,就可以建立 price alerts、fare dashboards、airline visibility reports、travel market analysis 和 AI travel agents。

Google Flights data 像一塊一直跳動的出發看板。好的 API workflow,會把它變成系統能準時登機的資料集。

立即開展您的數據業務

加入全球最強大的代理網絡

免費試用