2 điểm bởi GN⁺ 2024-08-07 | 1 bình luận | Chia sẻ qua WhatsApp

Theo dõi giá siêu thị

  • Vào tháng 12 năm 2022, tác giả đã xây dựng một website để theo dõi biến động giá tại ba chuỗi siêu thị lớn ở Hy Lạp.
  • Trong quá trình này, nhiều vấn đề đã phải được giải quyết và cũng rút ra được nhiều bài học.

Scraping các website js

  • Vấn đề chính là các website được render bằng JavaScript.
  • Tác giả dùng Playwright để điều khiển trình duyệt web theo cách lập trình.
  • Playwright hỗ trợ các trình duyệt Chromium, Safari, Firefox và có thể dùng cùng Node, Java, .NET, Python.
  • Tác giả viết mã để xử lý cuộn vô hạn và trích xuất thông tin sản phẩm.

Tự động hóa

  • Trên M1 MacBook Pro, việc scraping toàn bộ siêu thị mất từ 50 phút đến 2 giờ 30 phút.
  • Cách này tốt cho phát triển và kiểm thử, nhưng cần một giải pháp bền vững hơn.

Dùng laptop cũ?

  • Tác giả đã thử dùng một chiếc laptop cũ từ năm 2013, nhưng hiệu năng rất đáng thất vọng.

Dùng cloud?

  • AWS quá đắt, còn Hetzner rẻ hơn nhiều.
  • Tác giả quyết định dùng máy chủ của Hetzner.

Dùng cả laptop cũ lẫn cloud!

  • Tác giả tự động hóa việc scraping trên máy chủ cloud, còn chiếc laptop cũ được dùng làm máy chủ CI.
  • Tác giả thiết lập pipeline bằng Concourse và chạy tác vụ scraping mỗi ngày.

Vượt qua giới hạn IP

  • Do các quy tắc tường lửa Akamai, các request từ địa chỉ IP không phải dân cư bị chặn.
  • Tác giả dùng Tailscale để khiến các request trông như đến từ địa chỉ IP tại nhà.

Nguyên nhân và thời điểm thất bại

  • Các dự án scraping bị ảnh hưởng bởi thay đổi từ phía các nhà phát triển website.
  • Có hai kiểu thất bại: breaking change và non-breaking change.
  • Nhận phản hồi nhanh là điều rất quan trọng.

Tối ưu hóa

  • Tác giả thực hiện nhiều tối ưu như cảnh báo email, hysteresis, timeout, cấu hình retry, v.v.
  • Hiệu năng được cải thiện bằng cách dùng máy chủ lớn hơn và giảm lượng dữ liệu cần fetch.

Chi phí

  • Chi phí dùng máy chủ trên Hetzner là rất rẻ.
  • Tác giả dùng free tier của R2 trên Cloudflare để giảm chi phí lưu trữ dữ liệu.

Kết luận

  • Bài viết mô tả các thành phần chính để xây dựng pipeline scraping nhằm theo dõi biến động giá siêu thị.

Tóm tắt của GN⁺

  • Bài viết này chia sẻ trải nghiệm sử dụng Playwright và các dịch vụ cloud để theo dõi biến động giá siêu thị.
  • Nội dung đề cập đến cách scraping các website được render bằng JavaScript, cùng các phương pháp tự động hóa và tối ưu hóa.
  • Bài viết cũng giải thích cách dùng Hetzner và Tailscale để giảm chi phí và vượt qua giới hạn IP.
  • Đây có thể là tài liệu hữu ích cho những ai quan tâm đến web scraping và tự động hóa.

