使用此 Python 脚本分析反向链接,发现您与竞争对手之间的可见性差异。
质量是域权威(或 Ahrefs 的等效域评级),数量是引用域的数量。
同样,我们将在评估数量之前使用可用数据评估链接质量。
是时候编码了。
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'
数据导入和清理
我们设置了文件目录,在一个文件夹中读取多个 Ahrefs 导出的数据文件,这比单独读取每个文件更快、更少无聊、更高效。
尤其是当你有超过 10 个时!
ahrefs_path = 'data/'
OS 模块的 listdir() 函数允许我们列出子目录中的所有文件。
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']
列出文件后,我们现在将使用 for 循环单独读取每个文件,并将它们添加到数据帧中。
在读取文件时,我们将使用一些字符串操作来创建一个新列,其中包含我们正在导入的数据的站点名称。
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
现在我们在单个数据框中拥有来自每个站点的原始数据。下一步是整理列名并使它们更易于使用。
尽管可以通过自定义函数或列表理解来消除重复,但对于初学者 SEO Pythonistas 来说,这是一种很好的做法,并且更容易逐步了解正在发生的事情。正如他们所说,“重复是掌握之母”,所以开始练习吧!
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]
计数列和具有单值列(’project’)对于 groupby 和聚合操作很有用。
competitor_ahrefs_cleancols['rd_count'] = 1
competitor_ahrefs_cleancols['project'] = target_name
competitor_ahrefs_cleancols
列已清理,所以现在我们将清理行数据。
对于引用域,我们将连字符替换为零并将数据类型设置为整数(即整数)。
这也将针对链接域重复。
competitor_ahrefs_clean_dtypes = competitor_ahrefs_cleancols
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)
First seen 为我们提供了找到链接的日期点,我们可以将其用于时间序列绘图和导出链接年龄。
我们将使用 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')
要计算 link_age,我们只需从今天的日期中减去第一次看到的日期,然后将差值转换为数字。
# 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)
目标列帮助我们区分“客户”网站与竞争对手,这对以后的可视化很有用。
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
既然数据已经按照列标题和行值进行了清理,我们就可以开始着手分析了。
链接质量
我们从链接质量开始,我们将接受域评级 (DR) 作为衡量标准。
让我们首先通过使用 geom_bokplot 函数绘制分布来检查 DR 的分布属性。
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
该图并排比较了网站的统计属性,最值得注意的是,四分位间距显示了大多数引用域在域评级方面的位置。
我们还看到 John Sankey 具有第四高的中值域评级,与其他网站的链接质量相比,效果很好。
与其他领域相比,William Garvey 拥有最多样化的 DR,这表明链接获取的标准稍微宽松一些。谁知道。
链接卷
这就是质量。来自引用域的链接量如何?
为了解决这个问题,我们将使用 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()
扩展功能允许计算窗口随着行数的增加而增长,这就是我们实现运行总和的方式。
competitor_count_cumsum_df['count_runsum'] = competitor_count_cumsum_df['rd_count'].expanding().sum()
competitor_count_cumsum_df
结果是一个包含站点、month_year 和 count_runsum(运行总和)的数据框,它采用完美的格式来提供图表。
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
该图显示了自 2014 年以来每个站点的引用域数量。
当每个站点开始获取链接时,我发现每个站点的不同起始位置非常有趣。
例如,William Garvey 一开始就有超过 5,000 个域名。我很想知道他们的公关公司是谁!
我们还可以看到增长率。例如,虽然 Hadley Rose 在 2018 年开始获取链接,但事情在 2021 年中期左右才真正起飞。
更多,更多,更多
你总是可以做更科学的分析。
例如,上述内容的一个直接和自然的扩展是结合质量(DR)和数量(体积),以便更全面地了解网站在场外 SEO 方面的比较。
其他扩展是为您自己和您的竞争对手网站模拟那些引用域的质量,以查看哪些链接功能(例如链接内容的字数或相关性)可以解释您和您的竞争对手之间的可见性差异.