Anàlisi de backlink de la competència amb Python [Complete Script]


En el meu últim articlevam analitzar els nostres enllaços d’entrada utilitzant dades d’Ahrefs.

Aquesta vegada, incloem els enllaços d’entrada de la competència a la nostra anàlisi utilitzant la mateixa font de dades Ahrefs per a la comparació.

Com la darrera vegada, vam definir el valor dels enllaços d’entrada d’un lloc per al SEO com un producte de qualitat i quantitat.

La qualitat és l’autoritat del domini (o la qualificació de domini equivalent d’Ahrefs) i la quantitat és el nombre de dominis de referència.

De nou, avaluarem la qualitat de l’enllaç amb les dades disponibles abans d’avaluar la quantitat.

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ó i neteja de dades

Hem configurat els directoris de fitxers per llegir diversos fitxers de dades exportats Ahrefs en una carpeta, que és molt més ràpid, menys avorrit i més eficient que llegir cada fitxer individualment.

Sobretot quan en tens més de 10!

ahrefs_path="data/"

La funció listdir() del mòdul del sistema operatiu ens permet llistar tots els fitxers d’un subdirectori.

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']

Amb els fitxers enumerats, ara els llegirem cadascun individualment mitjançant un bucle for i els afegirem a un marc de dades.

Mentre llegim el fitxer, utilitzarem una mica de manipulació de cadenes per crear una columna nova amb el nom del lloc de les dades que estem important.

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 dades en brut

Imatge d’Ahrefs, maig de 2022

Ara tenim les dades en brut de cada lloc en un únic marc de dades. El següent pas és ordenar els noms de les columnes i fer-los una mica més fàcils de treballar.

Tot i que la repetició es podria eliminar amb una funció personalitzada o una comprensió de llista, és una bona pràctica i és més fàcil per als principiants SEO Pythonistes veure què passa pas a pas. Com diuen, “la repetició és la mare del domini”, així que practica!

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 recompte i tenir una columna de valor únic (“projecte”) són útils per a les operacions d’agrupació i agregació.

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

competitor_ahrefs_cleancols
Dades de la competència d'AhrefsImatge d’Ahrefs, maig de 2022

Les columnes es netegen, així que ara netejarem les dades de la fila.

competitor_ahrefs_clean_dtypes = competitor_ahrefs_cleancols

Per als dominis de referència, substituïm els guions per zero i establim el tipus de dades com un nombre enter (és a dir, un nombre sencer).

Això també es repetirà per als dominis enllaçats.

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)

Primer vist ens dóna un punt de data en què es van trobar els enllaços, que podem utilitzar per traçar sèries temporals i derivar l’edat de l’enllaç.

Convertirem al format de data mitjançant la funció 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')


Per calcular el link_age només deduirem la primera data vista de la data d’avui i convertirem la diferència en un nombre.

# 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 objectiu ens ajuda a distingir el lloc “client” dels competidors per al qual és útil visualització més tard.

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
Ahrefs neteja els tipus de dadesImatge d’Ahrefs, maig de 2022

Ara que les dades s’han netejat tant pel que fa als títols de les columnes com als valors de les files, estem preparats per establir i començar analitzant.

Qualitat de l’enllaç

Comencem amb la qualitat de l’enllaç, que acceptarem la classificació de domini (DR) com a mesura.

Comencem inspeccionant les propietats distributives de DR traçant la seva distribució mitjançant la funció 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
tipus de distribució de la competènciaImatge d’Ahrefs, maig de 2022

La trama compara les propietats estadístiques del lloc una al costat de l’altra i, sobretot, l’interval interquartil que mostra on cauen la majoria dels dominis de referència en termes de qualificació de domini.

També veiem que John Sankey té la quarta puntuació de domini mitjana més alta, que es compara bé amb la qualitat dels enllaços amb altres llocs.

William Garvey té la gamma de DR més diversa en comparació amb altres dominis, cosa que indica criteris una mica més relaxats per a l’adquisició d’enllaços. Qui sap.

Volums d’enllaç

Això és qualitat. Què passa amb el volum d’enllaços dels dominis de referència?

Per fer-ho, calcularem una suma de dominis de referència mitjançant la funció 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ó d’expansió permet que la finestra de càlcul creixi amb el nombre de files, que és com aconseguim la nostra suma.

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

competitor_count_cumsum_df
Dades de la suma acumulada d'AhrefsImatge d’Ahrefs, maig de 2022

El resultat és un marc de dades amb el lloc, month_year i count_runsum (la suma corrent), que té el format perfecte per alimentar el gràfic.

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àfic del competidor Imatge d’Ahrefs, maig de 2022

El gràfic mostra el nombre de dominis de referència per a cada lloc des del 2014.

Trobo força interessants les diferents posicions inicials de cada lloc quan comencen a adquirir enllaços.

Per exemple, William Garvey va començar amb més de 5.000 dominis. M’encantaria saber qui és la seva agència de relacions públiques!

També podem veure el ritme de creixement. Per exemple, tot i que Hadley Rose va començar l’adquisició d’enllaços el 2018, les coses realment van començar a mitjan 2021.

Més, més i més

Sempre pots fer més anàlisis científics.

Per exemple, una extensió immediata i natural de l’anterior seria combinar tant la qualitat (DR) com la quantitat (volum) per obtenir una visió més integral de com es comparen els llocs en termes de SEO fora del lloc.

Altres extensions serien modelar les qualitats d’aquests dominis de referència tant per als vostres llocs com per als vostres competidors per veure quines característiques d’enllaç (com ara el nombre de paraules o la rellevància del contingut d’enllaç) podrien explicar la diferència de visibilitat entre vosaltres i els vostres competidors. .

Aquesta extensió del model seria una bona aplicació aquestes tècniques d’aprenentatge automàtic.

Més recursos:


Imatge destacada: F8 studio/Shutterstock





Source link

Anàlisi de backlink de la competència amb Python [Complete Script]