1 bình luận

 
GN⁺ 2024-08-07
Ý kiến trên Hacker News
  • Chia sẻ trải nghiệm từng gặp vấn đề tương tự

    • Đang vận hành một website so sánh giá kính áp tròng tại 30 quốc gia
    • Việc HTML của website thay đổi là vấn đề lớn
    • Ghép nối sản phẩm trên hơn 100 website là rào cản lớn ban đầu
    • Có thể xử lý phần lớn bằng biểu thức chính quy, nhưng vẫn cần ánh xạ thủ công
    • Xây scraper và hạ tầng thì tương đối dễ, nhưng bảo trì mới khó
    • Khi sản phẩm biến mất thì rất khó xác định nguyên nhân lỗi
    • Đây là một dự án thú vị nhưng đầy thử thách và cần giải quyết nhiều vấn đề phiền phức
  • Đang thực hiện một dự án tương tự ở New Zealand

    • Dùng Playwright và Typescript, lưu file Parquet trên cloud storage
    • Mới chỉ thu thập dữ liệu, chưa hiển thị ra ngoài
    • Công việc chính là vượt qua các dịch vụ reverse proxy như Akamai và Cloudflare
    • Ở New Zealand có ít nhất 3 startup đang làm cùng việc này
    • Lạm phát thúc đẩy rất nhiều đổi mới
    • Quan sát thấy các siêu thị có những kiểu làm giá trở nên phức tạp
  • Đã tạo một website tương tự và nhận được nhiều sự quan tâm

    • Dùng máy chủ Linode với 2GB RAM, 5 IPv4, 1000 IPv6
    • Scrape toàn bộ sản phẩm với chu kỳ tối đa 40 phút
    • Dùng curl impersonate và scraping JSON
    • 90% thị trường cung cấp giá qua lời gọi Ajax, 10% còn lại dùng biểu thức chính quy
    • Website: economizafloripa.com.br
  • Hai chuỗi siêu thị lớn của Australia có khả năng hình thành độc quyền thông qua thuật toán AI phân tích giá

    • Các thuật toán AI có thể phối hợp để tối đa hóa lợi nhuận
    • Việc này có thể diễn ra hợp pháp thông qua dữ liệu giá công khai, hoặc bất hợp pháp bằng cách chia sẻ chi phí cung ứng hay dữ liệu lợi nhuận trên từng sản phẩm
    • Người tiêu dùng sẽ phải trả mức giá đã được tối đa hóa lợi nhuận
  • Đã hoạt động hơn 8 năm ở thị trường Thụy Điển

    • Website: matspar.se
    • Khách hàng có thể so sánh sản phẩm từ tất cả các cửa hàng trực tuyến lớn và thêm vào giỏ hàng
    • Có thể so sánh tổng giá rồi xuất giỏ hàng sang cửa hàng mong muốn
    • Scrape hơn 30 triệu mức giá mỗi ngày
  • Nếu có tính minh bạch về giá thì việc theo dõi sẽ dễ hơn nhiều

    • Ví dụ: so sánh giá sữa yến mạch ở các mã bưu chính và cửa hàng tạp hóa khác nhau
    • Có thể theo dõi "shrinkflation" (cùng giá nhưng lượng ít hơn)
    • Cần kiểm tra không chỉ giá mà cả chi phí trên mỗi gram
  • Cách thay đổi để scraper không bị lỗi

    • Có thể thêm các kiểm tra tự động để giá không thay đổi bất thường
    • Ví dụ: không để giá thay đổi quá 100%, số lượng sản phẩm đang hoạt động không thay đổi quá 20%
  • Chia sẻ trải nghiệm theo dõi giá khi chuyển đến khu vực mới

    • Mua sắm ở hai khu chợ hoặc cửa hàng lớn với giá rẻ sẽ dễ hơn
    • Châu Âu: Aldi/Lidl, Mỹ: Costco/Trader Joe's
    • Trực tuyến: CamelCamelCamel/Amazon
    • Mua trực tiếp từ nhà sản xuất có thể rẻ hơn
  • So với scraping, việc vượt qua các cơ chế chặn ngày càng tinh vi mới là phần khó hơn

    • Phải liên tục xoay vòng residential proxy và tránh các mẫu scrape dữ liệu
    • Một số siêu thị che giấu network request
    • Ngay cả việc xem network request và dữ liệu trong ứng dụng di động cũng bị chặn
    • Vì chi phí và khối lượng phát triển liên tục nên kết luận là không đáng làm
  • Vấn đề nội dung được render bằng JavaScript phía client

    • Trớ trêu là dữ liệu dùng để điền vào trang lại được cung cấp dưới dạng JSON đơn giản, nên việc scrape còn đáng tin cậy hơn