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, 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!
 
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, 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!
Merhaba! İndirim dedektörü projeniz üzerinde çalışmak için hazır olduğum için çok heyecanlıyım. Gelin, her bir noktayı detaylıca inceleyelim.

1. Tüm Kategorileri Dinamik Olarak Tarama​


Site Haritası veya Kategori Yapısı Keşfi: DeFacto'nun site haritası olup olmadığını kontrol edin. Genellikle site haritası şu URL'de bulunur: https://www.defacto.com.tr/sitemap.xml. Bunu Python ile analiz ederek kategorileri çekebilirsiniz.

Kategori API Parametreleri: Kategorilere karşılık gelen parametreleri dinamik olarak elde etmek için kategori detaylarını içeren bir API dökümü bulmanız gerekebilir. Doğrudan tarayıcıdan inceleme yaparak (Developer Tools) bu detayları elde edebilirsiniz.

Tarama Mantığı: Bir for döngüsü ile ana kategorileri ve alt kategorileri çekebilir, her birini bir listeye ekleyebilirsiniz.

2. Sayfalama (Pagination) Mekanizmasını Yönetme​


Otomatik Sayfa Gezinme: Sayfa sayısını belirlemek için while döngüsü kullanabilirsiniz. Örneğin:
Python:
page = 1
while True:
    response = requests.get(f"{url}&page={page}")
    data = response.json()
    if not data["Data"]["SearchResponse"]["Documents"]:
        break  # Artık ürün yoksa çık 
    # Ürünleri işle
    page += 1

Toplam Sayfa Sayısı: API yanıtında bir total veya totalPages alanı varsa bunu kullanabilirsiniz. Yoksa, loop ile son sayfaya kadar gidip döngüyü kırabilirsiniz.

3. Daha Güvenilir İndirim Tespiti Algoritmaları​


Alternatif Kontroller: CampaignBadge dışında ayrıca OldProductPriceInclTax ve ProductPriceInclTax alanlarını karşılaştırabilirsiniz. Şöyle bir kontrol ekleyebilirsiniz:
Python:
if "OldProductPriceInclTax" in product:
    if product["OldProductPriceInclTax"] > product["ProductPriceInclTax"]:
        # Ürün indirimli

4. API Güvenilirliği vs. Alternatif Veri Çekme Yöntemleri​


Resmi API Riski: Resmi olmayan endpoint'lerin riskini gereksinimlerinize göre değerlendirin. DeFacto'nun resmi bir API'si olup olmadığını kontrol etmek için geliştirici belgelerini araştırın.

HTML Kazıma: HTML otomatik kazımada requests ve BeautifulSoup kullanabilir, sık değişen bir yapıda kullanımda daha az bağımlılık yaratabilir. Ancak, sayfa yapısına göre daha fazla değişkenlik yaratır, bu nedenle duvarlar ile karşılaşabilirsiniz.

5. Sağlam Hata Yönetimi ve Dayanıklılık​


Gelişmiş Hata Yönetimi: try-except bloğunuzu daha spesifik hale getirerek, olası hataları tanımlamalısınız. Ayrıca, belirli bir hata ile karşılaştığınızda yeni bir isteği belirli bir süre bekleyerek tekrar deneyin.

Python:
except requests.exceptions.RequestException as e:
    if e.response and e.response.status_code == 500:
        print("Sunucu hatası, birkaç saniye bekliyoruz...")
        time.sleep(5)

6. Veri Depolama ve Sunum Seçenekleri​


Veri Depolama Seçimleri: SQLite, nakit verinizi kalıcı olarak depolamak için pratik bir seçenektir. CSV/JSON dosyaları da uygundur; fakat veritabanı yönetimi daha iyi bir veri bütünlüğü sağlar.

Sunum Yöntemleri: Komut satırı çıktısı başlangıç için yeterli olabilirken, daha sonrasında Flask veya Django ile bir web arayüzü oluşturmak kullanıcı dostu bir çözüm sağlar.

7. Etik ve Yasal Boyutlar​


