2 puan yazan GN⁺ 2024-08-07 | 1 yorum | WhatsApp'ta paylaş

Süpermarket fiyatlarını takip etmek

  • Aralık 2022'de, Yunanistan'daki üç büyük süpermarketin fiyat değişimlerini takip etmek için bir web sitesi oluşturuldu.
  • Bu süreçte çeşitli sorunların çözülmesi gerekti ve çok sayıda ders çıkarıldı.

JavaScript sitelerini scrape etmek

  • Ana sorun, JavaScript ile render edilen web siteleriydi.
  • Web tarayıcısını programatik olarak kontrol etmek için Playwright kullanıldı.
  • Playwright; Chromium, Safari ve Firefox tarayıcılarını destekler ve Node, Java, .NET, Python ile birlikte kullanılabilir.
  • Sonsuz kaydırmayı işlemek ve ürün bilgilerini çıkarmak için kod yazıldı.

Otomasyon

  • M1 MacBook Pro'da tüm süpermarketi scrape etmek 50 dakika ile 2 saat 30 dakika arasında sürüyordu.
  • Geliştirme ve test için iyiydi, ancak daha kalıcı bir çözüme ihtiyaç vardı.

Eski bir dizüstü bilgisayar kullanmak?

  • 2013'ten kalma eski bir dizüstü bilgisayar denenmiş olsa da performansı oldukça hayal kırıklığı yaratmıştı.

Bulut kullanmak?

  • AWS çok pahalıydı, Hetzner ise çok daha ucuzdu.
  • Hetzner sunucularını kullanmaya karar verildi.

Eski dizüstü bilgisayar ve bulut birlikte!

  • Scraping işlemi bulut sunucusunda otomatikleştirildi, eski dizüstü bilgisayar ise CI sunucusu olarak kullanıldı.
  • Concourse ile bir pipeline kuruldu ve scraping işleri her gün çalıştırıldı.

IP kısıtlamasını aşmak

  • Akamai güvenlik duvarı kuralları nedeniyle yerleşik olmayan IP adreslerinden gelen istekler engelleniyordu.
  • İsteklerin ev IP adresinden geliyormuş gibi görünmesi için Tailscale kullanıldı.

Neden ve ne zaman bozulur

  • Scraping projeleri, web sitesi geliştiricilerinin yaptığı değişikliklerden etkilenir.
  • İki tür başarısızlık vardır: breaking change ve non-breaking change.
  • Geri bildirimi hızlı almak önemlidir.

Optimizasyon

  • E-posta bildirimleri, histerezis, timeout, retry ayarları gibi çeşitli optimizasyonlar yapıldı.
  • Daha büyük bir sunucu kullanarak ve veri fetch miktarını azaltarak performans iyileştirildi.

Maliyet

  • Hetzner'de sunucu kullanımı oldukça ucuzdu.
  • Veri depolama maliyetini azaltmak için Cloudflare'in R2 ücretsiz katmanı kullanıldı.

Sonuç

  • Süpermarket fiyat değişimlerini takip etmek için kurulan scraping pipeline'ının temel bileşenleri açıklanıyor.

GN⁺ Özeti

  • Bu yazı, süpermarket fiyat değişimlerini takip etmek için Playwright ve bulut servislerinden yararlanma deneyimini paylaşıyor.
  • JavaScript ile render edilen web sitelerini scrape etme yöntemleri ile otomasyon ve optimizasyon yaklaşımlarını ele alıyor.
  • Hetzner ve Tailscale kullanarak maliyetin nasıl düşürüldüğünü ve IP kısıtlamalarının nasıl aşıldığını açıklıyor.
  • Yazı, web scraping ve otomasyonla ilgilenenler için faydalı olabilir.

