2 puan yazan GN⁺ 2024-08-07 | 1 yorum | WhatsApp'ta paylaş
  • Aralık 2022’de yüksek enflasyon ortamında Yunanistan’ın en büyük 3 süpermarketindeki fiyat değişimlerini günlük izlemek için pricewatcher.gr hattı kuruldu
  • Ürün listeleri JavaScript render’ı ve sonsuz kaydırmanın arkasında olduğundan, curl veya requests.get() yerine Playwright ile tarayıcı kontrol edilip veriler DOM’dan çıkarıldı
  • Çalışma ortamı olarak eski bir dizüstü bilgisayar yavaş, AWS EC2 ise pahalı kaldığı için, Hetzner sunucuları yalnızca gerektiğinde oluşturulup 3 scraper paralel çalıştırıldıktan sonra kapatılacak şekilde yapı değiştirildi
  • Akamai’nin konut dışı IP’leri engellediği süpermarketler için trafik ev IP’si üzerinden çıkacak şekilde Tailscale exit node kullanıldı; ayrıca e-posta bildirimleri, sıkı dönüşüm kontrolleri ve ürün sayısı heuristikleriyle hatalar tespit edildi
  • 8vCPU sunucuya geçiş ve görsel isteklerini engelleme ile çalışma süresi azaltıldı; son 31 çalıştırmanın maliyeti Hetzner sunucuları için €4.94, IPv4 için €0.09 ve Cloudflare R2 depolama için €0.00 düzeyinde oldu

JavaScript tabanlı süpermarket sitelerini scrape etmek

  • Aralık 2022’deki yüksek enflasyon döneminde, Yunanistan’ın en büyük 3 süpermarketindeki fiyat değişimlerini takip eden pricewatcher.gr kuruldu
  • Üç süpermarketin e-ticaret sitesi de JavaScript render’ı kullanıyordu ve bazı bölümlerde sosyal medyadaki sonsuz kaydırma gibi, kaydırdıkça ek ürünler yükleniyordu
  • Basit curl veya requests.get() ile ürün verilerini almak mümkün olmadığından Playwright kullanıldı
  • Playwright, tarayıcıyı programatik olarak kontrol eder ve aşağıdaki işleri API üzerinden yapar
    • Yeni sekme açma ve URL’ye gitme
    • DOM inceleme
    • Öğe ayrıntılarını sorgulama
    • İstekleri yakalama ve inceleme
  • Playwright; Chromium, Safari ve Firefox’u destekler, ayrıca Node, Java, .NET ve Python ile kullanılabilir
  • Scraper, sonsuz kaydırmadaki load more öğesini bulup sürekli kaydırdıktan sonra, li.product-item listesinden stokta olmayan işaretli ürünleri hariç tuttu
  • Son olarak her ürün `` içinden ürün adı, fiyat, görsel, bağlantı gibi bilgiler parse edildi ve aynı işlem sonraki ürün kategorilerinde tekrarlandı

Her gün çalışacak ortamı seçmek

  • M1 MacBook Pro’da tek bir süpermarketi tamamen işlemek 50 dakika ile 2 saat 30 dakika sürüyordu ve 3 scraper’ı paralel çalıştırmak da belirgin bir fark yaratmıyordu
  • Geliştirme ve test için dizüstü bilgisayar yeterliydi, ancak günlük çalışacak kalıcı bir ortama ihtiyaç vardı
  • Eski dizüstü bilgisayarda tek başına çalıştırma

    • İlk deneme 2013 model eski bir dizüstü bilgisayardı
    • Özellikleri 2.20GHz çift çekirdekli M serisi işlemci ve 4GB RAM’di; daha sonra RAM 12GB’a çıkarıldı
    • Ancak “hızlı” süpermarketin bile işlenmesi 2 saatten fazla sürdüğünden beklenen performans sağlanamadı
  • Bulutta çalıştırma

    • AWS üzerinde 4 çekirdek ve 8GB RAM seviyesinde EC2 instance’ları değerlendirildi, ancak bir yan proje için maliyet yüksekti
    • Yazının yazıldığı tarihte eu-north-1 bölgesindeki c5a.xlarge saat başına $0.1640, aylık $118.08 veya yıllık $1,416.96 seviyesindeydi
    • Hetzner’deki benzer cpx31 sunucusu aylık $17.22 (€15.72), yıllık $206.64 ile AWS’den yaklaşık 7 kat daha ucuzdu
    • Sonuç olarak çalışma ortamı olarak Hetzner seçildi

