miracbirben
Çalışkan
- Katılım
- 14 Mart 2025
- Mesajlar
- 26
- Beğeniler
- 1
Merhaba TecholAI,
Python kullanarak DeFacto web sitesi için bir "indirim dedektörü" projesi üzerinde çalışıyorum. Temel amacım, sitenin ürün kategorilerini periyodik olarak tarayıp indirime giren ürünleri tespit etmek ve bu bilgileri yönetilebilir bir formatta (örneğin, bir liste oluşturarak veya bildirim göndererek) sunmak.
Mevcut Durumum:
Projenin ilk adımı olarak,
Başlangıç kodum şu şekilde:
TecholAI'den Beklediğim Yardım Alanları:
Şimdi, bu temel yapıyı daha fonksiyonel, ölçeklenebilir ve sağlam bir çözüme dönüştürmek için senin teknik bilgine ve öngörülerine ihtiyacım var, TecholAI. Özellikle aşağıdaki konularda yardımlarını rica ediyorum:
1. Tüm Kategorileri Dinamik Olarak Tarama:
* DeFacto'nun site haritasını veya kategori yapısını programatik olarak nasıl keşfedebilir ve tüm kategorileri (ana/alt) listeleyebilirim?
* Bu kategorilere karşılık gelen API parametrelerini (
2. Sayfalama (Pagination) Mekanizmasını Yönetme:
* Bir kategori içindeki tüm ürün sayfalarını (
* Bir kategorideki toplam sayfa sayısını önceden bilmenin (API yanıtından veya başka bir yöntemle) verimli bir yolu var mı, yoksa sayfa sonuna ulaşana kadar denemeli miyim?
3. Daha Güvenilir İndirim Tespiti Algoritmaları:
*
* API'deki
4. API Güvenilirliği vs. Alternatif Veri Çekme Yöntemleri:
* Kullandığım
* DeFacto'nun geliştiriciler için sunduğu resmi, belgelenmiş bir API var mı?
* Bu API yerine,
5. Sağlam Hata Yönetimi ve Dayanıklılık:
* Kodumu ağ hatalarına, zaman aşımlarına, beklenmedik API yanıtlarına (örn. JSON yerine HTML, hatalı veri), site yapısı değişikliklerine karşı nasıl daha dayanıklı hale getirebilirim? Mevcut
6. Veri Depolama ve Sunum Seçenekleri:
* Bulunan indirimli ürün verilerini (isim, fiyatlar, resim, kategori, tarih vb.) kalıcı olarak depolamak için ne önerirsin? SQLite gibi basit bir veritabanı mı, yoksa CSV/JSON dosyaları mı daha pratik olur? Seçim kriterleri ne olmalı?
* Bu verileri kullanıcıya sunmak için hangi yöntemler mantıklı? Komut satırı çıktısı mı, yoksa Flask/Django ile basit bir web arayüzü mü daha kullanışlı olur?
7. Etik ve Yasal Boyutlar:
* DeFacto'nun
* Site sunucularına aşırı yük bindirmemek için istek sıklığını nasıl ayarlamalıyım?
Bu konularda sunabileceğin her türlü strateji, kod örneği, kütüphane tavsiyesi veya genel yaklaşım benim için çok değerli olacaktır.
Yardımların için şimdiden teşekkürler, TecholAI!
Python kullanarak DeFacto web sitesi için bir "indirim dedektörü" projesi üzerinde çalışıyorum. Temel amacım, sitenin ürün kategorilerini periyodik olarak tarayıp indirime giren ürünleri tespit etmek ve bu bilgileri yönetilebilir bir formatta (örneğin, bir liste oluşturarak veya bildirim göndererek) sunmak.
Mevcut Durumum:
Projenin ilk adımı olarak,
requests kütüphanesiyle DeFacto'nun belirli bir kategoriye ait ürün verilerini JSON formatında döndüren dahili bir API endpoint'ine (/Catalog/PartialIndexScrollResult) istek atmayı başardım. Dönen JSON yanıtını işleyerek, CampaignBadge alanına bakıp olası indirimli ürünleri filtreleyen basit bir Python fonksiyonu yazdım.Başlangıç kodum şu şekilde:
Python:
import json
import requests
# İndirimli ürünleri filtreleyen fonksiyon
def filter_discounted_products(api_data):
discounted_products = []
# Veri yapısını kontrol et
if api_data and "Data" in api_data and "SearchResponse" in api_data["Data"] and "Documents" in api_data["Data"]["SearchResponse"]:
for product in api_data["Data"]["SearchResponse"]["Documents"]:
# Kampanya bilgisi var mı kontrol et
campaign = product.get("CampaignBadge")
# Kampanya içinde indirim miktarı belirtilmiş mi kontrol et
if campaign and "DiscountAmount" in campaign and campaign["DiscountAmount"] is not None:
# Ürün bilgilerini al, eksik bilgi varsa varsayılan değer ata
product_name = product.get("ProductName", "İsim Bilgisi Yok")
# Resim listesinin boş olup olmadığını kontrol et
pictures = product.get("ProductPictures", [])
image_url = pictures[0].get("ProductPicturePath", "Resim Yok") if pictures else "Resim Yok"
normal_price = product.get("ProductPriceInclTax", 0) # İndirimsiz fiyatı al
discounted_products.append({
"name": product_name,
"image": image_url,
"discount_info": campaign.get("DiscountAmount", "İndirim Bilgisi Yok"), # İndirim metnini al
"normalPrice": normal_price
})
# Alternatif: Eski/yeni fiyat karşılaştırması (geliştirilebilir)
# elif product.get("OldProductPriceInclTax") and product.get("ProductPriceInclTax"):
# old_price = product.get("OldProductPriceInclTax")
# new_price = product.get("ProductPriceInclTax")
# if old_price > new_price:
# # ... indirimli ürün olarak ekle ...
# pass
return discounted_products
# Belirli bir kategori URL'sinden JSON verisini al ve işle
url = "https://www.defacto.com.tr/Catalog/PartialIndexScrollResult?page=1&SortOrder=0&pageSize=24&fx_c1=1&fx_c2=1413"
try:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
response = requests.get(url, headers=headers, timeout=15)
response.raise_for_status()
api_response = response.json()
filtered_products = filter_discounted_products(api_response)
if filtered_products:
print(f"{len(filtered_products)} adet indirimli ürün bulundu:")
print(json.dumps(filtered_products, indent=4, ensure_ascii=False))
else:
print("Belirtilen kriterlere uygun indirimli ürün bulunamadı veya API yanıtı beklenildiği gibi değil.")
# print("API Yanıtı:", json.dumps(api_response, indent=4, ensure_ascii=False))
except requests.exceptions.Timeout:
print(f"Hata: İstek zaman aşımına uğradı. URL: {url}")
except requests.exceptions.HTTPError as e:
print(f"Hata: HTTP Hatası oluştu. Durum Kodu: {e.response.status_code}, URL: {url}")
except requests.exceptions.RequestException as e:
print(f"Hata: Veri çekilemedi. Detaylar: {e}")
except json.JSONDecodeError as e:
print(f"Hata: JSON verisi ayrıştırılamadı. Muhtemelen API yanıtı JSON formatında değil. Detaylar: {e}")
# print("Alınan Ham Yanıt:", response.text)
TecholAI'den Beklediğim Yardım Alanları:
Şimdi, bu temel yapıyı daha fonksiyonel, ölçeklenebilir ve sağlam bir çözüme dönüştürmek için senin teknik bilgine ve öngörülerine ihtiyacım var, TecholAI. Özellikle aşağıdaki konularda yardımlarını rica ediyorum:
1. Tüm Kategorileri Dinamik Olarak Tarama:
* DeFacto'nun site haritasını veya kategori yapısını programatik olarak nasıl keşfedebilir ve tüm kategorileri (ana/alt) listeleyebilirim?
* Bu kategorilere karşılık gelen API parametrelerini (
fx_c1, fx_c2 vb.) veya URL'leri dinamik olarak nasıl elde edebilirim? Tüm siteyi kapsayacak bir tarama mantığını nasıl kurmalıyım?2. Sayfalama (Pagination) Mekanizmasını Yönetme:
* Bir kategori içindeki tüm ürün sayfalarını (
page=1, page=2, ...) otomatik olarak nasıl gezebilirim? page parametresini artırarak tüm veriyi çekmek için nasıl bir döngü kurmalıyım?* Bir kategorideki toplam sayfa sayısını önceden bilmenin (API yanıtından veya başka bir yöntemle) verimli bir yolu var mı, yoksa sayfa sonuna ulaşana kadar denemeli miyim?
3. Daha Güvenilir İndirim Tespiti Algoritmaları:
*
CampaignBadge kontrolü yeterince güvenilir mi? Alternatif veya ek olarak, bir ürünün indirimde olduğunu daha kesin nasıl anlayabilirim?* API'deki
OldProductPriceInclTax ve ProductPriceInclTax alanlarını karşılaştırmak daha sağlam bir yöntem midir? Bu karşılaştırmayı nasıl implemente edebilirim ve olası None değerleri gibi durumları nasıl ele almalıyım?4. API Güvenilirliği vs. Alternatif Veri Çekme Yöntemleri:
* Kullandığım
PartialIndexScrollResult gibi resmi olmayan API endpoint'lerinin gelecekte değişme veya kaldırılma riski nedir? Bu yaklaşıma ne kadar güvenebilirim?* DeFacto'nun geliştiriciler için sunduğu resmi, belgelenmiş bir API var mı?
* Bu API yerine,
requests + BeautifulSoup veya Scrapy framework'ü ile doğrudan HTML sayfalarını kazımak (scraping) daha stabil veya uzun ömürlü bir çözüm sunar mı? Bu alternatifin teknik avantaj/dezavantajları nelerdir?5. Sağlam Hata Yönetimi ve Dayanıklılık:
* Kodumu ağ hatalarına, zaman aşımlarına, beklenmedik API yanıtlarına (örn. JSON yerine HTML, hatalı veri), site yapısı değişikliklerine karşı nasıl daha dayanıklı hale getirebilirim? Mevcut
try-except yapısını nasıl daha spesifik ve kapsamlı hale getirmeliyim?6. Veri Depolama ve Sunum Seçenekleri:
* Bulunan indirimli ürün verilerini (isim, fiyatlar, resim, kategori, tarih vb.) kalıcı olarak depolamak için ne önerirsin? SQLite gibi basit bir veritabanı mı, yoksa CSV/JSON dosyaları mı daha pratik olur? Seçim kriterleri ne olmalı?
* Bu verileri kullanıcıya sunmak için hangi yöntemler mantıklı? Komut satırı çıktısı mı, yoksa Flask/Django ile basit bir web arayüzü mü daha kullanışlı olur?
7. Etik ve Yasal Boyutlar:
* DeFacto'nun
robots.txt dosyasını ve kullanım koşullarını nasıl yorumlamalıyım? Otomatik veri çekme işlemimin site politikalarına uygun olduğundan nasıl emin olabilirim?* Site sunucularına aşırı yük bindirmemek için istek sıklığını nasıl ayarlamalıyım?
time.sleep() ile ne kadar bekleme süresi eklemek makul olur? Bu konuda en iyi pratikler nelerdir?Bu konularda sunabileceğin her türlü strateji, kod örneği, kütüphane tavsiyesi veya genel yaklaşım benim için çok değerli olacaktır.
Yardımların için şimdiden teşekkürler, TecholAI!