robots.txt ve Kullanım Koşulları: Web sitelerinin robots.txt dosyasını kontrol ederek hangi sayfaların taranmasının uygun olduğunu anlayabilirsiniz. İzin vermeyen dizinlerde otomatik veri çekmemelisiniz.

İstek Sıklığı: Otomatik olarak yapılan istekler arasındaki süreyi artırarak aşırı yükden kaçınabilirsiniz. Genellikle 1-2 saniye bekleme süresi uygundur.

Önerilen Kütüphaneler ve Stratejiler​


  • Pandas: Veri analizi için.
  • SQLAlchemy: Veritabanı etkileşimleri için.
  • Flask veya Django: Web uygulamaları geliştirmek için.
  • BeautifulSoup veya Scrapy: HTML kazıma için.

Yukarıdaki öneriler doğrultusunda projeyi geliştirebilirsiniz. Kodlamalarda sıkıntı yaşıyorsanız daha fazla detay isteyebilirsiniz!
 
Kategorilerin linkini koddaki kategori linkine benzer olarak bulamadım bana yardımcı olur musun?
Kategorileri dinamik olarak bulmak için DeFacto'nun site yapısını incelemek gerekebilir. Aşağıda, kategori bağlantılarını bulmak için kullanabileceğiniz bazı adımlar ve örnek bir yöntem sunuyorum.

1. Ana Sayfa İncelemesi​

DeFacto'nun ana sayfasındaki kategori bağlantılarını bulmak için, önce siteyi ziyaret edin ve sayfanın kaynağını görüntüleyin (sağ tıklayıp "Sayfa Kaynağını Görüntüle" seçeneği ile). Ana kategoriler genellikle <nav> veya <ul> etiketleri içinde listelenir.

2. Kategori Linklerini Çekme​

Aşağıdaki örnek kod, BeautifulSoup kütüphanesini kullanarak bir web sayfasındaki kategori bağlantılarını çekmeye yönelik basit bir örnektir:

Python:
import requests
from bs4 import BeautifulSoup

# DeFacto'nun ana sayfası URL'si
base_url = "https://www.defacto.com.tr"

# Ana sayfayı alın
response = requests.get(base_url)
soup = BeautifulSoup(response.text, 'html.parser')

# Kategorileri bul
categories = []
for link in soup.select('nav a'):  # 'nav a' ile gezineceğiniz uygun CSS seçiciyi belirleyin
    category_url = link.get('href')
    if category_url.startswith('/'):  # Sadece yerel bağlantıları alın
        category_url = base_url + category_url  # Tam URL oluştur
        categories.append(category_url)

# Kategorileri yazdır
print("Bulunan Kategoriler:")
for category in categories:
    print(category)

3. API Endpoint’lerine Erişim​

Elde ettiğiniz kategorileri, fx_c1 ve fx_c2 gibi parametrelerle değiştirmek için aşağıdaki yolu izleyebilirsiniz. Genel olarak, kategori sayfasının bilgilerinde zaten bu parametreler bulunabilir. Bunun için kategori detaylarının API dökümünü bulmanız gerekecek.

4. Alternatif Yöntem: Site Haritası​

Bir diğer yol ise, site haritasını kontrol etmektir. Daha önce belirttiğim gibi, genellikle sitemap.xml dosyasında kategorilerin bağlantılarını bulabilirsiniz. Bu dosya genelde tüm kategorilerin ve sayfaların bağlantılarını içerir.

Kategorileri Almanın Diğer Yöntemleri​

1. Doğrudan API Kullanımı: Eğer DeFacto'nun resmi bir API dökümü veya belge varsa, bu yöntemle kategorilere doğrudan erişim sağlamak daha güvenilir bir yol olabilir.
2. Tarayıcı Geliştirici Araçlarını Kullanma: Chrome veya Firefox’un geliştirici araçlarını açarak (F12), Network sekmesini kullanarak kategoriye giden istekleri inceleyebilirsiniz.

Bu adımlarla, kategorileri bulup dinamik bir şekilde projede kullanabilirsiniz. Başka bir konuda desteğe ihtiyacınız olursa, lütfen belirtin!
 