Concourse ile kurulan günlük pipeline

  • Eski dizüstü bilgisayar scrape işini doğrudan yapmıyor, bunun yerine Hetzner sunucularına işi devreden bir CI sunucusu görevi görüyordu
  • CI aracı olarak Concourse kullanıldı
    • Concourse kendisini “a continuous thing-doer” olarak tanımlıyor
    • Deklaratif pipeline modeli ve giriş sürüm yönetimiyle yeniden üretilebilir build’leri hedefliyor
  • Pipeline her gece şu sırayla çalışıyordu
    • Scraping sunucusunu oluşturma
    • 3 süpermarket için scraping işlerini paralel çalıştırma
    • Tüm işler tamamlanınca maliyeti düşürmek için sunucuyu kapatma
    • Her scraper’ın ham çıktısını dönüşüm işine aktarma
    • Dönüştürülen verileri pricewatcher.gr içine yükleme
    • Herhangi bir aşama başarısız olursa e-posta bildirimi gönderme

IP kısıtlamalarını aşmak ve Tailscale exit node

  • Testte kullanılan süpermarketlerden biri sorunsuz çalıştı, ancak bir diğeri Akamai arkasındaydı ve konut dışı IP isteklerini engelleyen güvenlik duvarı kuralı açıktı
  • Gereken yapı normal bir VPN’in tersiydi: isteklerin gerçekten ev IP’sinden çıkıyormuş gibi görünmesi gerekiyordu
  • Tailscale ile birden fazla cihaz aynı ağdaymış gibi bağlandı
  • Tailscale’de bir cihaz exit node olarak ayarlanırsa, diğer cihazların trafiği bu düğüm üzerinden çıkacak şekilde yönlendirilebilir
  • Eski dizüstü bilgisayar aynı zamanda scraping trafiği için exit node görevini de üstlendi
  • Kullanılan ISP’nin CGNAT kullanması, yani genel IP’nin belirli bir kişiye değil başka abonelerle de paylaşılıyor olması da ayrı bir değişken olarak kaldı

Hata türleri ve bunları tespit etme yöntemi

  • Bu kurulum 1,5 yıl boyunca çalıştı ve genel olarak güvenilir davrandı
  • Scraping projeleri kaçınılmaz olarak hedef web sitelerindeki geliştirici değişikliklerinden etkilenir
  • Hatalar kabaca ikiye ayrıldı
  • Kıran değişiklikler

    • Sitedeki bir değişiklik scraper’ın doğrudan bozulmasına yol açar
    • Örnekler şunlardır
      • Bir anket eklenmesi ve ekstra bir düğmeye basılması gerekmesi
      • Düzenin tamamen değişmesi ve scraper’ın ciddi biçimde refactor edilmesi gerekmesi
  • Kırmayan değişiklikler

    • Scraper çalışmaya devam eder, ancak verinin yorumlanması bozulur; bu daha zordur
    • Örneğin fiyat gösterimi değişip ondalık kısmı `` içine ayırırsa, €1.99’luk cips €199 gibi parse edilebilir
    • Bu tür değişiklikleri yakalamak için dönüşüm aşaması girdiyi mümkün olduğunca sıkı doğrulayacak şekilde kuruldu
    • Her gün çalıştığı için problemi fark etmek için zaman vardı, ancak tatildeyken bozulması yine de bir kaygı unsuruydu