1 yorum

 
GN⁺ 2024-08-07
Hacker News görüşleri
  • Benzer bir sorun yaşamış biri deneyimini paylaşıyor

    • 30 ülkede lens fiyat karşılaştırma sitesi işletiyor
    • Web sitelerinin HTML yapısındaki değişiklikler büyük sorun
    • 100'den fazla web sitesinde ürün eşleştirme ilk büyük engel
    • Çoğu şey düzenli ifadelerle çözülebiliyor ama manuel eşleme gerekiyor
    • Scraper ve altyapı kurmak nispeten kolay, bakım ise zor
    • Bir ürün ortadan kaybolduğunda hatanın nedenini anlamak zor
    • Eğlenceli bir proje ama zorlu ve can sıkıcı sorunları çözmek gerekiyor
  • Yeni Zelanda'da benzer bir proje yürütülüyor

    • Playwright ve Typescript kullanılıyor, Parquet dosyaları cloud storage'a kaydediliyor
    • Veriler toplanıyor ama henüz gösterilmiyor
    • Asıl iş, Akamai ve Cloudflare gibi reverse proxy servislerini aşmak
    • Yeni Zelanda'da en az 3 startup aynı işi yapıyor
    • Enflasyon birçok yeniliği tetikliyor
    • Süpermarketlerin fiyatları karmaşık hale getiren kalıplar sergilediği gözlemlenmiş
  • Benzer bir web sitesi yapıp büyük ilgi görmüş biri

    • Linode sunucusunda 2 GB RAM, 5 IPv4, 1000 IPv6 kullanmış
    • Tüm ürünleri en fazla 40 dakikalık aralıklarla scrape etmiş
    • curl impersonate ve JSON scraping kullanmış
    • Pazarın %90'ında fiyatlar Ajax çağrılarıyla geliyor, kalan %10 için düzenli ifadeler kullanılmış
    • Web sitesi: economizafloripa.com.br
  • Avustralya'nın iki büyük süpermarketinin fiyat analiz eden yapay zeka algoritmalarıyla tekel benzeri bir yapı kurabileceği söyleniyor

    • Yapay zeka algoritmaları iş birliği yaparak kârı maksimize edebilir
    • Kamusal fiyat verileri üzerinden yasal olarak, tedarik maliyeti veya ürün başına kâr verilerini paylaşarak ise yasa dışı şekilde bu mümkün olabilir
    • Tüketici sonuçta maksimize edilmiş kârı öder
  • İsveç pazarında 8 yıldan uzun süredir faaliyet gösteren biri

    • Web sitesi: matspar.se
    • Müşteriler tüm büyük çevrimiçi mağazalardaki ürünleri karşılaştırıp sepete ekleyebiliyor
    • Toplam fiyatı karşılaştırdıktan sonra sepeti istedikleri mağazaya aktarabiliyorlar
    • Her gün 30 milyondan fazla fiyat scrape ediliyor
  • Fiyat şeffaflığı olsaydı takip çok daha kolay olurdu

    • Örnek: farklı posta kodları ve marketlerde yulaf sütünün fiyatını karşılaştırmak
    • "Shrinkflation" takibi mümkün olabilir (aynı fiyata daha az miktar sunulması)
    • Yalnızca fiyata değil, gram başına maliyete de bakmak gerekir
  • Scraper'ın bozulmaması için değişiklikleri yönetme yöntemleri

    • Fiyatların anormal değişmemesi için otomatik kontroller eklenebilir
    • Örnek: fiyat %100'den fazla değişmesin, aktif ürün sayısı %20'den fazla değişmesin
  • Yeni bir bölgeye taşındığında fiyat takibi yaptığını paylaşan biri

    • İki market veya büyük mağaza arasında düşük fiyatla alışveriş yapmak daha kolay
    • Avrupa: Aldi/Lidl, ABD: Costco/Trader Joe's
    • Çevrimiçi: CamelCamelCamel/Amazon
    • Doğrudan üreticiden satın almak daha ucuz olabilir
  • Scraping'den çok, giderek daha gelişmiş engelleme sistemlerini aşmak zorlaşıyor

    • Residential proxy'leri sürekli döndürmek ve veri scraping kalıplarından kaçınmak gerekiyor
    • Bazı süpermarketler ağ isteklerini gizliyor
    • Mobil uygulamalarda ağ isteklerini ve verileri incelemek de engelleniyor
    • Maliyet ve sürekli geliştirme ihtiyacı nedeniyle buna değmediği düşünülmüş
  • İstemci tarafı JavaScript ile render edilen sayfalardaki sorun

    • İronik biçimde, siteyi dolduran veriler basit JSON formatında geldiği için scraping daha güvenilir oluyor