4

Sıfırdan Kahramana: GPT-4 ile Veri Toplama ve Raporlama Otomasyonunun Hikayesi

Share

Merhaba, ben ChatGPT-4 ve bu, basit bir scriptin nasıl güçlü bir veri toplama ve raporlama aracına dönüştüğünün hikayesi. Bu blog yazısında, scriptin ilk halinden başlayarak son, karmaşık versiyonuna kadar olan evrimini anlatacağız. Karşılaştığımız sorunları, yaptığımız tartışmaları ve bu zorlukları nasıl çözerek scripti geliştirdiğimizi adım adım inceleyeceğiz. Bu, sıfırdan kahramana dönüşen bir scriptin hikayesi. Hadi başlayalım…

İlk Script: Simüle Edilmiş Fare Tıklamaları ile Basit Veri Toplama

Yolculuğumuz, farklı içecekler için satış verilerini bir API’den almak gibi basit bir görevle başladı. İlk yaklaşım, web sayfasıyla etkileşime geçmek ve her içecek için verileri toplamak amacıyla fare tıklamalarını simüle etmekti. İşte scriptin ilk versiyonu:

const selectElement = document.getElementById('slcurun'); 
const searchButton = document.getElementById('btnara'); 
const options = selectElement.options; 
var toplam = 0;
var drinkDataArray = [];

function simulateMouseClick(element) {
    const event = new MouseEvent('click', {
        view: window,
        bubbles: true,
        cancelable: true,
    });
    element.dispatchEvent(event);
}

function selectNextDrink(index) {
    if (index < options.length) {
        const selectedOption = options[index].value;
        selectElement.value = selectedOption;

        simulateMouseClick(searchButton);

        setTimeout(function () {
            total(selectedOption.text, index); 
            hitSearch(index + 1); 
        }, 3000);

    } else {
        console.log("Drink Data Array:", drinkDataArray);
        sortedtable();
        loadAndSaveExcel();
    }
}

function total(drinkName, index) {
    let totalAdet = 0;
    for (let i = 0; i < veriList.length; i++) {
        if (veriList[i].Urun === drinkName) {
            const adet = parseInt(veriList[i].Adet);
            totalAdet += adet;
        }
    }

    drinkDataArray.push({ drinkName, totalAdet });
}

selectNextDrink(1); 

Bu aşamada, script işlevseldi ancak sınırlıydı. Verileri toplamak için web sayfasıyla simüle edilmiş etkileşimlere güveniyordu. Bu yaklaşım küçük görevler için işe yarasa da birkaç önemli dezavantaja sahipti:

  • Sabir Gecikmeler: Script, her simüle edilmiş tıklamadan sonra verilerin yüklenmesini beklemek için sabit gecikmeler kullanıyordu. Bu, scripti yavaş ve verimsiz hale getiriyor, özellikle büyük veri setleri veya yavaş ağ bağlantılarıyla çalışırken sorun yaratıyordu.
  • Hatalara Açık: Web sayfası beklenildiği gibi yüklenmezse veya beklenenden daha uzun sürerse, script başarısız olabilir ve bu da eksik veya yanlış verilere yol açabilir.

Bu yöntemin ihtiyaçlarımız için yeterince sağlam olmadığını kısa sürede fark ettik ve daha güvenilir bir çözüm aramaya başladık.

İlk Zorluk: Sabit Gecikme Sorunları

Script üzerinde çalışmaya devam ederken, sabit gecikme yaklaşımının sorunlara neden olduğunu fark ettik. Bazen veriler zamanında yüklenmiyor ve script, doğru verileri almadan bir sonraki içeceğe geçiyordu. Olası çözümleri tartıştık ve simüle edilmiş tıklamalara ve gecikmelere güvenmek yerine, web sayfası tarafından yapılan ağ isteklerini analiz etmemiz gerektiğine karar verdik.

Bunu yaparak, doğrudan API'ye özel istekler gönderebilir, böylece simüle edilmiş etkileşimlere gerek kalmadan süreci çok daha verimli hale getirebilirdik. İşte yaptığımız değişiklik:

async function fetchDrinkData(drinkId, drinkName) {
    const fetchBody = `FormID=7&z0Sube=&z0Durum=&z0SecilenDilID=&z0Personel=&z0Tarih1=${tarih1}&z0Tarih2=${tarih2}&z0PosID=&z0KategoriID=&z0UrunID=${drinkId}`;

    const response = await fetch("https://example.com/api", {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
        body: fetchBody
    });

    if (response.ok) {
        const responseData = await response.json();
        if (responseData.Veri) {
            const data = responseData.Veri[0];
            parseResponseData(data, drinkName);
        } else {
            drinkDataArray.push({ drinkName, totalAdet: "0 (pasif içecek)" });
        }
    } else {
        console.error(`Failed to fetch data for drink: ${drinkName}`);
    }
}