Çalışma süresi ve kararlılığı optimize etmek

  • Genel mimari en baştan beri neredeyse aynı kaldı, ancak güvenilirliği artırmak ve manuel işi azaltmak için çeşitli parçalar değiştirildi
  • Uygulanan iyileştirmeler arasında şunlar vardı
    • Hata durumunda e-posta bildirimi
    • Belirli bir süpermarkette ürün sayısı fazla ya da az olduğunda bildirim gönderen heuristikler
    • Timeout’lar
    • Baştan başlamayan retry mekanizması
  • En büyük darboğaz scraping çalışma süresiydi
    • Süre uzadıkça maliyet artıyordu
    • Hata sonrası baştan retry etmek gerektiğinde rahatsızlık büyüyordu
  • Daha büyük sunucu kullanmak

    • Sunucu 4vCPU ve 16GB RAM’den 8vCPU ve 16GB RAM konfigürasyonuna geçirildi
    • Çalışma süresi yaklaşık %20 azaldı ve MBP’de elde edilen performansa yakın bir seviyeye geldi
    • Scraping sunucusu yalnızca yaklaşık 2 saat kullanıldığından fiyat farkı ihmal edilebilir düzeydeydi
  • Daha az veri indirmek

    • Playwright’ın page.route özelliği kullanılarak görsel istekleri engellendi
    • .png, .jpg istekleri abort edilerek ürünler yüklenirken görsellerin indirilmesi önlendi
    • Bu yöntem scraping’i hızlandırdı ve bant genişliği ile hedef sitenin maliyetini de az da olsa düşürdü

31 çalıştırma için maliyet

  • Son Hetzner faturasında maliyetler şöyleydi
    • Oluşturulan 31 sunucu: €4.94
    • Bu sunuculara atanan 31 IPv4 adresi: €0.09
  • Scraping verileri Cloudflare R2 üzerinde saklandı
  • Cloudflare R2’nin 10GB ücretsiz katmanı henüz aşılmadığı için depolama maliyeti €0.00 oldu
  • Genel olarak bu pipeline, Playwright, Hetzner, Concourse, Tailscale ve Cloudflare R2 birleşimiyle süpermarket fiyat değişimlerini günlük izleyen bir yapı olarak çalıştı

