2 คะแนน โดย GN⁺ 2024-08-07 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

ติดตามราคาซูเปอร์มาร์เก็ต

  • ในเดือนธันวาคม 2022 ได้สร้างเว็บไซต์เพื่อติดตามการเปลี่ยนแปลงราคาของซูเปอร์มาร์เก็ตรายใหญ่ 3 แห่งในกรีซ
  • ระหว่างกระบวนการนี้ต้องแก้ปัญหาหลายอย่าง และได้บทเรียนมากมาย

การสแครปเว็บไซต์ที่เป็น js

  • ปัญหาหลักคือเว็บไซต์ที่เรนเดอร์ด้วย JavaScript
  • ใช้ Playwright เพื่อควบคุมเว็บเบราว์เซอร์แบบโปรแกรมmatically
  • Playwright รองรับเบราว์เซอร์ Chromium, Safari, Firefox และใช้งานร่วมกับ Node, Java, .NET, Python ได้
  • เขียนโค้ดเพื่อจัดการ infinite scroll และดึงข้อมูลสินค้า

ระบบอัตโนมัติ

  • บน M1 MacBook Pro การสแครปซูเปอร์มาร์เก็ตทั้งหมดใช้เวลาตั้งแต่ 50 นาทีถึง 2 ชั่วโมง 30 นาที
  • แม้จะดีสำหรับการพัฒนาและทดสอบ แต่ก็ต้องการโซลูชันที่ถาวรกว่านี้

ใช้โน้ตบุ๊กเก่า?

  • ลองใช้โน้ตบุ๊กเก่าจากปี 2013 แต่ประสิทธิภาพน่าผิดหวังมาก

ใช้คลาวด์?

  • AWS แพงเกินไป ส่วน Hetzner ถูกกว่ามาก
  • จึงตัดสินใจใช้เซิร์ฟเวอร์ของ Hetzner

ใช้ทั้งโน้ตบุ๊กเก่าและคลาวด์!

  • ทำระบบอัตโนมัติสำหรับการสแครปบนเซิร์ฟเวอร์คลาวด์ และใช้โน้ตบุ๊กเก่าเป็นเซิร์ฟเวอร์ CI
  • ตั้งค่า pipeline ด้วย Concourse และรันงานสแครปทุกวัน

หลีกเลี่ยงการจำกัด IP

  • คำขอจาก IP ที่ไม่ใช่ที่อยู่อาศัยถูกบล็อกเพราะกฎไฟร์วอลล์ของ Akamai
  • ใช้ Tailscale เพื่อทำให้คำขอดูเหมือนมาจาก IP ที่บ้าน

สาเหตุและช่วงเวลาที่ล้มเหลว

  • โปรเจกต์สแครปได้รับผลกระทบจากนักพัฒนาเว็บไซต์
  • ความล้มเหลวมี 2 ประเภท: breaking change และ non-breaking change
  • การได้รับฟีดแบ็กอย่างรวดเร็วเป็นสิ่งสำคัญ

การปรับแต่ง

  • ทำการปรับแต่งหลายอย่าง เช่น การแจ้งเตือนทางอีเมล, hysteresis, timeout และการตั้งค่า retry
  • ปรับปรุงประสิทธิภาพด้วยการใช้เซิร์ฟเวอร์ที่ใหญ่ขึ้นและลดการดึงข้อมูล

ค่าใช้จ่าย

  • ค่าใช้เซิร์ฟเวอร์บน Hetzner ถูกมาก
  • ลดต้นทุนการเก็บข้อมูลด้วย free tier ของ R2 จาก Cloudflare

บทสรุป

  • อธิบายองค์ประกอบหลักของการสร้าง pipeline สำหรับสแครปเพื่อติดตามการเปลี่ยนแปลงราคาซูเปอร์มาร์เก็ต

สรุปของ GN⁺

  • บทความนี้แบ่งปันประสบการณ์การใช้ Playwright และบริการคลาวด์เพื่อติดตามการเปลี่ยนแปลงราคาซูเปอร์มาร์เก็ต
  • กล่าวถึงวิธีสแครปเว็บไซต์ที่เรนเดอร์ด้วย JavaScript รวมถึงวิธีทำระบบอัตโนมัติและการปรับแต่ง
  • อธิบายวิธีลดต้นทุนและหลีกเลี่ยงการจำกัด IP ด้วย Hetzner และ Tailscale
  • บทความนี้อาจมีประโยชน์สำหรับผู้ที่สนใจเว็บสแครปและระบบอัตโนมัติ

