import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse, unquote
import time
import pandas as pd
import trafilatura

def get_google_news_links(query, num_results=5):
    """
    Estrae i link degli articoli da Google News per una data query
    """
    # Formatta la query per l'URL
    query = query.replace(' ', '+')
    url = f"https://news.google.com/search?q={query}&hl=it"
    
    print(f"\nRicerca su URL: {url}")
    
    # Headers per evitare il blocco
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Language': 'it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1',
    }
    
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        print(f"Status code risposta: {response.status_code}")
        
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # Debug della struttura HTML
        print("\nCerco elementi nella pagina...")
        
        # Prova diversi selettori comuni di Google News
        articles = soup.select('article')
        if not articles:
            articles = soup.select('.VlJC8')
        if not articles:
            articles = soup.select('.IBr9hb')
        if not articles:
            articles = soup.select('.NiLAwe')
            
        print(f"\nTrovati {len(articles)} articoli totali")
        
        # Debug della struttura HTML
        print("\nStruttura della pagina:")
        main_content = soup.find('main')
        if main_content:
            print("Main content trovato")
            print(f"Classi principali trovate: {main_content.get('class', [])}")
        else:
            print("Main content non trovato")
        
        links = []
        for i, article in enumerate(articles[:num_results], 1):
            # Prova diversi modi per trovare il link
            link = article.find('a', href=True)
            if not link:
                link = article.select_one('a[href]')
            
            if link and 'href' in link.attrs:
                href = link['href']
                # Se è un URL relativo, convertilo in assoluto
                if href.startswith('./'):
                    article_url = 'https://news.google.com' + href[1:]
                elif href.startswith('/'):
                    article_url = 'https://news.google.com' + href
                else:
                    article_url = href
                    
                print(f"\nArticolo {i}:")
                print(f"- Link trovato: {article_url}")
                
                try:
                    # Segui il redirect per ottenere l'URL finale
                    redirect_response = requests.get(article_url, headers=headers, allow_redirects=True)
                    final_url = redirect_response.url
                    print(f"- URL finale: {final_url}")
                    links.append(final_url)
                except Exception as e:
                    print(f"Errore nel seguire il redirect: {str(e)}")
                    continue
        
        print(f"\nEstrati con successo {len(links)} link validi")
        return links
    
    except Exception as e:
        print(f"Errore durante l'estrazione dei link: {str(e)}")
        # Debug aggiuntivo
        print(f"Response content: {response.text[:500]}...")  # Primi 500 caratteri
        return []

def extract_article_content(url):
    """
    Estrae il titolo e il contenuto di un articolo dato il suo URL usando trafilatura
    """
    try:
        print(f"\nEstraiamo il contenuto da: {url}")
        
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        response = requests.get(url, headers=headers)
        print(f"Status code: {response.status_code}")
        
        downloaded = trafilatura.fetch_url(url)
        if downloaded:
            result = trafilatura.extract(downloaded, include_comments=False, include_tables=False)
            print("Contenuto estratto con successo")
        else:
            print("Nessun contenuto scaricato da trafilatura")
            return None
        
        soup = BeautifulSoup(response.text, 'html.parser')
        title = soup.title.string if soup.title else "Titolo non trovato"
        print(f"Titolo trovato: {title}")
        
        content_length = len(result) if result else 0
        print(f"Lunghezza contenuto: {content_length} caratteri")
        
        if content_length > 0:
            return {
                'title': title,
                'text': result,
                'url': url
            }
        return None
    
    except Exception as e:
        print(f"Errore durante l'estrazione dell'articolo {url}: {str(e)}")
        return None

def main():
    query =  "sostenitbilità ambientale"
    num_results = int(4)

    
    print("\nRecupero i link da Google News...")
    links = get_google_news_links(query, num_results)
    
    if not links:
        print("Nessun link trovato. Uscita.")
        return
    
    articles = []
    for i, link in enumerate(links, 1):
        print(f"\nElaborazione articolo {i}/{len(links)}")
        article_content = extract_article_content(link)
        if article_content:
            articles.append(article_content)
            print(f"Articolo {i} aggiunto con successo")
        else:
            print(f"Articolo {i} saltato a causa di errori")
        time.sleep(1)
    
    print(f"\nTotale articoli elaborati con successo: {len(articles)}")
    
    if articles:
        df = pd.DataFrame(articles)
        output_file = f"articoli_{query.replace(' ', '_')}.csv"
        df.to_csv(output_file, index=False, encoding='utf-8')
        print(f"Articoli salvati in {output_file}")
    else:
        print("Nessun articolo estratto con successo. Nessun file CSV creato.")

if __name__ == "__main__":
    main()