Python ile fiyat takip botu: ürün indirime girince haber versin

Python ve botlar · Yayın · 4 dk okuma

Ürün fiyatını takip edip düşüşte bildirim gönderen botu simgeleyen illüstrasyon

Python ile fiyat takip botu, bir ürün sayfasını belirli aralıklarla ziyaret edip fiyatı okuyan, fiyat belirlediğin hedefin altına düşünce sana bildirim gönderen küçük bir programdır. Temel olarak üç parçadan oluşur: sayfayı indirmek (requests), fiyatı sayfadan ayıklamak (BeautifulSoup) ve bildirim göndermek (ör. Telegram Bot API). Doğru kurulduğunda alışveriş için de, işletmelerin rakip ve tedarikçi fiyatlarını izlemesi için de kullanışlıdır.

Bu yazıda basit ama işe yarar bir fiyat takip botunu adım adım yazıyoruz. Ayrıca sitelerin kullanım kurallarına uygun, nazik bir bot nasıl yazılır onu da anlatıyorum.

Fiyat takip botu nasıl çalışır?

  1. Botun takip edeceği ürün adresleri ve hedef fiyatlar bir listede durur.
  2. Bot belirli aralıklarla (ör. saatte bir) her ürün sayfasını indirir.
  3. Sayfanın HTML'inden fiyat bilgisini ayıklar ve sayıya çevirir.
  4. Fiyat hedefin altındaysa ve daha önce haber verilmediyse bildirim gönderir.
  5. Son fiyatı kaydeder, bir sonraki kontrolde karşılaştırır.

Başlamadan önce: kurallar ve etik

Bir web sitesinden otomatik veri çekmeden önce şunlara dikkat et:

  • Kullanım şartlarını oku: Bazı siteler otomatik erişimi yasaklar. Kurallara aykırı kullanım hesabının kapatılmasına ya da hukuki soruna yol açabilir.
  • robots.txt'ye bak: Sitenin hangi bölümlere bot erişimini istemediğini gösterir.
  • Resmî API varsa onu kullan: Birçok pazaryeri ve mağaza fiyat bilgisini API ile sunar; bu hem daha güvenilir hem kurallara uygundur.
  • Az ve yavaş istek gönder: Saatte bir kontrol bir fiyat için fazlasıyla yeterlidir. Saniyede onlarca istek göndermek siteye zarar verir ve engellenmene yol açar.
  • Kişisel veri toplama: Fiyat takibi kişisel veri gerektirmez; başka veri toplamaktan kaçın.

Gerekli kütüphaneler

python3 -m venv venv
source venv/bin/activate
pip install requests beautifulsoup4

1. Sayfayı indirmek

import requests

HEADERS = {"User-Agent": "Mozilla/5.0 (fiyat-takip; kisisel kullanim)"}

def sayfa_getir(url: str) -> str:
    yanit = requests.get(url, headers=HEADERS, timeout=15)
    yanit.raise_for_status()
    return yanit.text

timeout vermek önemlidir; vermezsen yanıt vermeyen bir site botunu sonsuza kadar bekletebilir.

2. Fiyatı sayfadan ayıklamak

Her sitenin HTML yapısı farklıdır. Fiyatın hangi etikette olduğunu bulmak için tarayıcıda fiyatın üzerine sağ tıklayıp İncele dersin; örneğin <span class="product-price">1.299,90 TL</span> gibi bir yapı görürsün.

from bs4 import BeautifulSoup
import re

def fiyat_bul(html: str, secici: str) -> float | None:
    soup = BeautifulSoup(html, "html.parser")
    etiket = soup.select_one(secici)
    if not etiket:
        return None
    metin = etiket.get_text()
    # "1.299,90 TL" -> 1299.90
    sayi = re.sub(r"[^\d,]", "", metin).replace(",", ".")
    try:
        return float(sayi)
    except ValueError:
        return None

Türkçe sitelerde binlik ayırıcı nokta, ondalık ayırıcı virgüldür; dönüştürürken buna dikkat etmek gerekir.

İpucu: Birçok mağaza sayfası fiyatı yapılandırılmış veri olarak da verir (<script type="application/ld+json"> içinde "price" alanı). HTML tasarımı değişse bile bu alan genellikle sabit kalır, bu yüzden daha sağlam bir kaynaktır.

3. Telegram'dan bildirim göndermek

Telegram'da @BotFather ile bir bot oluşturup token alırsın. Sonra botuna bir mesaj atıp kendi sohbet kimliğini (chat id) öğrenirsin.

import os

TOKEN = os.environ["TELEGRAM_TOKEN"]      # token'ı koda yazma
CHAT_ID = os.environ["TELEGRAM_CHAT_ID"]

def bildir(mesaj: str) -> None:
    requests.post(
        f"https://api.telegram.org/bot{TOKEN}/sendMessage",
        data={"chat_id": CHAT_ID, "text": mesaj},
        timeout=15,
    )

Token'ı koda değil ortam değişkenine yazmak, kodu paylaştığında ya da GitHub'a yüklediğinde sızmasını önler. Telegram Bot API'nin ayrıntıları için resmî dokümantasyona bakabilirsin.

4. Hepsini birleştirmek

import json
import time
from pathlib import Path

