Análisis de backlinks de la competencia con Python [Complete Script]


En mi último artículoanalizamos nuestros vínculos de retroceso utilizando datos de Ahrefs.

Esta vez, estamos incluyendo los vínculos de retroceso de la competencia en nuestro análisis utilizando la misma fuente de datos de Ahrefs para comparar.

Como la última vez, definimos el valor de los backlinks de un sitio para SEO como un producto de calidad y cantidad.

La calidad es la autoridad del dominio (o la calificación de dominio equivalente de Ahrefs) y la cantidad es la cantidad de dominios de referencia.

Nuevamente, evaluaremos la calidad del enlace con los datos disponibles antes de evaluar la cantidad.

Hora de codificar.

import re
import time
import random
import pandas as pd
import numpy as np
import datetime
from datetime import timedelta
from plotnine import *
import matplotlib.pyplot as plt
from pandas.api.types import is_string_dtype
from pandas.api.types import is_numeric_dtype
import uritools  

pd.set_option('display.max_colwidth', None)
%matplotlib inline
root_domain = 'johnsankey.co.uk'
hostdomain = 'www.johnsankey.co.uk'
hostname="johnsankey"
full_domain = 'https://www.johnsankey.co.uk'
target_name="John Sankey"

Importación y limpieza de datos

Configuramos los directorios de archivos para leer múltiples archivos de datos exportados de Ahrefs en una carpeta, lo cual es mucho más rápido, menos monótono y más eficiente que leer cada archivo individualmente.

¡Especialmente cuando tienes más de 10 de ellos!

ahrefs_path="data/"

La función listdir() del módulo OS nos permite listar todos los archivos en un subdirectorio.

ahrefs_filenames = os.listdir(ahrefs_path)
ahrefs_filenames.remove('.DS_Store')
ahrefs_filenames

File names now listed below:

['www.davidsonlondon.com--refdomains-subdomain__2022-03-13_23-37-29.csv',
 'www.stephenclasper.co.uk--refdomains-subdoma__2022-03-13_23-47-28.csv',
 'www.touchedinteriors.co.uk--refdomains-subdo__2022-03-13_23-42-05.csv',
 'www.lushinteriors.co--refdomains-subdomains__2022-03-13_23-44-34.csv',
 'www.kassavello.com--refdomains-subdomains__2022-03-13_23-43-19.csv',
 'www.tulipinterior.co.uk--refdomains-subdomai__2022-03-13_23-41-04.csv',
 'www.tgosling.com--refdomains-subdomains__2022-03-13_23-38-44.csv',
 'www.onlybespoke.com--refdomains-subdomains__2022-03-13_23-45-28.csv',
 'www.williamgarvey.co.uk--refdomains-subdomai__2022-03-13_23-43-45.csv',
 'www.hadleyrose.co.uk--refdomains-subdomains__2022-03-13_23-39-31.csv',
 'www.davidlinley.com--refdomains-subdomains__2022-03-13_23-40-25.csv',
 'johnsankey.co.uk-refdomains-subdomains__2022-03-18_15-15-47.csv']

Con los archivos enumerados, ahora leeremos cada uno individualmente usando un bucle for y los agregaremos a un marco de datos.

Mientras leemos el archivo, usaremos alguna manipulación de cadenas para crear una nueva columna con el nombre del sitio de los datos que estamos importando.

ahrefs_df_lst = list()
ahrefs_colnames = list()

for filename in ahrefs_filenames:
    df = pd.read_csv(ahrefs_path + filename)
    df['site'] = filename
    df['site'] = df['site'].str.replace('www.', '', regex = False)    
    df['site'] = df['site'].str.replace('.csv', '', regex = False)
    df['site'] = df['site'].str.replace('-.+', '', regex = True)
    ahrefs_colnames.append(df.columns)
    ahrefs_df_lst.append(df)

ahrefs_df_raw = pd.concat(ahrefs_df_lst)
ahrefs_df_raw
ahrefs dofollow datos sin procesar

Imagen de Ahrefs, mayo de 2022

Ahora tenemos los datos sin procesar de cada sitio en un solo marco de datos. El siguiente camino es ordenar los nombres de las columnas y hacerlos un poco más amigables para trabajar.

Aunque la repetición podría eliminarse con una función personalizada o una lista de comprensión, es una buena práctica y más fácil para los Pythonistas principiantes de SEO ver lo que sucede camino a camino. Como dicen, «la repetición es la madre del dominio», ¡así que ponte a practicar!

competitor_ahrefs_cleancols = ahrefs_df_raw
competitor_ahrefs_cleancols.columns = [col.lower() for col in competitor_ahrefs_cleancols.columns]
competitor_ahrefs_cleancols.columns = [col.replace(' ','_') for col in competitor_ahrefs_cleancols.columns]
competitor_ahrefs_cleancols.columns = [col.replace('.','_') for col in competitor_ahrefs_cleancols.columns]
competitor_ahrefs_cleancols.columns = [col.replace('__','_') for col in competitor_ahrefs_cleancols.columns]
competitor_ahrefs_cleancols.columns = [col.replace('(','') for col in competitor_ahrefs_cleancols.columns]
competitor_ahrefs_cleancols.columns = [col.replace(')','') for col in competitor_ahrefs_cleancols.columns]
competitor_ahrefs_cleancols.columns = [col.replace('%','') for col in competitor_ahrefs_cleancols.columns]

La columna de conteo y tener una sola columna de valor («proyecto») son útiles para operaciones de agrupación y agregación.

competitor_ahrefs_cleancols['rd_count'] = 1
competitor_ahrefs_cleancols['project'] = target_name

competitor_ahrefs_cleancols
Datos de la competencia de AhrefsImagen de Ahrefs, mayo de 2022

Las columnas se limpian, así que ahora limpiaremos los datos de las filas.

competitor_ahrefs_clean_dtypes = competitor_ahrefs_cleancols

Para los dominios de referencia, reemplazamos los guiones por cero y establecemos el tipo de datos como un número entero (es decir, un número entero).

Esto también se repetirá para los dominios vinculados.

competitor_ahrefs_clean_dtypes['dofollow_ref_domains'] = np.where(competitor_ahrefs_clean_dtypes['dofollow_ref_domains'] == '-',
                                                           0, competitor_ahrefs_clean_dtypes['dofollow_ref_domains'])
competitor_ahrefs_clean_dtypes['dofollow_ref_domains'] = competitor_ahrefs_clean_dtypes['dofollow_ref_domains'].astype(int)



# linked_domains

competitor_ahrefs_clean_dtypes['dofollow_linked_domains'] = np.where(competitor_ahrefs_clean_dtypes['dofollow_linked_domains'] == '-',
                                                           0, competitor_ahrefs_clean_dtypes['dofollow_linked_domains'])
competitor_ahrefs_clean_dtypes['dofollow_linked_domains'] = competitor_ahrefs_clean_dtypes['dofollow_linked_domains'].astype(int)

Visto por primera vez nos da un punto de fecha en el que se encontraron los enlaces, que podemos usar para trazar series de tiempo y derivar la edad del enlace.

Convertiremos al formato de fecha usando la función to_datetime.

# first_seen
competitor_ahrefs_clean_dtypes['first_seen'] = pd.to_datetime(competitor_ahrefs_clean_dtypes['first_seen'], 
                                                              format="%d/%m/%Y %H:%M")
competitor_ahrefs_clean_dtypes['first_seen'] = competitor_ahrefs_clean_dtypes['first_seen'].dt.normalize()
competitor_ahrefs_clean_dtypes['month_year'] = competitor_ahrefs_clean_dtypes['first_seen'].dt.to_period('M')


Para calcular link_age, simplemente deduciremos la primera fecha vista de la fecha de hoy y convertiremos la diferencia en un número.

# link age
competitor_ahrefs_clean_dtypes['link_age'] = dt.datetime.now() - competitor_ahrefs_clean_dtypes['first_seen']
competitor_ahrefs_clean_dtypes['link_age'] = competitor_ahrefs_clean_dtypes['link_age']
competitor_ahrefs_clean_dtypes['link_age'] = competitor_ahrefs_clean_dtypes['link_age'].astype(int)
competitor_ahrefs_clean_dtypes['link_age'] = (competitor_ahrefs_clean_dtypes['link_age']/(3600 * 24 * 1000000000)).round(0)

La columna de destino nos ayuda a distinguir el sitio del «cliente» frente a los competidores, lo cual es útil para visualización luego.

competitor_ahrefs_clean_dtypes['target'] = np.where(competitor_ahrefs_clean_dtypes['site'].str.contains('johns'),
                                                                                            1, 0)
competitor_ahrefs_clean_dtypes['target'] = competitor_ahrefs_clean_dtypes['target'].astype('category')

competitor_ahrefs_clean_dtypes
Tipos de datos limpios de AhrefsImagen de Ahrefs, mayo de 2022

Ahora que los datos están limpios tanto en términos de títulos de columna como de valores de fila, estamos listos para establecer y comenzar analizando.

