import gradio as gr import requests from bs4 import BeautifulSoup import re from urllib.parse import urlparse def buscar_google(query, dominio, hl='es', num_results=100): all_results = [] posiciones_dominio = [] posiciones_dominio_exacto = [] url_objetivo = dominio dominio_objetivo = urlparse(url_objetivo).netloc table_html = "Ver Resultados" estilo = "color: #ed4b4b;" for start in range(0, num_results, 10): url = f"https://www.google.com/search?q={query}&hl={hl}&start={start}" 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.3" } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') search_results = soup.find_all('div', attrs={'class': 'tF2Cxc'}) all_results.extend(search_results) for i, result in enumerate(all_results[:num_results]): header = result.find('h3') header = header.text if header else "Sin t铆tulo" link = result.find('a', href=True)['href'] link_clean = re.search("(?Phttps?://[^\s]+)", link).group("url") dominio_resultado = urlparse(link_clean).netloc estilo_dominio = "" if dominio_objetivo in dominio_resultado: posiciones_dominio.append(i + 1) if link_clean == url_objetivo: posiciones_dominio_exacto.append(i + 1) estilo_dominio = estilo else: estilo_dominio = estilo # Marcar en rojo las URLs del mismo dominio table_html += f"" table_html += "
Posici贸nT铆tuloURL
{i+1}{header}{link_clean}
" # Construcci贸n del mensaje y la tabla HTML mensaje = "" emoji = "" if posiciones_dominio: first_position = posiciones_dominio[0] if first_position == 1: emoji = f"{posiciones_dominio} 馃" elif first_position <= 3: emoji = f"{posiciones_dominio} 馃槑" elif first_position <= 5: emoji = f"{posiciones_dominio} 馃槅" elif first_position <= 10: emoji = f"{posiciones_dominio} 馃檪" elif first_position <= 100: emoji = f"{posiciones_dominio} 馃槓" else: emoji = f"No est谩 en el top 100 馃槶" if len(posiciones_dominio) > 1 and 1 in posiciones_dominio: mensaje = f"Parasitaci贸n SEO: {url_objetivo} se encuentra en las posiciones {posiciones_dominio}" elif len(posiciones_dominio) > 1: mensaje = f"Canibalizaci贸n: {url_objetivo} se encuentra en las posiciones {posiciones_dominio}" elif len(posiciones_dominio) == 1 and len(posiciones_dominio_exacto) == 0: mensaje = f"Canibalizaci贸n: URL diferente del dominio en la posici贸n {posiciones_dominio[0]}" elif len(posiciones_dominio) == 1: mensaje = f"Sin canibalizaci贸n: {url_objetivo} se encuentra en la posici贸n {posiciones_dominio[0]}" else: mensaje = f"{url_objetivo} no se encuentra en el top 100" mensaje_completo = f"Posici贸n: {emoji}
{mensaje}" html_output = f"
{mensaje_completo}
" html_output += "
" html_output += table_html html_output += "
" return html_output def canibalizacion_interface(url, keyword): # Comprobar si la URL cumple con el patr贸n http o https if not re.match(r'^https?://', url): return "

Error: Introduce una URL con el protocolo http o https.

" return buscar_google(keyword, url) iface = gr.Interface( fn=canibalizacion_interface, inputs=["text", "text"], outputs="html", title="

Canibal SEO

", description="

Encuentra posibles canibalizaciones y parasitaciones en Google a partir de una URL y una palabra clave.

", article="

Desarrollada por 漏 Artxe Web

" ) iface.launch()