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?
- Botun takip edeceği ürün adresleri ve hedef fiyatlar bir listede durur.
- Bot belirli aralıklarla (ör. saatte bir) her ürün sayfasını indirir.
- Sayfanın HTML'inden fiyat bilgisini ayıklar ve sayıya çevirir.
- Fiyat hedefin altındaysa ve daha önce haber verilmediyse bildirim gönderir.
- 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.