1 yorum

 
GN⁺ 2024-08-07
Hacker News yorumları
  • Bu yılın başından beri New Zealand için benzer bir şey yapıyorum. Verileri Playwright/Typescript ile kazıyıp Parquet dosyaları olarak bulut depolamaya kaydediyorum; henüz ekranda göstermedim.
    İşin büyük kısmı Akamai, Cloudflare gibi reverse proxy servislerini aşmaya gidiyor. İlk yaptığımda bunu kimsenin yapmadığını sanıyordum ama şimdi NZ’de aynı işi yapan en az 3 startup olduğunu biliyorum. Enflasyon burada epey inovasyonu tetiklemiş gibi görünüyor.
    Örüntüler beklendiği gibi. Süpermarketler fiyatları olabildiğince karmaşık hale getirmeye yönelik olağan taktiklerini kullanıyor ve “testere dişi” fiyat dalgalanmalarıyla zamanı kısıtlı olanlarla parası kısıtlı olanları ayırıyor. Marka sadakati olan müşterilerle fiyata duyarlı müşterileri ayırdıkları da sık görülüyor; örneğin popüler 3 çikolata markası varsa her hafta bunlardan yalnızca biri makul fiyata satılıyor.

    • Süpermarketlerin fiyat güncellemeleriyle müşteri segmentasyonunu nasıl kötüye kullandığını merak ediyorum. Zamanı kısıtlı olanlarla gerçekten parası kısıtlı olanların genelde nasıl tepki verdiğini de bilmek isterim.
      “Marka sadakati olan müşterilerle fiyata duyarlı müşterileri ayırıyorlar. Popüler 3 çikolata markası varsa her hafta bunlardan yalnızca biri makul fiyata satılıyor” kısmı özellikle ilgimi çekti.
    • Australia’da bu yaklaşımın yasallığı belirsiz. NZ’de de benzer olabilir diye düşünüyorum.
      AU’da bu tür scraper’lar sık sık ortaya çıkıp kayboluyor ama genelde büyük süpermarketler tarafından engelleniyorlar. Yararlılık ile “neden böyle bir şey yok?” sorusunun tekrar eden bir döngüsü var; aslında daha önce defalarca vardı.
    • India için https://bbdeals.in/ sitesini yaptım. Daha çok meyve alırken kullanıyorum; harcamadan yaklaşık %20 tasarruf sağlıyor, bugünlerde fena değil.
      Crawler’ı ve onu destekleyen altyapıyı kurmak 20 saat bile sürmedi.
    • Bir Kiwi olarak bu projeyi ya da kendi projenizi yayımlayıp yayımlayamayacağınızı merak ediyorum. Epey ilgimi çekti.
    • İnternetten market teslimatı siparişi verenler fiyat karşılaştırmasından fayda sağlayabilir. Çünkü aynı anda birden fazla mağazadan sipariş verebilirler.
      Üstelik birden fazla mağazanın fiyatlarının hepsine sahip tek bir pazar yeri olduğu için daha da kullanışlı.
  • Güzel yazı. Benim işlettiğim kontakt lens fiyat karşılaştırma sitesi https://lenspricer.com/ için de benzer sorunlar yaşadım; yaklaşık 30 ülkede faaliyet gösteriyor. Web sitelerinin HTML’i değiştirmesinin gerçekten baş ağrısı olduğu konusunda katılıyorum.
    Başlarda en büyük engellerden biri 100’den fazla web sitesinde aynı ürünü eşleştirmekti. Ürün adları benzersiz olacak sanıyorsunuz ama herkes kendi tarzında biraz değiştirerek yazıyor. Çoğu regex ile hallediliyor, ancak hatırı sayılır bir kısmını elle eşlemek gerekti; bazılarında AI kullandım ama hepsini kendim doğruladım.
    Scraper ve altyapı kurmak nispeten kolay. Zor olan, tüm scraper’ların bakımını yapmak ve bir ürün siteden kaybolduğunda bunun scraper hatası mı, engelleme mi, site değişikliği mi, yoksa crawl sırasında sitenin bakımda olması mı olduğunu ayırt etmek.
    Eğlenceli bir proje ama zaman zaman zor ve düzeltmesi sinir bozucu pek çok sorun var.

    • Gerekli bir işi yapıyorsunuz. Her yıl temel bir ürün olan kontakt lens alırken sigorta şirketi yüzünden uğraşıyorum.
      Fiyatlar birbirinden farklı, teminat da genelde posta yoluyla geri ödeme şeklinde yaklaşık %30 civarında işliyor.
    • Çalışırken kontakt lens takılıp takılamayacağını merak ediyorum. Uzun süre monitöre bakınca gözlerimin yorulduğunu hissediyorum; buna bir çözüm bulup bulmadığınızı bilmek isterim.
    • Germany sayfasında fiyatın altında “bazı bağlantılar sponsorlu bağlantı olabilir” yazıyor ama hangi bağlantılar olduğu belirtilmiyor. Bunun yasal olup olmadığını merak ediyorum.
      Mağaza sayısı da çok az görünüyor; belki de tüm bağlantılar sponsorlu bağlantıdır. idealo.de’de daha düşük fiyatlar da buldum.
    • ABD’de en azından büyük perakendeciler, fiyat karşılaştırmayı zorlaştırmak için tedarikçilere biraz farklı SKU’lar ürettiriyor.
      Costco bununla oldukça ünlü; mağazada sattığı neredeyse tüm elektronik ürünler ve birçok başka ürün özel SKU. Ürün konfigürasyonu da çoğu zaman biraz farklı oluyor.
    • Bence bu tür durumlar LLM’lerin gerçekten faydalı olabileceği kullanım alanlarından biri olabilir.
  • Şehrimde epey ilgi gören benzer bir web sitesi yaptım. Uygulama ve web sitesi verilerini de kazıyorum; Linode’da 2 GB RAM’li tek bir sunucuya 5 IPv4 ve ücretsiz 1000 IPv6 bağlayarak kullanıyorum.
    Tüm ürünler en fazla 40 dakikalık aralıklarla toplanıyor; ortalama yaklaşık 25 dakika. curl-impersonate kullanıyorum ve mümkün olduğunca JSON kazıyorum. Pazarın %90’ı fiyatları Ajax çağrılarıyla sağlıyor, kalan %10’un HTML’i regex ile kolayca parse ediliyor.
    https://www.economizafloripa.com.br adresinde görebilirsiniz.

    • Uygulama ve web sitesi verilerini kazıyıp sonra bunları işletmelere tekrar satmaya çalışıyorsunuz; hatta verilerin AI eğitimi için kullanılmasını öneriyorsunuz. Üstelik ekip her şeyi elle yapıyormuş gibi de gösteriyorsunuz.
      https://www.economizafloripa.com.br/?q=parceria-comercial
      O sayfayı görünce proje, “temel ihtiyaç ürünleri satan şirketlerden kontrolü geri alan insanlar için yararlı bir araç” olmaktan çıkıp “başka bir para kazanma girişimi” gibi görünmeye başladı. Elbette bu sizin tercihiniz, ama ana sayfayı okuduğumda daha etik bir motivasyon beklemiştim.
    • Bu akışta IPv6 rotasyonu nasıl çalışıyor merak ediyorum.
  • Güzel yazı.
    Scraping ile parsing’i ayrı süreçlere bölmenin en iyisi olduğunu düşünüyorum. Ham JSON’u ya da HTML’i saklarsanız, istediğiniz zaman geri dönüp parser’ı düzelterek yeniden uygulayabilirsiniz.
    Yüksek lisans projemin parçası olarak Hollanda için benzer bir sistem ve web sitesi yaptım: https://www.superprijsvergelijker.nl/
    Projemdeki scraping’in çoğu, JSON API’lerine basit HTTP çağrıları gönderme şeklinde. Bazı web sitelerinde geçerli bir oturum çerezi almak ve bot önleme ile CAPTCHA’yı aşmak için Playwright instance’ı kullanılıyor. Kalan crawler/scraper’lar, parser’lar ve API Haskell ile yapıldı ve AWS ECS üzerinde çalışıyor. Web sitesi NextJS.
    Hâlâ çözmeye çalıştığım temel sorun, farklı süpermarketlerdeki ürünleri birbirine bağlayıp fiyatları tek ekranda listelemek. Bir örnek burada: https://www.superprijsvergelijker.nl/supermarkt-aanbieding/6...
    Ürün için en az bir doğru barkod numarası sağlanırsa çoğunlukla iyi çalışıyor.

    • Aynen, ben de tam olarak böyle yapıyorum ve itiraf etmesi utanç verici olacak kadar çok kez faydasını gördüm. Ham JSON/HTML saklamak gerçekten çok işe yarıyor.
    • Harika. Böyle bir şey arıyordum.
  • Avustralya’daki iki büyük süpermarket için, iki tarafta da yalnızca fiyat analizi yapay zeka algoritmaları çalıştırmanın rekabete aykırı fiyatlandırmaya dayalı bir duopol yapısı oluşturabileceğini düşünüyorum. Algoritmaların eninde sonunda kârı maksimize etmek için işbirliği yönüne gitme olasılığı yüksek.
    Bu, herkese açık fiyatlarla yasal olarak yapılabilir; tedarik maliyeti veya ürün bazlı kâr verileri paylaşılırsa yasa dışı olarak da mümkün. Sonuç muhtemelen benzer olur.
    Eğitilmiş iki yapay zeka, çok boyutlu, belki de aşırı yüksek boyutlu regresyon analiziyle tuhaf biçimlerde kâr maksimizasyonu yapar; tüketici de görünürde rakip olan şirketlerin maksimize edilmiş kârının yükünü taşır. Fiyat verileri bu şekilde elde edilebiliyorsa, duopole odaklanan iki makine öğrenimi uygulamasını çalıştırmak için çok fazla şeye ihtiyaç yok.

    • Norveç’in “rekabet otoritesi” (https://konkurransetilsynet.no/norwegian-competition-authori...) tam da bu nedenle, herkese açık ve şeffaf gıda fiyatı bilgilerine sık sık eleştirel yaklaşıyor.
      Mantıkları şu: Tüm fiyatlar açık olursa tüketiciler sonunda daha yüksek fiyat öder. Süpermarketler fiyatları herkesin maksimum kâr elde ettiği noktaya hizalar.
      Buradaki süpermarketler yıllardır “fiyat avcıları” çalıştırıyor; bunlar rakip mağazalara gidip her şeyin fiyatını kaydeden kişiler.
      Norveç’te sıkça şunu görürsünüz: Süpermarket A bir hafta belirli ürünlerde indirim yaparsa, bir sonraki hafta ya da ondan sonraki hafta Süpermarket B de müşterileri çekmek için benzer bir indirim yapar.
    • Aradığın kelime karteldi. Yalnız insanlar arasında değil, yazılımla yapılan kartel.
  • Bu tür değişiklikleri yakalamak için otomatik kontroller eklenebilir gibi geliyor. Örneğin sağduyu kontrolü başarısız olursa fiyat/ürün değişiklikleri senkronize edilmez.
    Her fiyatın %100’den fazla değişmemesi, aktif ürün sayısının da %20’den fazla değişmemesi gibi eşikler konabilir.

    • Programlamada sağduyu kontrolleri hafife alınıyor. Performans maliyeti de düşük; aksi halde durumu kirletecek hataları erken yakalıyor.
    • Ben de düşündüm ama ürün fiyatının %100’den fazla sıçradığı durumlar gördüm.
      Bunun yerine bu tür heuristikleri scraping’in başarılı olup olmadığını doğrulamak için kullandım. Örneğin bugün çekilen ürün sayısının son 7 gün ortalamasının yaklaşık %10 aralığında olup olmadığını kontrol etmek gibi.
  • Zor olan scraping’in kendisi değil, giderek daha sofistike hale gelen engelleme mekanizmalarını aşmak.
    Konut tipi proxy’leri sürekli döndürmek, yüksek puanlı olanları kullanmak ve veri scraping desenlerini belli etmemek gerekiyor. Bazı süpermarketler ağ isteklerini Network sekmesinde göstermediği için yalnızca API yanıtlarını almak mümkün olmuyor.
    Mobil uygulamaya man-in-the-middle saldırısı yapıp ağ isteklerini ve verileri görmeye çalışsanız bile, düzgün kamufle olmazsanız engelleniyorsunuz.
    Denedim ama maliyet ve sürekli geliştirme işi nedeniyle değmediğine karar verdim. Hatta bazı süpermarket fiyat karşılaştırma servisleri, scraping için düşük ücretli işgücü kullanıyor.

    • Fiyat verilerini API üzerinden açık yayımlamayı yasal olarak zorunlu kılabilsek harika olurdu. O zaman engelleme mekanizmalarıyla uğraşmak gerekmez.
    • Neyse ki henüz o aşamaya gelmedim.
      Bu bir yan proje olduğu için zaman talebi çok sıklaşırsa bırakıp kodu ve verilerin tamamını açık yayımlamayı düşünüyorum.
      Ama ağ isteklerinin Network sekmesinde görünmemesi nasıl mümkün, merak ediyorum.
      Benim için en zor kısım, süpermarketler arasında ürünleri eşleştirip karşılaştırmak.
    • OCR kullanıp yalnızca ürün listesi görsellerinin ekran görüntüsünü almak işe yaramaz mıydı? İdeal değil ama yönteme bağlı olarak izlenmesi zor ya da imkânsız olabilir.
    • Tarayıcı eklentisi ile kitle kaynaklı hale getirilebilir.
  • Ürünlerde fiyat şeffaflığı olsa iyi olurdu. Mağaza ve bölge bazında bu süreçleri takip etmek çok daha kolaylaşırdı.
    Örneğin süt alternatifi olan yulaf sütünün fiyatını posta kodu ve markete göre karşılaştırabilirdiniz. Ayrıca fiyat aynı kalırken miktarın azalması anlamına gelen “shrinkflation”ı da takip edebilirdiniz.
    Bu anlamda fiyatları takip ediyormuşsunuz gibi görünüyor; gram ya da ons başına maliyete de bakıp bakmadığınızı merak ediyorum. Üretici veya mağaza fiyatı aynı tutup tüketiciye daha az miktar verebilir; aracın bunu yakalayıp yakalayamayacağını merak ediyorum.

    • kg, L gibi birim fiyatları da takip ediyorum. Bu sayıyı mı gösterip grafiğe döksem, yoksa kasada fiilen ödenen fiyatı mı göstersem diye düşündüm; insanların gördüğü fiyata daha “alışık” kalmak için ikincisini seçtim.
      Yine de kolayca eklenebilecek bir özellik ve shrinkflation yaşandıysa ne zaman olduğunu gösterebilir.
    • Marketlerin etiketlerde birim fiyatı yazmaması beni kişisel olarak gerçekten rahatsız ediyor. Bunun müşteri düşmanı olmayan bir amacı olabileceğini hayal etmek zor.
    • Ürün maliyet fiyatlarının açıklanmasının zorunlu olduğunu düşünmek güzel olurdu. Çiftçinin X aldığını, üreticinin Y aldığını, marketin de üzerine Z eklediğini görmek isterdim.
  • İsveç pazarında bu işi 8 yıldan uzun süredir yapıyoruz. https://www.matspar.se/ adlı bir web sitesi var; müşteriler büyük çevrimiçi mağazalardaki tüm ürünlere göz atıp fiyatları karşılaştırabiliyor, ardından istedikleri ürünleri sepete ekleyebiliyor
    Son aşamada teslimat ücreti dahil sepetin toplam tutarını karşılaştırıp, sepeti istedikleri mağazaya aktararak sipariş verebiliyorlar
    Kurucu ortak ve mevcut CTO olduğum için bu süre boyunca epey scraping ve bakım işi yaptım. Her gün 30 milyondan fazla fiyatı çekiyoruz

    • İş tarafında iş modelini merak ediyorum. Nasıl gelir elde ettiklerini ve uzun vadeli hedeflerinin ne olduğunu bilmek isterim
      Açık verilere göre şirketin geliri yaklaşık 400 bin dolar ve 6 çalışanı var: https://www.allabolag.se/5590076351/matspar-i-sverige-ab
    • Scraping yaklaşımı hakkında teknik bir yazı olup olmadığını merak ediyorum. Ne tür zorluklar yaşadıklarını ve bunları nasıl çözdüklerini daha fazla okumak isterim
  • Yeni bir bölgeye taşındığımda fiyat takibi yapmıştım, ama şimdi sürekli düşük fiyatları koruyan pazarlar ya da iki büyük mağazadan alışveriş yapmanın çok daha kolay olduğunu düşünüyorum
    Avrupa’da muhtemelen Aldi/Lidl olur
    ABD’de Costco/Trader Joe's olabilir
    Çevrimiçi tarafta CamelCamelCamel/Amazon var. Gıda değil; sağlık/güzellik/bazı elektronik ürünler tarafında
    Üreticiden doğrudan satın almak mümkünse bazen bu daha iyi olabiliyor. Örneğin sevdiğim belirli bir sabun markasını toptan satış sitesinden toplu aldığımda perakende fiyatının yarısından da ucuzdu. Şampuanı da galonla doğrudan almak, herhangi bir perakendeciden çok daha ucuzdu

    • Benim deneyimime göre ABD’de Costco/Walmart/Aldi
      Trader Joe's’un kalitesi daha yüksek, ama genel olarak daha pahalı
    • ABD’de de ALDI var, ama bölgesel olarak bulunuyor. Trader Joe’s, ALDI ile aynı aileye ait ve yakın zamana, yani yaklaşık 10 yıl öncesine kadar aynı bölgede ikisini birlikte görmek zordu