La calidad del enlace

Comenzamos con la calidad del enlace, que aceptaremos como medida la calificación de dominio (DR).

Comencemos por inspeccionar las propiedades distributivas de DR trazando su distribución usando la función geom_bokplot.

comp_dr_dist_box_plt = (
    ggplot(competitor_ahrefs_analysis.loc[competitor_ahrefs_analysis['dr'] > 0], 
           aes(x = 'reorder(site, dr)', y = 'dr', colour="target")) + 
    geom_boxplot(alpha = 0.6) +
    scale_y_continuous() +   
    theme(legend_position = 'none', 
          axis_text_x=element_text(rotation=90, hjust=1)
         ))

comp_dr_dist_box_plt.save(filename="images/4_comp_dr_dist_box_plt.png", 
                           height=5, width=10, units="in", dpi=1000)
comp_dr_dist_box_plt
tipos de distribucion de la competenciaImagen de Ahrefs, mayo de 2022

La gráfica compara las propiedades estadísticas del sitio una al lado de la otra, y más notablemente, el rango intercuartílico que muestra dónde se encuentran la mayoría de los dominios de referencia en términos de calificación de dominio.

También vemos que John Sankey tiene la cuarta calificación de dominio mediana más alta, que se compara bien con la calidad de los enlaces en comparación con otros sitios.

William Garvey tiene la gama más diversa de DR en comparación con otros dominios, lo que indica criterios ligeramente más relajados para la adquisición de enlaces. Quién sabe.

Vincular volúmenes

Eso es calidad. ¿Qué pasa con el volumen de enlaces de dominios de referencia?

Para tocar eso, calcularemos una suma acumulada de dominios de referencia utilizando la función groupby.

competitor_count_cumsum_df = competitor_ahrefs_analysis

competitor_count_cumsum_df = competitor_count_cumsum_df.groupby(['site', 'month_year'])['rd_count'].sum().reset_index()

La función de expansión permite que la ventana de cálculo crezca con el número de filas, que es como logramos nuestra suma acumulada.

competitor_count_cumsum_df['count_runsum'] = competitor_count_cumsum_df['rd_count'].expanding().sum()

competitor_count_cumsum_df
Datos de suma acumulada de AhrefsImagen de Ahrefs, mayo de 2022

El resultado es un marco de datos con el sitio, month_year y count_runsum (la suma acumulada), que tiene el formato perfecto para alimentar el gráfico.

competitor_count_cumsum_plt = (
    ggplot(competitor_count_cumsum_df, aes(x = 'month_year', y = 'count_runsum', 
                                           group = 'site', colour="site")) + 
    geom_line(alpha = 0.6, size = 2) +
    labs(y = 'Running Sum of Referring Domains', x = 'Month Year') + 
    scale_y_continuous() + 
    scale_x_date() +
    theme(legend_position = 'right', 
          axis_text_x=element_text(rotation=90, hjust=1)
         ))
competitor_count_cumsum_plt.save(filename="images/5_count_cumsum_smooth_plt.png", 
                           height=5, width=10, units="in", dpi=1000)

competitor_count_cumsum_plt
gráfico de la competencia Imagen de Ahrefs, mayo de 2022

El gráfico muestra la cantidad de dominios de referencia para cada sitio desde 2014.

Encuentro bastante interesante las diferentes posiciones iniciales de cada sitio cuando comienzan a adquirir enlaces.

Por ejemplo, William Garvey comenzó con más de 5000 dominios. ¡Me encantaría saber quién es su agencia de relaciones públicas!

También podemos ver la tasa de crecimiento. Por ejemplo, aunque Hadley Rose comenzó la adquisición de enlaces en 2018, las cosas realmente despegaron a mediados de 2021.

Más, más y más

Siempre se puede hacer un análisis más científico.

Por ejemplo, una extensión inmediata y natural de lo anterior sería combinar tanto la calidad (DR) como la cantidad (volumen) para obtener una visión más holística de cómo se comparan los sitios en términos de SEO externo.

Otras extensiones serían modelar las cualidades de esos dominios de referencia tanto para su sitio como para el de la competencia para ver qué características del enlace (como la cantidad de palabras o la relevancia del contenido del enlace) podrían explicar la diferencia de visibilidad entre usted y sus competidores. .

Esta extensión del modelo sería una buena aplicación de estas técnicas de aprendizaje automático.

Más recursos:


Imagen destacada: Estudio F8/Shutterstock





Consultar el artículo en la publicación original

Análisis de backlinks de la competencia con Python [Complete Script]
A %d blogueros les gusta esto: