Scarnox · Blog

Web scraping ile fiyat takibi: pratik bir rehber

Fiyat takibi, bir üründeki fiyatı bir dizi sitede belirli aralıklarla kontrol edip gördüklerinizi zaman içinde karşılaştırmak için kaydetmektir. Perakendeciler, pazaryerleri ve analistler bunu kullanır. Fiyat scraping'i aynı zamanda bir scraper'ın captcha ile karşılaştığı en yaygın yollardan biridir, bu yüzden tasarımı doğru yapmaya değer. Bu rehber neyi takip edeceğinizi, hiç ayrıştırılmak üzere tasarlanmamış sayfalardan sayıları nasıl alacağınızı, değişiklikleri nasıl saklayıp uyaracağınızı ve bunu yaparken site kurallarına nasıl uyacağınızı anlatır.

Kullanmaya izin verilen bir kaynakla başlayın

Kod yazmadan önce sitenin bu veriye resmi bir yol sunup sunmadığını kontrol edin: bir ürün akışı, bir API ya da bir iş ortaklığı programı. Bunlar scraping'den daha güvenilirdir ve hukuki ve teknik riskin çoğunu ortadan kaldırır. Scraping, resmi bir yolun olmadığı herkese açık sayfalar için bir yedek seçenektir ve kullanım koşulları ile robots.txt yine geçerlidir. Hukuki genel bakış genel soruları ele alır.

Beş parçalı mimari

Güvenilir bir fiyat takip sistemi beş parçadan oluşur ve bunları ayrı tutmak hata ayıklamayı kolaylaştırır:

  1. Zamanlayıcı. Hangi ürün sayfalarının ne zaman ziyaret edileceğine karar verir. Ziyaretleri gün içine yayın; her şeyi aynı dakikada kontrol etmeyin.
  2. Getirici. Sayfayı indirir; kibar bir hız, yeniden deneme ve önbellek ile.
  3. Ayrıştırıcı. Fiyatı, para birimi bağlamını ve stok durumunu çıkarır.
  4. Depo. Her gözlemi zaman damgasıyla saklar, böylece bir geçmişiniz olur.
  5. Uyarıcı. Yeni değeri son değerle karşılaştırır ve belirlediğiniz bir eşiği aştığında sizi bilgilendirir.

Karmaşık sayfalardan fiyat ayrıştırın

Fiyatlar birçok biçimde görünür: binlik ayraçlarıyla, ondalık virgülle, sayının önünde bir etiketle ya da birkaç öğeye bölünmüş olarak. Ayrıştırıcıyı küçük tutun ve gerçek örneklere karşı test edin. Aşağıda, binlikler için virgül ve ondalık için nokta kullanan yaygın biçimi varsayan bir sürüm var. Diğer biçimleri fonksiyonu çağırmadan önce normalleştirin:

import re
from decimal import Decimal, InvalidOperation

PRICE_PATTERN = re.compile(r"\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?|\d+(?:\.\d{1,2})?")

def parse_price(text: str) -> Decimal | None:
    """Metindeki ilk sayıyı Decimal olarak döndürür, yoksa None."""
    match = PRICE_PATTERN.search(text.replace(" ", " "))
    if not match:
        return None
    try:
        return Decimal(match.group(0).replace(",", ""))
    except InvalidOperation:
        return None

print(parse_price("Now 1,249.50 in stock"))  # Decimal('1249.50')
print(parse_price("Sold out"))               # None

Karşılaştıracağınız ya da toplayacağınız herhangi bir şey için float değil Decimal kullanın. Kayan nokta yuvarlaması, eşit iki fiyatı farklı gösterebilir. Ham metni ayrıştırılmış değerin yanında saklayın; böylece her sayfayı yeniden çekmeden ileride bir ayrıştırıcı hatasını düzeltebilirsiniz.

Geçmişi saklayın ve değişiklikleri tespit edin

Tek bir fiyat bir anlık görüntüdür. Bir takip sisteminin değeri geçmişindedir. Gözlem başına bir satır saklayın: ürün kimliği, kaynak, zaman damgası, ayrıştırılmış değer ve ham metin. Uyarı, son satırla basit bir karşılaştırma olur. Yalnızca anlamlı değişikliklerde uyarın; örneğin belirlediğiniz bir yüzdenin üzerindeki düşüşte ya da bir ürünün stokta kalmadığında. Böylece gürültüyle boğulmazsınız.

Varyant ve paketleri ele alın

Bir ürün sayfası genellikle birkaç fiyat gösterir: her beden ya da renk için bir fiyat, bir paket fiyatı, bir üye fiyatı ya da yalnızca bir seçim yapıldıktan sonra görünen bir fiyat. Monitörün neyi kaydedeceğine inşa etmeden önce karar verin. Yaygın yaklaşım, varyant kimliğini fiyatla birlikte saklamaktır; böylece bir bedendeki değişiklik tüm ürünün değişmiş gibi görünmez. "Başlangıç" fiyatlarına ve üstü çizili orijinal fiyatlara dikkat edin, çünkü yanlış sayıyı alan bir ayrıştırıcı yanlış uyarılara yol açar. Her değerin yanına etiket metnini de saklayın; bir uyarı yanlış göründüğünde neyin okunduğunu kontrol edebilirsiniz.

Zamanlamayı kibar tutun

Her ürünü, fiyatının gerçekte ne sıklıkla değiştiğiyle eşleşen bir aralıkta kontrol edin. Her gün değişen bir ürün için saatlik kontrol gerekmez. Her ziyarete rastgele bir gecikme (jitter) ekleyin, site başına saatlik istek sayısını sınırlayın ve seçtiğiniz aralık için sonuçları önbelleğe alın. Bu alışkanlıklar yükünüzü düşük ve verinizi tutarlı tutar.

Sayfa sizi engellediğinde

Fiyat sayfaları otomatik erişimin sık hedefleridir; bu yüzden bir engel, bir hız sınırı ya da bir captcha ile karşılaşabilirsiniz. 429 ya da 503 gördüğünüzde geri çekilin ve sürekli reddeden bir siteyi ziyaret etmeyi bırakın. Otomatize etmenize izin verilen bir sayfada captcha çıkarsa, Scarnox'taki canlı captcha tipi PopularCaptcha'dır. PopularCaptcha Python rehberi token akışını gösterir. Ek mekanizma eklemeden önce engellenmeden scraping rehberini okuyun; çoğu zaman hıza dikkat etmek, herhangi bir ek araçtan daha fazla sorunu çözer.

Bazı sayfalar fiyatlarını JavaScript ile render eder. Bunlar için JavaScript web sitelerini scrape etme rehberindeki yaklaşımı izleyin.

Sorumlu scraping

Sonraki adımlar

Ücretsiz deneme kredisiyle başlayın, kart gerekmez: otomatize etmenize izin verilen bir sayfada PopularCaptcha akışını hesap oluşturarak deneyin. Güncel fiyatlar için fiyatlandırma sayfasına bakın.