Leer esto de llevara más o menos... 14 minutos
by APFerrer
Share
Trucos rápidos para salir del paso: Contenido duplicado
Hoy: Ver el contenido duplicado de tu web usando Python y Google Colab
Ayer vimos cómo extraer las URLs salientes de cualquier web (o de la que tú elijas). Hoy vamos a aprovechar esa funcionalidad y dar un paso más allá con algo que muchas herramientas te cobran: detectar contenido duplicado. Sabemos que si eres una startup o trabajas por tu cuenta, probablemente no tengas un gran presupuesto para invertir en herramientas de SEO. Por eso, lo mejor es hacerlo gratis y con un par de scripts sencillos.
El contenido duplicado no solo afecta al SEO, sino también a la percepción de la calidad de tu web. Cuando Google detecta que varias de tus páginas tienen contenido similar o repetido, te penaliza bajando tu posición en los resultados de búsqueda. Y no quieres eso, ¿verdad?
Vamos a ver como detectar esas duplicidades con Python y Google Colab, y lo mejor es que no necesitas ser un programador experto. Este truco rápido te permitirá identificar qué páginas están compitiendo entre sí por las mismas palabras clave, lo que, en esencia, te está haciendo la zancadilla en los rankings.
Lo primero que tienes que saber: ¿Qué es el SEO?
El SEO, o Search Engine Optimization, es el conjunto de técnicas que se utilizan para mejorar la visibilidad de un sitio web en los motores de búsqueda como Google. La historia del SEO se remonta a los primeros días de los buscadores, cuando las páginas se posicionaban simplemente por su contenido y la cantidad de palabras clave.
Con el tiempo, Google se ha vuelto más inteligente, y el SEO ha evolucionado. Ya no se trata solo de llenar una página con palabras clave. Ahora Google valora la calidad del contenido, la experiencia del usuario, la estructura del sitio y, sobre todo, la relevancia de lo que publicas.
Por eso, hoy en día las técnicas de SEO se dividen en dos grandes áreas: SEO on-page y SEO off-page. El SEO on-page se refiere a todo lo que puedes hacer directamente en tu web, como la optimización de las palabras clave, mejorar la velocidad de carga, crear contenido original y de valor, usar bien las etiquetas HTML y hacer un buen uso de enlaces internos. Por otro lado, el SEO off-page se enfoca en lo que ocurre fuera de tu sitio, como obtener enlaces de calidad desde otras webs, lo que le dice a Google que tu contenido es relevante y merece ser mostrado.
¿Por qué es importante el SEO? Porque la mayoría de los usuarios no pasan de la primera página de resultados de búsqueda. Si tu web no está ahí, es como si no existiera. Pero más allá de aparecer en los primeros resultados, el SEO también se preocupa por ofrecer una buena experiencia al usuario, asegurándose de que tu web sea fácil de navegar, rápida y accesible desde cualquier dispositivo.
Todo esto forma parte de lo que Google tiene en cuenta a la hora de rastrear tu sitio y decidir en qué posición aparecerás. Así que cuando hablamos de SEO, en realidad estamos hablando de cómo hacer que tu sitio web le guste a Google y, por ende, a tus usuarios. Y parte esencial de esto es evitar problemas como el contenido duplicado, que es justo lo que vamos a resolver hoy.
¿Cómo funciona el SEO?
El SEO es más que simplemente elegir las palabras clave correctas. Todo empieza con los motores de búsqueda, que envían bots o arañas para rastrear millones de sitios web. Estos bots leen el contenido y lo indexan, lo que significa que lo añaden a la base de datos de Google, organizándolo en función de su relevancia y calidad.
A partir de aquí, Google aplica un algoritmo (bastante secreto, por cierto) que evalúa múltiples factores de cada página. Lo más importante que debes tener en cuenta es que Google se enfoca en dos cosas: relevancia y autoridad. La relevancia la determina según las palabras clave que usas, pero también si tu contenido realmente responde a lo que el usuario está buscando. No basta con tener muchas palabras clave, sino que Google evalúa si estás ofreciendo la mejor respuesta posible.
Por otro lado, la autoridad se basa en como de confiable es tu sitio web. Aquí es donde entran en juego los backlinks, que son enlaces desde otras páginas hacia la tuya. Cuantos más sitios confiables enlacen a tu web, más «autoridad» tendrás a los ojos de Google. Es como si te estuvieran recomendando. Dicho de otro modo: Le gustas más a Google cuanto más hablan de ti los «guays» (como en el instituto).
Pero no se trata solo de contenido y enlaces. Google también presta atención a la estructura técnica de tu web. Cosas como la velocidad de carga, el diseño adaptado a móviles, y la seguridad (por ejemplo, si tienes un certificado SSL) juegan un papel clave. Si tu web tarda mucho en cargar o no se ve bien en un móvil, Google lo nota y puede penalizarte.
¿Cómo es una buena arquitectura SEO?
Una buena arquitectura SEO es aquella que facilita tanto a los motores de búsqueda como a los usuarios la navegación y comprensión del contenido de tu web. Piensa en ella como el esqueleto de tu sitio: todo debe estar organizado de manera clara y lógica.
Primero, las páginas más importantes deben estar a pocos clics de distancia desde la página principal. Esto significa que tu contenido debe estar jerárquicamente estructurado, con categorías y subcategorías claras.
Luego está el enlace interno, que es clave para guiar tanto a Google como a los usuarios a través de tu sitio. Enlaces desde una página relevante a otra ayudan a distribuir la autoridad y facilitar el rastreo.
Además, necesitas tener URLs limpias y descriptivas, que reflejen el contenido de cada página. Evita URLs llenas de números o caracteres sin sentido.
Y por último (pero no menos importante), la estructura de encabezados (H1, H2, H3…) debe organizar bien el contenido en cada página. El H1 debe ser el título principal, mientras que los subtítulos H2 y H3 ayudan a Google a entender la jerarquía de la información.
¿Y por qué es malo el contenido duplicado?
El contenido duplicado es perjudicial principalmente porque confunde a los motores de búsqueda. Google no sabe qué página priorizar cuando varias de tus páginas tienen el mismo o contenido muy similar. Como resultado, puede dividir la relevancia entre ellas, haciendo que todas bajen de posición en los resultados de búsqueda. Además, el contenido duplicado diluye la autoridad de tu web, lo que también afecta al SEO.
¿Lo pillas? Espera que te doy más información, por si acaso…
Lo segundo que tienes que saber: Contenido duplicado: Niet, no, never.
El contenido duplicado no es algo que puedas ignorar si te importa el SEO. Google, en su afán por ofrecer contenido relevante y único a los usuarios, penaliza seriamente a las webs que repiten o clonan información en diferentes páginas. Esto puede suceder sin que te des cuenta: tal vez publicas artículos muy parecidos, o reutilizas descripciones de productos en tu tienda online. El problema es que, al tener varias páginas con el mismo contenido, Google no sabe cuál priorizar y termina afectando a todas, reduciendo tu visibilidad en los resultados de búsqueda.
Además, desde el punto de vista del usuario, es frustrante encontrarse con información repetida en diferentes partes de tu web. Esto no solo afecta la experiencia del usuario, sino que también impacta en la percepción de tu marca.
Para resumir: contenido duplicado, no. Te va a costar caro en términos de SEO, y la calidad de tu web se verá afectada. ¡Por eso es crucial detectarlo y corregirlo! Y justo eso es lo que vamos a hacer ahora.
Ahora que ya sabemos un poco de teoría, vamos a lo que le da calidad a la película…
Cómo usar Python y Google Colab para ver el contenido duplicado de nuestra web
Si eres aplicado ya tendrás tu extractor de URL que vimos ayer. Así que vamos a suponer que aquí no hay nadie que no sea aplicado y vamos a ir directos a lo que queremos ver todos.
Paso 1: Accede a Google Colab
Lo primero que debes hacer es entrar en Google Colab. Si nunca lo has usado antes, no te preocupes, es muy sencillo. Solo tienes que seguir estos pasos:
Una vez dentro, añade un bloque de código y pega el siguiente código:
import requests
from bs4 import BeautifulSoup
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import re
# Filtrar solo las URLs que no contengan '/services' ni '/category'
urls_filtradas = [url for url in enlaces_internos_unicos if '/services' not in url and '/category' not in url]
# Función para extraer contenido filtrado
def obtener_contenido_filtrado(url):
try:
print(f"Extrayendo contenido de: {url}")
respuesta = requests.get(url)
sopa = BeautifulSoup(respuesta.content, 'html.parser')
# Excluir menús, pies de página y encabezados comunes
for elemento in sopa.select('nav, footer, header, aside'):
elemento.decompose()
# Extraer solo los párrafos <p> y texto relevante
parrafos = [p.get_text() for p in sopa.find_all('p')]
# Filtrar patrones comunes
texto_filtrado = []
for parrafo in parrafos:
if not re.search(r"categoría|archivos|navegación|menú", parrafo, re.IGNORECASE):
texto_filtrado.append(parrafo)
return ' '.join(texto_filtrado)
except Exception as e:
print(f"Error al obtener contenido de {url}: {e}")
return ""
# Función para detectar duplicados
def detectar_duplicados(urls, umbral=0.95):
textos = [obtener_contenido_filtrado(url) for url in urls]
# Vectorización del contenido
vectorizador = TfidfVectorizer().fit_transform(textos)
sim_matrix = cosine_similarity(vectorizador)
duplicados = {}
for i in range(len(urls)):
duplicidad_total = 0
detalles_duplicados = []
for j in range(len(urls)):
if i != j:
duplicidad_total += sim_matrix[i][j]
if sim_matrix[i][j] > umbral:
detalles_duplicados.append((urls[j], sim_matrix[i][j]))
duplicidad_total /= (len(urls) - 1)
duplicados[urls[i]] = (duplicidad_total, detalles_duplicados)
return duplicados
# Ejecutar el análisis solo con las URLs filtradas
duplicados = detectar_duplicados(urls_filtradas)
# Mostrar resultados
for url, (duplicidad_total, detalles) in duplicados.items():
print(f"\nURL: {url}\nTasa total de duplicidad en párrafos: {duplicidad_total:.2f}")
if detalles:
print(f"Detalles de duplicados que superan el umbral:")
for dup_url, similitud in detalles:
print(f" {dup_url} con una similitud de {similitud:.2f}")
Ejecútalo después de ejecutar el primero, ya sabes,, el extractor de URLS… y ya está, no hay más pasos…
¿Qué hace este «cacho» de código que no entiendo?
¡Me alegra que me hagas esa pregunta!
Lo primero que hace es importar las bibliotecas que vamos a usar:
- requests: Una biblioteca que se usa para hacer peticiones HTTP. Nos permite descargar el contenido de las páginas web que queremos analizar.
- BeautifulSoup: La usamos para analizar el contenido HTML de esas páginas web. Es como si le diéramos un «rayos X» a la página para extraer el texto que nos interesa.
- TfidfVectorizer (de
sklearn
) (si dices el nombre bien tres veces seguidas te convalidan Arameo): Aquí es donde entra la magia del procesamiento de texto. Con esta herramienta, convertimos el contenido de las páginas en un formato que podamos comparar para detectar similitudes. - cosine_similarity (también de
sklearn
): Esta función calcula qué cómo de similares son dos textos. Nos devuelve un valor entre 0 y 1, donde 1 significa que dos páginas son idénticas.
Lo siguiente que hace es recoger las URLs que hemos extraído de nuestro script anterior y filtrar las que no nos interesan (en mi caso, no quiero que considere las que están bajo /services
ni /category
, ¡pero tú puedes ajustar esto según tus necesidades!).
Después de filtrar, extraemos el contenido de las URLs seleccionadas, y para asegurarnos de que todo va bien, le ponemos un print que así parece que sabemos más de lo que sabemos realmente…
¿Pero qué contenido estamos extrayendo?
No queremos todo, porque, claro, en la web hay contenido redundante (como menús, encabezados, o pies de página que se repiten en todas las páginas). Así que nos enfocamos solo en lo importante: los párrafos. Estos son los bloques de texto que contienen la verdadera «chicha» del contenido. De ahí, filtramos los patrones comunes.
¿Cómo que patrones comunes? ¿Cómo sabe el código que son patrones comunes?
¡Otra muy buena pregunta! Tienes el día «sembrao». A ver, que te cuento… El código filtra esos «patrones comunes» utilizando expresiones regulares (regex
), que son como reglas para identificar palabras o frases que suelen repetirse en varias páginas pero que no aportan mucho al análisis. Por ejemplo, términos como «categoría», «archivos», o «navegación» se eliminan porque no representan contenido único e importante para comparar entre páginas.
Antes de que me lo preguntes, no, REGEX no es el nombre de un spray para dolores musculares. Es un lenguaje formal usado en programación para buscar y manipular texto basado en patrones específicos. Por ejemplo, imagina que quieres encontrar la palabra «perro» en un libro. Usarías Regex para definir un patrón que no solo busque exactamente «perro», sino también variantes como «Perro», «perros», o incluso «perrito». Regex te permite crear patrones flexibles para encontrar coincidencias dentro de grandes cantidades de texto.
Vale, pues ahora que tenemos nuestros «patrones», busquemos duplicados
Lo que hacemos ahora es definir una función nueva (por eso usamos def) que nos busque los valores duplicados.
Vectorización del contenido: Vectorizar significa convertir texto en números que los algoritmos puedan entender. En este caso, usamos TF-IDF (Term Frequency – Inverse Document Frequency). TF-IDF mide la importancia de las palabras en relación con un documento y el resto del conjunto de documentos:
- TF (Frecuencia del Término): Cuántas veces aparece una palabra en una página.
- IDF (Frecuencia Inversa del Documento): Cómo de rara es esa palabra en el conjunto de nuestras páginas. Palabras comunes como «el» o «y» tendrán un valor bajo.
Esto transforma cada página en un vector numérico que representa la importancia de las palabras.
Comparación de similitudes: cosine_similarity
es una función de la librería sklearn
que mide cuánto se parecen dos textos. En lugar de comparar palabra por palabra, transforma los textos en números (vectores) y calcula cuántos elementos tienen en común. El resultado es un número entre 0 y 1:
- 1 significa que los textos son prácticamente iguales.
- 0 indica que no tienen nada en común.
Es muy útil, por ejemplo, para detectar contenido duplicado en una web o para ver si dos documentos están tratando el mismo tema.
El umbral de 0.95 significa que si la similitud entre dos páginas es mayor a 0.95, las consideramos duplicadas. Si necesitas cambiar este umbral, basta con que cambies esta línea de código
def detectar_duplicados(urls, umbral=0.95):
Resultados: El código calcula y almacena en un diccionario la tasa de duplicidad total de cada página. Luego, si alguna página supera el umbral de 0.95 en comparación con otra, se detalla la similitud exacta entre ambas. Finalmente, se imprime el resultado mostrando las URLs que presentan duplicidad y el porcentaje de similitud.
Conclusiones
¿No ha sido para tanto, no?
Quizá necesites instalar la biblioteca sklearn
en tu cuaderno de Google Colab. Pero tranquilo, puedes hacerlo simplemente ejecutando el siguiente comando:
!pip install scikit-learn
Y con eso, ya estaría todo por hoy Te recomiendo suscribirte para no perderte lo que traiga mañana… ¡podría ser algo que te interese! Ahí lo dejo… 😉
Enlace al cuaderno de Google Colab
Si prefieres no copiar y pegar todo el código, te lo dejo listo en un cuaderno de Google Colab para que puedas ejecutarlo directamente. Solo tienes que hacer clic en el enlace de abajo y empezar a trabajar con él: