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 # Logging ayarları logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def setup_chrome(): """Chrome ve ChromeDriver kurulumu""" try: # Chrome kurulumu komutları commands = [ 'apt-get update', 'apt-get install -y wget unzip', 'wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -', 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list', 'apt-get update', 'apt-get install -y google-chrome-stable' ] for cmd in commands: logger.info(f"Executing: {cmd}") result = os.system(cmd) if result != 0: logger.error(f"Command failed: {cmd}") raise Exception(f"Command failed: {cmd}") # ChromeDriver kurulumu chrome_version = subprocess.check_output(['google-chrome', '--version']).decode().strip().split()[2].split('.')[0] logger.info(f"Detected Chrome version: {chrome_version}") driver_commands = [ f'wget -q "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_{chrome_version}" -O chrome_version', f'wget -q "https://chromedriver.storage.googleapis.com/$(cat chrome_version)/chromedriver_linux64.zip"', 'unzip chromedriver_linux64.zip', 'mv chromedriver /usr/local/bin/', 'chmod +x /usr/local/bin/chromedriver' ] for cmd in driver_commands: logger.info(f"Executing: {cmd}") result = os.system(cmd) if result != 0: logger.error(f"Command failed: {cmd}") raise Exception(f"Command failed: {cmd}") logger.info("Chrome ve ChromeDriver başarıyla kuruldu!") except Exception as e: logger.error(f"Chrome kurulumunda hata: {str(e)}") raise class ReviewAnalysisApp: def __init__(self): try: setup_chrome() # Uygulama başlatılırken Chrome'u kur self.analyzer = ReviewAnalyzer() except Exception as e: print(f"Uygulama başlatılırken hata: {str(e)}") def analyze_url(self, url): try: 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 print("Yorumlar çekiliyor...") df = scrape_reviews(url) if df.empty: return "Yorumlar çekilemedi. Lütfen URL'yi kontrol edin.", None, None, None print("Sentiment analizi yapılıyor...") analyzed_df = self.analyzer.analyze_reviews(df) print("Özet oluşturuluyor...") summary = self.analyzer.generate_summary(analyzed_df) print("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)}" print(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()