SocialSERP / app.py
tomaseo2022's picture
Update app.py
c278b0e verified
import subprocess
import sys
# Intentar instalar pytrends si no está presente
try:
from pytrends.request import TrendReq
except ImportError:
subprocess.check_call([sys.executable, "-m", "pip", "install", "git+https://github.com/GeneralMills/pytrends.git"])
from pytrends.request import TrendReq
import requests
import pandas as pd
import gradio as gr
from time import sleep
from pytrends.request import TrendReq
# Configuración de pytrends
pytrends = TrendReq(hl='es-ES', tz=360)
# Mapa de códigos de países compatibles con pytrends
paises_codigos = {
"Estados Unidos": "united_states",
"Reino Unido": "united_kingdom",
"Alemania": "germany",
"Francia": "france",
"Italia": "italy",
"Japón": "japan",
"Australia": "australia",
"Canadá": "canada",
"Brasil": "brazil",
"India": "india",
"España": "spain"
}
# Función para obtener temas populares de Google Trends según el país seleccionado
def obtener_temas_populares(pais_codigo):
if pais_codigo == "spain":
tendencias = pytrends.top_charts(2023, hl='es-ES', geo='ES')
if not tendencias.empty and "title" in tendencias.columns:
temas_populares = tendencias["title"].tolist()[:20] # Ajustado para generar más temas
else:
temas_populares = ["No se encontraron temas populares para España."]
else:
tendencias = pytrends.trending_searches(pn=pais_codigo)
temas_populares = tendencias[0].tolist()[:20] if 0 in tendencias.columns else ["No se encontraron tendencias."]
return temas_populares
# Función para obtener el interés de búsqueda de keywords y filtrar por un umbral
def obtener_interes_keyword(keyword):
pytrends.build_payload([keyword], cat=0, timeframe='today 3-m')
interes = pytrends.interest_over_time()
if not interes.empty:
return interes[keyword].mean()
return 0
# Función para realizar una búsqueda en Google usando la API de búsqueda personalizada
def buscar_en_google(keyword, api_key, cse_id):
url = f"https://www.googleapis.com/customsearch/v1?q={keyword}&key={api_key}&cx={cse_id}"
response = requests.get(url)
if response.status_code == 200:
return response.json()
else:
return None
# Función principal para buscar y filtrar keywords con interés mínimo y resultados en redes sociales
def buscar_keywords_redes(api_key, cse_id, pais_codigo, interes_minimo=50):
temas_populares = obtener_temas_populares(pais_codigo)
modificadores = ["ideas", "consejos", "tutorial", "guía", "fotos", "ejemplos", "tendencias", "mejores", "novedades", "noticias"]
keywords_automaticas = [f"{mod} de {tema}" for tema in temas_populares for mod in modificadores]
resultados_sociales = []
for keyword in keywords_automaticas:
interes_promedio = obtener_interes_keyword(keyword)
if interes_promedio >= interes_minimo:
data = buscar_en_google(keyword, api_key, cse_id)
if data:
for item in data.get('items', []):
link = item['link']
if any(dominio in link for dominio in ["pinterest.com", "facebook.com", "x.com"]):
resultados_sociales.append({
'Keyword': keyword,
'Interés promedio': round(interes_promedio, 2),
'Enlace': link,
'Título': item['title']
})
break
sleep(1)
df_resultados_sociales = pd.DataFrame(resultados_sociales)
return df_resultados_sociales if not df_resultados_sociales.empty else "No se encontraron keywords con el interés mínimo en redes sociales."
# Función de Gradio para mostrar los resultados
def gradio_interface(api_key, cse_id, pais, interes_minimo):
pais_codigo = paises_codigos[pais]
# Mensaje inicial de "procesando"
resultados = buscar_keywords_redes(api_key, cse_id, pais_codigo, interes_minimo)
return resultados if isinstance(resultados, str) else resultados.to_html(index=False)
# Instrucciones detalladas para los usuarios
instrucciones = """
<div style="display: flex;">
<div style="flex: 1; padding-right: 10px;">
<h3>Paso 1: Crear una API Key de Google</h3>
<ol>
<li>Accede a <a href="https://console.cloud.google.com/" target="_blank">Google Cloud Console</a>.</li>
<li>Crea un proyecto nuevo o selecciona uno existente:
<ul>
<li>En el menú superior, haz clic en el selector de proyectos y luego en “Nuevo proyecto”.</li>
<li>Asigna un nombre a tu proyecto y haz clic en <b>Crear</b>.</li>
<li>Una vez creado, asegúrate de que el proyecto esté seleccionado (debe mostrarse en la parte superior).</li>
</ul>
</li>
<li>Activar Custom Search API:
<ul>
<li>Dentro de tu proyecto, en la barra de búsqueda en la parte superior, escribe <b>Custom Search API</b> y selecciona la opción cuando aparezca.</li>
<li>En la página de la Custom Search API, haz clic en <b>Habilitar</b> para activarla en tu proyecto.</li>
</ul>
</li>
<li>Crea una API Key:
<ul>
<li>Ve al menú en el lado izquierdo y selecciona <b>APIs y servicios > Credenciales</b>.</li>
<li>Haz clic en <b>Crear credenciales</b> y selecciona <b>Clave de API</b>.</li>
<li>Google generará una nueva clave de API para ti. <b>Copia esta clave</b> y guárdala en un lugar seguro; la necesitarás para el script.</li>
</ul>
</li>
</ol>
</div>
<div style="flex: 1; padding-left: 10px;">
<h3>Paso 2: Obtener el Custom Search Engine ID (CSE ID)</h3>
<ol>
<li>Ve a <a href="https://cse.google.com/cse/" target="_blank">Google Custom Search Engine</a>.</li>
<li>Crea un nuevo motor de búsqueda:
<ul>
<li>Haz clic en <b>Nuevo motor de búsqueda</b>.</li>
<li>En "Sitios a buscar", puedes ingresar cualquier URL (por ejemplo, "example.com") solo para completar el campo; este parámetro no es importante para nuestro propósito.</li>
<li>Asigna un nombre a tu motor de búsqueda y haz clic en <b>Crear</b>.</li>
</ul>
</li>
<li>Obtener el CSE ID:
<ul>
<li>Una vez creado el motor de búsqueda, serás dirigido al panel de control del motor.</li>
<li>Haz clic en el <b>nombre de tu motor de búsqueda</b>.</li>
<li>En la sección <b>Configuración</b> o <b>Detalles</b> (en el menú de la izquierda), encontrarás el <b>ID del motor de búsqueda</b>. Este es tu CSE ID.</li>
<li><b>Copia este ID</b> y guárdalo junto con tu API Key.</li>
</ul>
</li>
</ol>
</div>
</div>
"""
# Crear la interfaz de Gradio
iface = gr.Interface(
fn=gradio_interface,
inputs=[
gr.Textbox(label="Google API Key", placeholder="Ingresa tu API Key de Google"),
gr.Textbox(label="Custom Search Engine ID (CSE ID)", placeholder="Ingresa tu CSE ID de Google"),
gr.Dropdown(label="Selecciona el país", choices=list(paises_codigos.keys()), value="España"),
gr.Slider(label="Interés mínimo (0-100)", minimum=0, maximum=100, step=1, value=50)
],
outputs="html",
title="Búsqueda de Keywords con Resultados de Redes Sociales",
description=("Esta herramienta busca keywords para las que Google muestra resultados de redes sociales (Pinterest, Facebook, X) debido a la falta de contenido web especializado.\n\n" + instrucciones),
)
iface.launch(share=True)