Dữ liệu · 2026

VJTracker — Theo dõi giá vé máy bay

Hệ thống tự thu thập giá vé máy bay ba lần mỗi ngày và biến chúng thành bảng phân tích giúp chọn ngày bay và thời điểm mua vé.

78
chặng bay theo dõi
3×
lần quét mỗi ngày
160k+
bản ghi giá từ 07/2026

Bối cảnh

Giá vé máy bay thay đổi theo từng giờ, và câu hỏi “nên mua ngay hay chờ thêm?” thường được trả lời bằng cảm giác. VJTracker trả lời câu hỏi đó bằng dữ liệu: nó ghi lại giá vé mỗi ngày, rồi cho thấy ngày bay nào rẻ nhất trong tuần tới, giá đang lên hay xuống, mua trước bao nhiêu ngày thì rẻ nhất và hãng nào đang rẻ hơn.

Cách hoạt động

  • Thu thập: một scraper viết bằng Node.js và Puppeteer tra giá trên Google Flights cho 78 chặng bay (nội địa, Bangkok, Almaty, Nhật Bản và Úc), cho từng ngày bay trong 7 ngày tới cùng hai mốc xa hơn là 14 và 30 ngày. Chỉ chuyến bay thẳng được ghi nhận, và khi không tìm thấy giá thì để trống chứ không ước tính.
  • Tự động: GitHub Actions chạy scraper ba lần mỗi ngày, không cần máy chủ riêng. Mỗi lần chạy, dữ liệu mới được gộp vào và commit thẳng vào kho mã.
  • Lưu trữ: lịch sử giá được chia thành một tệp JSON cho mỗi tháng, kèm một tệp chỉ mục nhỏ. Trang dashboard chỉ tải hai tháng gần nhất nên mở nhanh.
  • Hiển thị: dashboard là một trang tĩnh (HTML, CSS, JavaScript thuần và Chart.js), phục vụ qua GitHub Pages.

Dashboard

  • Bảng 7 ngày tới: giá rẻ nhất của từng ngày bay, thay đổi so với lần quét trước, diễn biến giá 14 ngày và bảng so sánh các hãng theo màu từ rẻ đến đắt. Bấm một ngày để xem giờ bay và lịch sử giá của ngày đó.
  • Chọn chặng bay, lọc theo hãng và theo số ngày mua trước, kể cả một khoảng tùy chỉnh như 7–21 ngày.
  • Khuyến nghị mua ngay hoặc chờ thêm, dựa trên giá hiện tại so với trung bình 7 ngày và xu hướng giá.
  • Giá trung bình theo số ngày mua trước, so sánh giá giữa các hãng ở lần quét mới nhất và giá theo thứ trong tuần của ngày bay.
  • Cảnh báo giá cho từng chặng, gửi thông báo trên trình duyệt khi có lần quét đạt mức giá mong muốn.
  • Đường dẫn giữ nguyên bộ lọc để chia sẻ, và xuất lịch sử giá ra tệp CSV.

Bài học

Ban đầu toàn bộ lịch sử nằm trong một tệp JSON duy nhất. Khi tệp đó vượt 80 MB và vẫn lớn thêm gần 1 MB mỗi ngày, nó sắp chạm giới hạn 100 MB mỗi tệp của GitHub và khiến trang tải rất chậm. Chia dữ liệu theo tháng giải quyết cả hai: không tệp nào còn gần giới hạn, và người xem chỉ tải phần dữ liệu họ cần.

Dự án tiếp theo Caro Arena