Travel Report Generator — NZ/AU/SG → HKG 旅行报告系统
生成全英文 Apple 风格 HTML/PDF 旅行报告:NZ/AU/SG 出发城市 → 香港(HKG) 中转 → 深圳/珠海。
数据库缺日期或新城市时自动触发实时爬取(携程 API 拦截),全程无需人工干预。
触发条件
用户给出:出发城市 + 日期范围 + 目的地(深圳或珠海)。典型指令:
- "奥克兰,2026-09-15 到 2026-09-20,深圳"
- "实时抓取数据并生成报告(凯恩斯,11月1号-11月10号,珠海)"
- "新加坡,2026-10-01 出发,10-05 回,珠海"(SG 系统,走 sg_smart_report.py)
系统结构(工作目录)
c:\Users\Administrator\WorkBuddy\20260414121535\
├── master_flight_db.xlsx # NZ/AU 航班库(NZ→NZD / AU→AUD 价格)
├── sg_flight_db.xlsx # SG 航班库(SGD)
├── city_config.json # 城市配置(cities/destinations/transit_city)
├── entry_policies.json # 入境政策(NZ/AU/OTHER)
├── master_scraper.py # 爬虫核心(scrape_one / append_to_master_db / ALL_CITIES)
├── gen_report_au3_original.py # NZ/AU 报告生成器(主脚本)
├── sg_smart_report.py # SG 智能报告(自动 DB 检查 + BitBrowser 爬取)
├── sg_gen_report.py # SG 报告生成器
├── html_to_pdf.py # HTML→PDF(Playwright)
├── _monthly_data/{YYYY-MM}/ # 目的地配套数据(shenzhen/zhuhai 的 transport/hotels/tourism/food)
├── _sg_monthly_data/{YYYY-MM}/ # SG 配套数据
└── assets/vickong_logos/ # 品牌 logo(alipay/wechat_pay/visa/mastercard/amap/meituan/didi)
核心工作流(NZ/AU 系统)
1. 解析指令
- 出发城市 → city_config['cities'] 键(Auckland/Wellington/Christchurch/Sydney/Melbourne/Brisbane/Perth/Cairns)
- 日期范围(未来日期;如用户说"4月1号"而 2026-04 已过 → 理解为 2027-04-01)
- 目的地 → Shenzhen / Zhuhai
2. 检查数据库覆盖
用 openpyxl 读 master_flight_db.xlsx(Departure IATA + Departure Date 列),确认日期范围是否有数据。
- 覆盖 → 直接生成报告
- 缺失或新城市 → 实时爬取
3. 新城市接入(如 Cairns 首次使用)
向 city_config.json 的 cities 添加:
"Cairns": {"iata": "CNS", "country": "AU", "weather_key": "Cairns,Australia",
"chinese_name": "凯恩斯", "airport_name": "Cairns Airport"}
修改前先备份:cp city_config.json city_config_backup_YYYYMMDD.json
4. 实时爬取(携程 API 拦截)
按模板创建 scrape_{code}_{period}_rt.py(复制 scripts/scrape_rt_template.py,改城市/日期):
- 复用 master_scraper.scrape_one(page, city, dep_date, api_responses) 与 append_to_master_db(flights, d1, d2)
- 拦截 URL 含 batchSearch/searchlist/flightItinerary 且含 "flightItineraryList" 的 API 响应
- 反封禁:每日期间隔 30-40s + 50% 概率额外 10-60s
- 运行(必须 NODE_OPTIONS= 前缀,否则 Playwright driver 报 --use-system-ca is not allowed):
bash
NODE_OPTIONS= C:\Users\Administrator\AppData\Local\Programs\Python\Python310\python.exe -u scrape_xxx_rt.py
13 天约 15 分钟,后台运行(run_in_background)。
- 新城市(不在 ALL_CITIES)时内联定义 city dict:{"code":"cns","name":"Cairns","iata":"CNS","country":"AU"}
5. 生成报告
NODE_OPTIONS= <py310> -u gen_report_au3_original.py \
--cities Auckland --start 2026-09-15 --end 2026-09-20 \
--destination Shenzhen --month-dir 2026-08
--cities用 city_config 键;--destination用 Shenzhen/Zhuhai--month-dir用数据最完整的月份(2026-08 有 shenzhen+zhuhai 全套;2026-10 仅 zhuhai 含 food)- 货币自动:NZ 城市 → NZD,AU 城市 → AUD(_fetch_rates 实时汇率)
- 输出:
travel_report_AU3_{Dest}_{start}_{end}.html
6. 转 PDF
NODE_OPTIONS= <venv-py> -u html_to_pdf.py travel_report_AU3_*.html
PDF 与 HTML 同名同目录。
报告板块与目的地特性
固定 8 板块:Flight → Weather → Transport → Hotels → Attractions → Food → Entry Policy → Practical Info(全英文,clean_cjk 过滤)。
目的地专属特性(已内置脚本,无需额外操作):
| 目的地 | Transportation 主推卡 | Practical Information |
|--------|----------------------|----------------------|
| Zhuhai | Vickong Dental 交通路线(HZMB 穿梭巴士 24h / 直通巴士免 HK 入境) | Vickong 主推块(支付/APP/移动数据 + 8 logo) |
| Shenzhen | 福田口岸 / 罗湖口岸路线(机场巴士 A43 + 东铁线,各 3 步) | 同上 Vickong 主推块 |
- 主推卡样式类:.vk-featured / .vk-option / .vk-step / .vk-summary(复用同一套 UI)
- 其他交通方式 → <details> 折叠表格(4 列:Mode/Route/Duration/Price,省略 notes)
- Vickong Practical 块渲染条件:dest_city in ('Zhuhai', 'Shenzhen')
SG 系统(新加坡,独立流程)
NODE_OPTIONS= <venv-py> -u sg_smart_report.py Singapore 2026-10-01 2026-10-05 zhuhai
sg_smart_report.py 自动:检查 sg_flight_db.xlsx → 缺则 BitBrowser 实时爬取(sg_standalone_scrape.py)→ 合并入库 → 调 sg_gen_report.py 生成报告。
- SG 货币 SGD(1 CNY ≈ 0.1851 SGD)
- 报告:sg_travel_report_{dest}{start}{end}.html
- SG 珠海报告含牙科指引板块(与 NZ/AU 不同)
关键坑位(必须遵守)
- NODE_OPTIONS:所有 Playwright 相关命令(爬取/PDF)加
NODE_OPTIONS=前缀,否则报--use-system-ca is not allowed in NODE_OPTIONS - Python 路径:NZ/AU 系统用
C:\Users\Administrator\AppData\Local\Programs\Python\Python310\python.exe;PDF 转换用 venvC:\Users\Administrator\.workbuddy\binaries\python\envs\default\Scripts\python.exe(有 playwright) - DB 价格:Economy Price 为字符串("CNY 10,224"/"NZ$1,112")→ 报告脚本用 parse_price + fmt_money_to_aud 自动换算
- Direct 列:值是 'Yes'/'No'(不是 'Direct'/'Transit')
- 天气:wttr.in/{city}?format=j1,HK 用 Hong_Kong
- 报告日期:过去日期无意义;默认按未来最近年份理解
- 每月配套数据:缺文件会导致板块空白;优先用 2026-08(完整)或 2026-10(zhuhai 含 food)
详细参考
references/system-reference.md— DB 列结构、master_scraper 函数签名、city_config 结构、汇率、脚本清单、反爬策略scripts/scrape_rt_template.py— 实时爬取模板脚本(改城市/日期即可复用)
交付
- 报告生成后必须同时交付 HTML + PDF 两个文件
- 用 present_files 打开预览;final reply 汇总:爬取条数、航司、最低价、板块、输出路径