Yazılımda iyi değilim bana yardımcı olur musun her şeyi senden detaylı yapmanı istiyorum.
Elbette, yazılım projeni adım adım geliştirmene yardımcı olabilirim. Aşağıda, DeFacto için bir indirim dedektörü projesini baştan sona kadar birlikte yapabileceğin detaylı adımlar sunuyorum.

Proje Geliştirme Adımları​


# 1. Gerekli Kütüphaneleri Yükle​


Öncelikle bilgisayarında gerekli Python kütüphanelerini yüklemen gerekiyor. Terminal veya komut istemcisini aç ve aşağıdaki komutları çalıştır:

Bash:
pip install requests beautifulsoup4

# 2. Kategori Bağlantılarını Çekme​


Aşağıdaki kodu bir Python dosyasına (örneğin indirim_dedektoru.py) yapıştır.

Python:
import requests
from bs4 import BeautifulSoup

# DeFacto'nun ana sayfası URL'si
base_url = "https://www.defacto.com.tr"

# Ana sayfayı almak için istek yap
response = requests.get(base_url)

# Sayfayı çözümle
soup = BeautifulSoup(response.text, 'html.parser')

# Kategori linklerini bul
categories = []
for link in soup.select('nav a'):  # 'nav a' ile uygun CSS seçiciyi belirleyin
    category_url = link.get('href')
    if category_url.startswith('/'):  # Yerel bağlantılar
        category_url = base_url + category_url  # Tam URL oluştur
        categories.append(category_url)

# Kategorileri yazdır
print("Bulunan Kategoriler:")
for category in categories:
    print(category)

Bu kod, DeFacto'nun ana sayfasından kategori bağlantılarını çekecek ve ekranda listeleyecektir.

# 3. İndirimli Ürünleri Bulma​


Şimdi, belirli bir kategoriye gidip indirimli ürünleri bulmayı hedefleyelim. Benzer bir kodu ekleyerek aşağıdaki gibi yapalım:

Python:
import json

# Ikinci bir fonksiyon ekliyoruz: indirimli ürünleri bul
def filter_discounted_products(api_data):
    discounted_products = []
    # API verisini 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"]:
            campaign = product.get("CampaignBadge")
            if campaign and "DiscountAmount" in campaign and campaign["DiscountAmount"] is not None:
                product_name = product.get("ProductName", "İsim Bilgisi Yok")
                pictures = product.get("ProductPictures", [])
                image_url = pictures[0].get("ProductPicturePath", "Resim Yok") if pictures else "Resim Yok"
                normal_price = product.get("ProductPriceInclTax", 0) 

                discounted_products.append({
                    "name": product_name,
                    "image": image_url,
                    "discount_info": campaign.get("DiscountAmount", "İndirim Bilgisi Yok"),
                    "normalPrice": normal_price
                })
    return discounted_products

# Örnek Kategori URL'si
category_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(category_url, headers=headers, timeout=15)
    response.raise_for_status()  # Hata kontrolü
    api_response = response.json()  # JSON olarak yanıtı al
    filtered_products = filter_discounted_products(api_response)  # İndirimli ürünleri filtrele

    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ı.")

except requests.exceptions.RequestException as e:
    print(f"Hata: {e}")

Açıklama:
1. İlk bölümde kategorileri çektikten sonra, ikinci bölümde belirli bir kategori URL'sini kullanarak indirimli ürünleri çekiyoruz.
2. filter_discounted_products fonksiyonu, API'den gelen veriyi kullanarak indirimli ürünleri ayıklıyor.

# 4. Programı Çalıştırma​


Python dosyanızı kaydedin ve terminalde şu komutu yazarak çalıştırın:

Bash:
python indirim_dedektoru.py

# 5. Hata Yönetimi ve Geliştirme​


Bu aşamada, hata yönetimlerini ekleyebilir ve daha fazla özelleştirme yapabilirsiniz. Ayrıca, farklı kategorileri döngü içinde taramak için üstteki kodları genişletebilirsiniz.

Bu adımları izleyerek projenizi geliştirip daha işlevsel hale getirebilirsiniz. Herhangi bir sorun yaşarsanız ya da detay istediğiniz noktalar varsa, çekinmeden sorabilirsiniz!