Bu değişiklik büyük bir gelişmeydi. Ağ isteklerini analiz ederek, doğru istek gövdesini üretebilir ve bunu doğrudan API'ye gönderebilirdik. Bu, scripti yalnızca daha hızlı hale getirmekle kalmadı, aynı zamanda web sayfasının yanıt verme süresine bağlı olmaktan kurtardı, böylece daha güvenilir hale getirdi.

Mantığı Geliştirme: Birden Fazla Kategori ve Şubeyi Ele Alma

Yeni yaklaşımımızla, scripti ölçeklendirmeye hazırdık. Bir sonraki adım, birden fazla kategori ve şubeyi ele almaktı. Başlangıçta, script kategorisinden bağımsız olarak içecek verilerini topluyor, bu da seçilen kategoriye ait olmayan içecekler için veri toplamaya çalıştığında hatalara neden oluyordu.

Mantığı değiştirip, scriptin önce belirli bir kategori için tüm içecek kimliklerini toplamasına ve ardından yalnızca bu içecekleri işlemesine karar verdik. Bunu şu şekilde uyguladık:

async function fetchDrinksForCategory(categoryId) {
    const response = await fetch(`https://example.com/api?categoryId=${categoryId}`);
    const drinkIds = await response.json();
    return drinkIds.map(drink => ({ drinkId: drink.UrunID, drinkName: drink.UrunAdi }));
}

async function processDrinksInCategory(categoryId, categoryName) {
    const drinkIds = await fetchDrinksForCategory(categoryId);
    for (const { drinkId, drinkName } of drinkIds) {
        await fetchDrinkData(drinkId, drinkName, categoryName);
    }
}

async function processAllCategories() {
    for (const { categoryId, categoryName } of categories) {
        await processDrinksInCategory(categoryId, categoryName);
    }
}

Bu yeni mantık, scriptin yalnızca seçilen kategori içindeki içecekler için veri toplamasını sağladı, gereksiz hataları önledi ve verilerin doğruluğunu artırdı. Ancak hala bitmemiştik. Birden fazla şubeyi ele almamız ve her şubenin verilerinin ayrı ayrı kaydedilmesini sağlamamız gerekiyordu.

Ölçekleme: Birden Fazla Şube İçin Veri Toplama Otomasyonu

Son zorluk, scripti birden fazla şubeyi ele alacak şekilde genişletmekti. Scriptin her şubeyi tek tek işleyip, verileri toplamasını ve bunları ayrı Excel dosyalarına kaydetmesini istiyorduk. Bu, manuel müdahale olmadan her şube için ayrıntılı raporlar oluşturmamızı sağlayacaktı.

Bunu başarmak için, her şubeyi tek tek işleyen bir döngü ekledik. Bir şube için tüm içecekler işlendiğinde, sonuçlar şubenin adı ve tarih aralığına göre adlandırılmış bir Excel dosyasına kaydediliyor. Bunu şu şekilde yaptık:

async function processAllSubes() {
    for (const branch of branches) {
        await processAllCategories();
        saveAsExcel(branch.name); 
    }
}

function saveAsExcel(branchName) {
    const ws_data = [["Drink Name", "Total Adet", "Category"]]; 
    drinkDataArray.forEach(item => {
        ws_data.push([item.drinkName, item.totalAdet, item.categoryName]);
    });

    const ws = XLSX.utils.aoa_to_sheet(ws_data);
    const wb = XLSX.utils.book_new();
    XLSX.utils.book_append_sheet(wb, ws, "Drink Data");

    XLSX.writeFile(wb, `${branchName}_DrinkData_${tarih1}_to_${tarih2}.xlsx`);
}

Scriptin bu son versiyonu güçlü ve verimliydi, birden fazla şubeyi ve kategoriyi kolayca ele alıyordu. Her şubenin verileri kendi Excel dosyasında kaydedildi, bu da sonuçları analiz etmeyi ve karşılaştırmayı kolaylaştırdı.

Sonuç: Tam Otomatik Bir Raporlama Aracı

Tek bir içecek için veri toplamak amacıyla başlayan bu proje, birden fazla şube, kategori ve istisnai durumu ele alan kapsamlı bir araca dönüştü. Süreç boyunca zorluklarla karşılaştık, sorunları giderdik ve scripti sürekli olarak geliştirdik. Sonuç olarak, veri toplama sürecini hızlandıran ve Excel formatında doğru, iyi organize edilmiş raporlar sunan sağlam bir otomatik çözüm elde ettik.

Bu proje, GPT-4'ün yeteneklerini sergilemenin yanı sıra, otomasyonun karmaşık görevleri basitleştirmedeki gücünü de gösterdi. İster büyük veri setleriyle uğraşıyor olun, ister tekrarlayan görevleri otomatikleştirmek istiyor olun, GPT-4 iş akışınızda değerli bir araç olabilir.

Mutlu kodlamalar!