import gradio as gr import pandas as pd from scrape.trendyol_scraper import scrape_reviews from scripts.review_summarizer import ReviewAnalyzer import plotly.express as px import plotly.graph_objects as go import os import subprocess import logging from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service # Logging ayarları logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def setup_chrome(): """Chrome ve ChromeDriver kurulumu""" try: # Chromium kullanarak Chrome yerine (Hugging Face'de önceden yüklü) chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') chrome_options.binary_location = '/usr/bin/chromium' # Chromium path # ChromeDriver'ı webdriver-manager ile yönet from webdriver_manager.chrome import ChromeDriverManager from webdriver_manager.core.utils import ChromeType driver_path = ChromeDriverManager(chrome_type=ChromeType.CHROMIUM).install() logger.info(f"ChromeDriver path: {driver_path}") # Test et service = Service(driver_path) with webdriver.Chrome(service=service, options=chrome_options) as driver: driver.get("https://www.google.com") logger.info("Chrome test başarılı!") except Exception as e: logger.error(f"Chrome kurulumunda hata: {str(e)}", exc_info=True) raise class ReviewAnalysisApp: def __init__(self): try: logger.info("Chrome kurulumu başlatılıyor...") setup_chrome() # Uygulama başlatılırken Chrome'u kur logger.info("ReviewAnalyzer başlatılıyor...") self.analyzer = ReviewAnalyzer() logger.info("ReviewAnalyzer başarıyla başlatıldı") except Exception as e: logger.error(f"ReviewAnalyzer başlatılırken hata: {str(e)}", exc_info=True) # Tam hata stack'ini göster self.analyzer = None def analyze_url(self, url): try: # Analyzer'ın başarıyla başlatılıp başlatılmadığını kontrol et if self.analyzer is None: logger.error("Analyzer başlatılamadı") return "Sistem başlatılamadı. Lütfen daha sonra tekrar deneyin.", None, None, None if not url or not url.startswith("https://www.trendyol.com/"): return "Lütfen geçerli bir Trendyol ürün yorumları URL'si girin.", None, None, None logger.info("Yorumlar çekiliyor...") df = scrape_reviews(url) if df.empty: return "Yorumlar çekilemedi. Lütfen URL'yi kontrol edin.", None, None, None logger.info("Sentiment analizi yapılıyor...") analyzed_df = self.analyzer.analyze_reviews(df) if analyzed_df.empty: return "Sentiment analizi yapılamadı.", None, None, None logger.info("Özet oluşturuluyor...") summary = self.analyzer.generate_summary(analyzed_df) logger.info("Grafikler oluşturuluyor...") fig1 = self.create_sentiment_distribution(analyzed_df) fig2 = self.create_rating_distribution(analyzed_df) fig3 = self.create_sentiment_by_rating(analyzed_df) return summary, fig1, fig2, fig3 except Exception as e: error_msg = f"Analiz sırasında hata oluştu: {str(e)}" logger.error(error_msg) return error_msg, None, None, None def create_sentiment_distribution(self, df): fig = px.pie(df, names='sentiment_label', title='Duygu Analizi Dağılımı') return fig def create_rating_distribution(self, df): fig = px.bar(df['Yıldız Sayısı'].value_counts().sort_index(), title='Yıldız Dağılımı') fig.update_layout(xaxis_title='Yıldız Sayısı', yaxis_title='Yorum Sayısı') return fig def create_sentiment_by_rating(self, df): avg_sentiment = df.groupby('Yıldız Sayısı')['sentiment_score'].mean() fig = px.line(avg_sentiment, title='Yıldız Sayısına Göre Ortalama Sentiment Skoru') fig.update_layout(xaxis_title='Yıldız Sayısı', yaxis_title='Ortalama Sentiment Skoru') return fig def create_interface(): app = ReviewAnalysisApp() with gr.Blocks(theme=gr.themes.Soft()) as interface: gr.Markdown("# Trendyol Yorum Analizi") with gr.Row(): url_input = gr.Textbox( label="Trendyol Ürün Yorumları URL'si", placeholder="https://www.trendyol.com/..." ) analyze_btn = gr.Button("Analiz Et") with gr.Row(): with gr.Column(scale=1): summary_output = gr.Textbox( label="Özet", lines=10 ) with gr.Column(scale=2): with gr.Tab("Duygu Analizi"): sentiment_dist = gr.Plot() with gr.Tab("Yıldız Dağılımı"): rating_dist = gr.Plot() with gr.Tab("Sentiment-Yıldız İlişkisi"): sentiment_rating = gr.Plot() analyze_btn.click( fn=app.analyze_url, inputs=[url_input], outputs=[summary_output, sentiment_dist, rating_dist, sentiment_rating] ) return interface if __name__ == "__main__": interface = create_interface() interface.launch()