URUNLER = [
    {"ad": "Kulaklık", "url": "https://ornek-magaza.com/urun/123", "secici": ".product-price", "hedef": 1500},
]
KAYIT = Path("son_fiyatlar.json")

def calistir() -> None:
    eski = json.loads(KAYIT.read_text()) if KAYIT.exists() else {}
    for urun in URUNLER:
        try:
            fiyat = fiyat_bul(sayfa_getir(urun["url"]), urun["secici"])
        except requests.RequestException as hata:
            print(f"{urun['ad']}: sayfa alınamadı ({hata})")
            continue
        if fiyat is None:
            print(f"{urun['ad']}: fiyat bulunamadı, seçiciyi kontrol et")
            continue
        onceki = eski.get(urun["url"])
        if fiyat <= urun["hedef"] and (onceki is None or onceki > urun["hedef"]):
            bildir(f"{urun['ad']} {fiyat:.2f} TL oldu! (hedef {urun['hedef']} TL)\n{urun['url']}")
        eski[urun["url"]] = fiyat
    KAYIT.write_text(json.dumps(eski))

if __name__ == "__main__":
    calistir()

Bu kod, fiyat hedefin altına ilk kez düştüğünde haber verir; her kontrolde aynı bildirimi tekrar göndermez.

5. Düzenli çalıştırmak

Botu her saat çalıştırmak için Linux'ta cron kullanılabilir:

crontab -e
# her saat başı
0 * * * * cd /home/kullanici/fiyat-botu && ./venv/bin/python bot.py

Botu kendi bilgisayarında değil 7/24 açık bir sunucuda çalıştırmak istersen küçük bir VPS yeterlidir. Hangi altyapının uygun olduğunu hosting mi VPS mi? yazımda anlattım. Kullanacağın temel komutlar için de Linux temel komutlar yazıma bakabilirsin.

Sık karşılaşılan sorunlar

Sorun Sebep Çözüm
Fiyat bulunamıyor Sitenin HTML yapısı değişti Seçiciyi güncelle ya da JSON-LD kullan
Sayfa boş geliyor Fiyat JavaScript ile yükleniyor Sitenin API'sini ya da JSON-LD'yi kullan
403 / 429 hatası Çok sık istek veya bot engeli Aralığı uzat; kuralları kontrol et
Yanlış fiyat Ayırıcı dönüşümü hatalı Nokta/virgül dönüşümünü kontrol et

İşletmeler için fiyat takibi

Bireysel kullanımın ötesinde, fiyat takibi işletmeler için de değerlidir:

  • E-ticaret: Rakip ürün fiyatlarını izleyip kendi fiyatlandırmanı ayarlamak.
  • Satın alma: Tedarikçi fiyatlarındaki değişimi takip etmek.
  • Stok: Bir ürün tekrar stoğa girince haber almak.

İşletme ölçeğinde bu işler genellikle resmî API'ler, düzenli raporlar ve bir panelle yapılır. Böyle bir otomasyon ihtiyacın varsa Python botları ve otomasyon sayfama bakabilirsin.

Sonuç

Python ile fiyat takip botu yazmak; sayfayı indirmek, fiyatı ayıklamak ve bildirim göndermek olmak üzere üç basit adımdan oluşur. Sağlam bir bot için timeout kullan, token'ları koda yazma, aynı bildirimi tekrar göndermemek için son fiyatı kaydet ve siteye nazik davran: az istek gönder, kurallara uy, varsa resmî API'yi tercih et.

Botunu geliştirmek ya da işletmen için benzer bir otomasyon kurmak istersen iletişim sayfamdan yazabilirsin.

Sık sorulan sorular

Python fiyat takip botu yasal mı?

Kişisel kullanım için herkese açık bir sayfadaki fiyatı az sayıda istekle kontrol etmek genellikle sorun yaratmaz. Ancak sitenin kullanım şartları otomatik erişimi yasaklıyorsa ya da çok sık istek gönderiyorsan sorun çıkabilir. Kullanım şartlarını oku, robots.txt'ye bak ve varsa resmî API'yi kullan.

Fiyat sayfada görünüyor ama bot bulamıyor, neden?

Bazı siteler fiyatı sayfa yüklendikten sonra JavaScript ile getirir; requests ile indirilen HTML'de fiyat bulunmaz. Bu durumda sayfadaki JSON-LD yapılandırılmış verisine ya da sitenin API'sine bakmak en iyi çözümdür. Seçicinin yanlış olması da sık bir sebeptir.

Botu ne sıklıkla çalıştırmalıyım?

Bir ürünün fiyatı için saatte bir kontrol genellikle fazlasıyla yeterlidir. Çok sık istek göndermek siteye yük bindirir ve IP adresinin engellenmesine yol açabilir. Kampanya dönemlerinde bile 15–30 dakikadan sık kontrol etmek nadiren gerekir.

Bildirimleri Telegram yerine e-postayla alabilir miyim?

Evet. Python'un smtplib modülüyle e-posta gönderebilir ya da WhatsApp gibi başka kanalları kullanabilirsin. Telegram'ın avantajı kurulumun çok kolay olması ve bildirimlerin telefona anında düşmesidir.

Muhammed Maruf GüveliSiber güvenlik analisti. Python otomasyonu ve siber güvenlik üzerine çalışıyorum; bu tür bir işe ihtiyacın varsa yardımcı olabilirim.
Teklif iste