• 10-09-2024, 02:08:10
    #1
    Ürün Verilerini Otomatik Olarak Excel Dosyasına Kaydetme

    Bu Python betiği, Selenium kullanarak Trendyol ürün sayfalarındaki verileri otomatik olarak toplar ve bu verileri bir Excel dosyasına kaydeder. İşte nasıl çalıştığını ve kullanmanız için gerekli adımları açıklayan profesyonel bir açıklama:

    Özellikler

    • Otomatik Veri Toplama: Belirttiğiniz URL'lerdeki ürün bilgilerini (fiyat, değerlendirme, ürün adı, açıklama, kategori, satıcı bilgileri, vs.) toplar.
    • Resim Koleksiyonu: Ürün sayfasındaki tüm resimleri toplar, slider üzerindeki resimlerin tümünü çeker.
    • Excel Çıkışı: Elde edilen verileri Excel dosyasına kaydeder, böylece verileri kolayca analiz edebilirsiniz.

    Gereksinimler

    • Python 3.x: Python'un son sürümünü yüklediğinizden emin olun.
    • Selenium: Selenium WebDriver'ı ve gerekli tarayıcı sürücüsünü yükleyin.
    • Pandas: Verileri Excel formatında kaydetmek için pandas kütüphanesi gereklidir.
    • Chrome WebDriver: Kod, Google Chrome tarayıcısını kullanır; uygun sürücünün yüklü olması gerekir.

    Kullanım Talimatları

    1. url.txt Dosyasını Hazırlayın: Ürün URL'lerini satır satır url.txt dosyasına yazın. Her URL yeni bir satıra yerleştirilmelidir.
    2. Python Kodunu Çalıştırın:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    import pandas as pd
    import time
    
    # Function to extract product data
    def extract_product_data(driver):
        try:
            data = driver.execute_script('''
                return {
                    rating: document.querySelector('.rating-line-count') ? document.querySelector('.rating-line-count').innerText : 'N/A',
                    price: document.querySelector('.product-price-container .prc-dsc') ? document.querySelector('.product-price-container .prc-dsc').innerText : 'N/A',
                    productName: document.querySelector('h1.pr-new-br a.product-brand-name-with-link') ? document.querySelector('h1.pr-new-br a.product-brand-name-with-link').innerText : 'N/A',
                    productDescription: document.querySelector('h1.pr-new-br span') ? document.querySelector('h1.pr-new-br span').innerText : 'N/A',
                    reviewCount: document.querySelector('.rvw-cnt .total-review-count') ? document.querySelector('.rvw-cnt .total-review-count').innerText : 'N/A',
                    categories: Array.from(document.querySelectorAll('.product-detail-breadcrumb-item span')).map(el => el.innerText),
                    sellerName: document.querySelector('.seller-name-text') ? document.querySelector('.seller-name-text').innerText : 'N/A',
                    sellerRating: document.querySelector('.sl-pn') ? document.querySelector('.sl-pn').innerText.trim() : 'N/A',
                    sellerFollowers: document.querySelector('.seller-follower-count') ? document.querySelector('.seller-follower-count').innerText.trim() : 'N/A'
                };
            ''')
    
            third_last_category = data['categories'][-3] if len(data['categories']) >= 3 else "N/A"
            return {
                "Reyting degeri": data['rating'],
                "fiyat": data['price'],
                "marka ismi": data['productName'],
                "urun basligi": data['productDescription'],
                "oylama": data['reviewCount'],
                "kategori": third_last_category,
                "satici ismi": data['sellerName'],
                "satici reytingi": data['sellerRating'],
                "satici takipci": data['sellerFollowers']
            }
    
        except Exception as e:
            print(f"An error occurred: {e}")
            return {
                "Reyting degeri": "N/A",
                "fiyat": "N/A",
                "marka ismi": "N/A",
                "urun basligi": "N/A",
                "oylama": "N/A",
                "kategori": "N/A",
                "satici ismi": "N/A",
                "satici reytingi": "N/A",
                "satici takipci": "N/A"
            }
    
    # Function to get current image URLs
    def get_image_urls(driver):
        try:
            images = WebDriverWait(driver, 3).until(
                EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.base-product-image img'))
            )
            urls = [img.get_attribute('src') for img in images]
            return urls
        except Exception as e:
            print(f"Error occurred while fetching images: {e}")
            return []
    
    # Function to click the "next" button on the image slider
    def click_next_slider_button(driver):
        try:
            next_button = WebDriverWait(driver, 3).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, 'span.gallery-icon-container.right'))
            )
            next_button.click()
            print("Next slider button clicked")
            time.sleep(2)  # Allow some time for images to load
        except Exception as e:
            print(f"Error occurred while clicking next button: {e}")
            return False
        return True
    
    # Function to collect all image URLs from the slider
    def collect_all_images(driver):
        image_urls = []
        seen_urls = set()
    
        while True:
            current_image_urls = get_image_urls(driver)
    
            # Check for duplicates to avoid infinite loops
            is_duplicate = False
            for url in current_image_urls:
                if url in seen_urls:
                    is_duplicate = True
                    break
                seen_urls.add(url)
                image_urls.append(url)
    
            if is_duplicate:
                print("Detected duplicate image. Ending image collection.")
                break
    
            # Try to click the next slider button, if it fails, stop
            if not click_next_slider_button(driver):
                break
    
        return image_urls
    
    def read_urls_from_file(filename):
        with open(filename, 'r') as file:
            urls = [line.strip() for line in file]
        return urls
    
    def save_to_excel(data, filename):
        df = pd.DataFrame(data)
        df.to_excel(filename, index=False)
    
    def main():
        # Chrome options to handle notifications
        chrome_options = Options()
        chrome_prefs = {
            "profile.default_content_setting_values.notifications": 1  # Allow notifications
        }
        chrome_options.add_experimental_option("prefs", chrome_prefs)
    
        # Initialize WebDriver
        driver = webdriver.Chrome(options=chrome_options)
    
        urls = read_urls_from_file('url.txt')
        all_data = []
    
        for url in urls:
            driver.get(url)
    
            # Accept cookies
            try:
                accept_button = WebDriverWait(driver, 5).until(
                    EC.element_to_be_clickable((By.ID, "onetrust-accept-btn-handler"))
                )
                accept_button.click()
                print(f"Cookies accepted for URL: {url}")
            except Exception as e:
                print(f"Error occurred while accepting cookies for URL {url}: {e}")
    
            # Remove dark overlay element
            try:
                driver.execute_script("document.querySelector('.dark-overlay').style.display = 'none';")
                print(f"Dark overlay removed for URL: {url}")
            except Exception as e:
                print(f"Error removing overlay for URL {url}: {e}")
    
            # Extract product data
            product_data = extract_product_data(driver)
            product_data['URL'] = url
    
            # Collect product images
            image_urls = collect_all_images(driver)
            product_data['Image URLs'] = ', '.join(image_urls)
    
            all_data.append(product_data)
    
        # Save all data to Excel
        save_to_excel(all_data, 'product_data.xlsx')
    
        # Close the browser
        driver.quit()
    
    if __name__ == "__main__":
        main()
  • 26-09-2024, 18:12:20
    #2
    Hocam merhaba. Bilgileri "driver.execute_script" ile çekme sebebiniz nedir ?