Ü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ı
- 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.
- 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()