SEO / app.py
Merlintxu's picture
Update app.py
a8a2139 verified
raw
history blame
4.16 kB
import gradio as gr
import json
from seo_analyzer import SEOSpaceAnalyzer
import spacy
import subprocess
import sys
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def setup_spacy_model() -> None:
"""
Verifica y descarga el modelo de spaCy 'es_core_news_lg' si no está instalado.
"""
try:
spacy.load("es_core_news_lg")
logger.info("Modelo spaCy 'es_core_news_lg' cargado correctamente.")
except OSError:
logger.info("Descargando modelo spaCy 'es_core_news_lg'...")
try:
subprocess.run(
[sys.executable, "-m", "spacy", "download", "es_core_news_lg"],
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
logger.info("Modelo descargado exitosamente.")
except subprocess.CalledProcessError as e:
logger.error(f"Error al descargar modelo: {e.stderr.decode()}")
raise RuntimeError("No se pudo descargar el modelo spaCy") from e
def create_interface() -> gr.Blocks:
analyzer = SEOSpaceAnalyzer()
with gr.Blocks(title="SEO Analyzer Pro", theme=gr.themes.Soft()) as interface:
gr.Markdown("""
# 🕵️ SEO Analyzer Pro
**Analizador SEO avanzado con modelos de lenguaje**
Ingresa la URL de un sitemap.xml para analizar el sitio web.
""")
with gr.Row():
with gr.Column():
sitemap_input = gr.Textbox(
label="URL del Sitemap",
placeholder="https://ejemplo.com/sitemap.xml",
interactive=True
)
analyze_btn = gr.Button("Analizar Sitio", variant="primary")
with gr.Row():
clear_btn = gr.Button("Limpiar")
download_btn = gr.Button("Descargar Reporte", variant="secondary")
plot_btn = gr.Button("Visualizar Enlaces Internos", variant="secondary")
with gr.Column():
status_output = gr.Textbox(label="Estado del Análisis", interactive=False)
with gr.Tabs():
with gr.Tab("📊 Resumen"):
stats_output = gr.JSON(label="Estadísticas Generales")
recommendations_output = gr.JSON(label="Recomendaciones SEO")
with gr.Tab("📝 Contenido"):
content_output = gr.JSON(label="Análisis de Contenido")
with gr.Tab("🔗 Enlaces"):
links_output = gr.JSON(label="Análisis de Enlaces")
links_plot = gr.Plot(label="Visualización de Enlaces Internos")
with gr.Tab("📄 Detalles"):
details_output = gr.JSON(label="Detalles Individuales")
def generate_report() -> str:
if analyzer.current_analysis:
report_path = "content_storage/seo_report.json"
with open(report_path, 'w', encoding='utf-8') as f:
json.dump(analyzer.current_analysis, f, indent=2, ensure_ascii=False)
return report_path
return ""
def plot_internal_links(links_json: dict) -> any:
return analyzer.plot_internal_links(links_json)
analyze_btn.click(
fn=analyzer.analyze_sitemap,
inputs=sitemap_input,
outputs=[stats_output, recommendations_output, content_output, links_output, details_output],
show_progress=True
)
clear_btn.click(
fn=lambda: [None, None, None, None, None],
outputs=[stats_output, recommendations_output, content_output, links_output, details_output]
)
download_btn.click(
fn=generate_report,
outputs=gr.File(label="Descargar Reporte")
)
plot_btn.click(
fn=plot_internal_links,
inputs=links_output,
outputs=links_plot
)
return interface
if __name__ == "__main__":
setup_spacy_model()
app = create_interface()
app.launch(server_name="0.0.0.0", server_port=7860, show_error=True, share=False)