1 ความคิดเห็น

 
GN⁺ 2024-08-07
ความคิดเห็นจาก Hacker News
  • แชร์ประสบการณ์ที่เจอปัญหาคล้ายกัน

    • กำลังทำเว็บเปรียบเทียบราคาเลนส์ใน 30 ประเทศ
    • การเปลี่ยนแปลง HTML ของเว็บไซต์เป็นปัญหาใหญ่
    • การจับคู่สินค้าในเว็บไซต์มากกว่า 100 แห่งเป็นอุปสรรคใหญ่ในช่วงแรก
    • จัดการได้เกือบทั้งหมดด้วย regular expression แต่ยังต้องแมปด้วยมือ
    • การทำ scraper และวางโครงสร้างพื้นฐานค่อนข้างง่าย แต่การดูแลรักษายาก
    • เมื่อสินค้าหายไป ก็ยากที่จะหาสาเหตุของข้อผิดพลาด
    • เป็นโปรเจกต์ที่สนุก แต่ท้าทายและต้องแก้ปัญหาจุกจิกที่น่ารำคาญ
  • กำลังทำโปรเจกต์ลักษณะคล้ายกันในนิวซีแลนด์

    • ใช้ Playwright และ Typescript เก็บไฟล์ Parquet ไว้ใน cloud storage
    • ตอนนี้เก็บข้อมูลอย่างเดียว ยังไม่ได้แสดงผล
    • งานหลักคือการหลบเลี่ยงบริการ reverse proxy อย่าง Akamai และ Cloudflare
    • ในนิวซีแลนด์มีสตาร์ตอัปอย่างน้อย 3 รายที่ทำงานแบบเดียวกัน
    • เงินเฟ้อกระตุ้นให้เกิดนวัตกรรมจำนวนมาก
    • สังเกตเห็นรูปแบบที่ซูเปอร์มาร์เก็ตทำให้ราคาเข้าใจยากขึ้น
  • เคยทำเว็บไซต์ลักษณะคล้ายกันและได้รับความสนใจมาก

    • ใช้เซิร์ฟเวอร์ Linode พร้อม RAM 2GB, IPv4 5 รายการ, IPv6 1000 รายการ
    • scrape สินค้าทั้งหมดทุก ๆ สูงสุด 40 นาที
    • ใช้ curl impersonate และการ scrape แบบ JSON
    • 90% ของตลาดให้ราคาผ่าน Ajax call ส่วนอีก 10% ใช้ regular expression
    • เว็บไซต์: economizafloripa.com.br
  • ซูเปอร์มาร์เก็ตใหญ่ 2 แห่งของออสเตรเลียอาจผูกขาดได้ผ่านอัลกอริทึม AI วิเคราะห์ราคา

    • อัลกอริทึม AI อาจร่วมมือกันเพื่อเพิ่มกำไรสูงสุด
    • ทำได้อย่างถูกกฎหมายผ่านข้อมูลราคาสาธารณะ และทำได้อย่างผิดกฎหมายผ่านการแชร์ต้นทุนซัพพลายหรือข้อมูลกำไรต่อสินค้า
    • ผู้บริโภคจะเป็นฝ่ายจ่ายกำไรที่ถูกดันให้สูงสุด
  • ดำเนินงานในตลาดสวีเดนมานานกว่า 8 ปี

    • เว็บไซต์: matspar.se
    • ลูกค้าสามารถเปรียบเทียบสินค้าและเพิ่มลงตะกร้าจากร้านค้าออนไลน์หลักทั้งหมดได้
    • เปรียบเทียบราคารวมแล้วส่งออกตะกร้าไปยังร้านที่ต้องการได้
    • scrape ราคามากกว่า 30 ล้านรายการต่อวัน
  • ถ้ามีความโปร่งใสด้านราคา การติดตามจะง่ายขึ้นมาก

    • ตัวอย่าง: เปรียบเทียบราคานมโอ๊ตในรหัสไปรษณีย์และร้านขายของชำที่ต่างกัน
    • สามารถติดตาม "Shrinkflation" ได้ (ให้ปริมาณน้อยลงในราคาเท่าเดิม)
    • ควรดูไม่ใช่แค่ราคา แต่รวมถึงต้นทุนต่อกรัมด้วย
  • วิธีเปลี่ยนแปลงโดยไม่ให้ scraper ล้มเหลว

    • สามารถเพิ่มการตรวจสอบอัตโนมัติเพื่อไม่ให้ราคาเปลี่ยนผิดปกติ
    • ตัวอย่าง: ไม่ให้ราคาเปลี่ยนเกิน 100% และไม่ให้จำนวนสินค้าที่ active เปลี่ยนเกิน 20%
  • แชร์ประสบการณ์ติดตามราคาเมื่อต้องย้ายไปพื้นที่ใหม่

    • การซื้อของจากตลาดหรือร้านใหญ่เพียงสองแห่งในราคาถูกทำได้ง่ายกว่า
    • ยุโรป: Aldi/Lidl, สหรัฐฯ: Costco/Trader Joe's
    • ออนไลน์: CamelCamelCamel/Amazon
    • การซื้อจากผู้ผลิตโดยตรงอาจถูกกว่า
  • สิ่งที่ยากกว่าการ scrape คือการหลบเลี่ยงระบบบล็อกที่ซับซ้อนขึ้นเรื่อย ๆ

    • ต้องหมุนเวียน residential proxy ตลอดเวลาและหลีกเลี่ยงรูปแบบการ scrape ข้อมูล
    • ซูเปอร์มาร์เก็ตบางแห่งซ่อน network request ไว้
    • แม้แต่การดู network request และข้อมูลจากแอปมือถือก็ถูกบล็อก
    • เมื่อคิดถึงต้นทุนและงานพัฒนาอย่างต่อเนื่องแล้ว จึงมองว่าไม่คุ้มค่า
  • ปัญหาการเรนเดอร์ด้วย JavaScript ฝั่งไคลเอนต์

    • น่าแปลกที่ข้อมูลที่ใช้เติมหน้าเว็บกลับถูกส่งมาเป็น JSON แบบเรียบง่าย ทำให้การ scrape เชื่อถือได้มากกว่า