从 Google Search Console API 中提取数据以在 Python 中进行数据分析
已发表: 2022-03-01Google Search Console (GSC) 绝对是 SEO 专家最有用的工具之一,因为它允许您获取有关索引覆盖率的信息,尤其是您当前排名的查询。 知道了这一点,很多人使用电子表格分析 GSC 数据,这很好,只要您了解编程语言等工具还有很大的改进空间。
不幸的是,GSC 界面在显示的行(只有 5000 行)和可用时间段方面都非常有限,只有 16 个月。 很明显,这会严重限制您获得洞察力的能力,并且不适合更大的网站。
Python 允许您轻松获取 GSC 数据并自动执行更复杂的计算,这在传统电子表格软件中需要付出更多的努力。
这是 Excel 中最大问题之一的解决方案,即行限制和速度。 如今,您有比以前更多的方法来分析数据,这就是 Python 发挥作用的地方。
您不需要任何高级编码知识来学习本教程,只需了解一些基本概念和使用 Google Colab 进行一些练习。
开始使用 Google Search Console API
在开始之前,设置 Google Search Console API 很重要。 这个过程非常简单,你只需要一个谷歌帐户。 步骤如下:
- 在 Google Cloud Platform 上创建一个新项目。 你应该有一个谷歌帐户,我很确定你有一个。 转到控制台,然后您应该在顶部找到一个用于创建新项目的选项。
- 点击左侧菜单并选择“API and services”,您将进入另一个屏幕。
- 从顶部的搜索栏中查找“Google Search Console API”并启用它。
- 然后转到“凭据”选项卡,您需要某种权限才能使用 API。
- 配置“同意”屏幕,因为这是强制性的。 无论是否公开,我们将要使用的用途都没有关系。
- 您可以选择“桌面应用程序”作为应用程序类型
- 我们将在本教程中使用 OAuth 2.0,您应该下载一个 json 文件,现在您就完成了。
对于大多数人来说,这实际上是最难的部分,尤其是那些不习惯 Google API 的人。 不用担心,接下来的步骤会更容易,问题也更少。
使用 Python 从 Google Search Console API 获取数据
我的建议是使用 Jupyter Notebook 或 Google Colab 之类的笔记本。 后者更好,因为您不必担心要求。 因此,我要解释的是基于 Google Colab 的。
在我们开始之前,使用以下代码将您的 json 文件更新到 Google Colab:
从 google.colab 导入文件 文件.上传()
然后,让我们安装分析所需的所有库,并使用以下代码片段制作更好的表格可视化:
%%捕获 #加载需要的东西 !pip install git+https://github.com/joshcarty/google-searchconsole 将熊猫导入为 pd 将 numpy 导入为 np 将 matplotlib.pyplot 导入为 plt 从 google.colab 导入数据表 !git 克隆 https://github.com/jroakes/querycat.git !pip install -r querycat/requirements_colab.txt !pip 安装 umap-learn data_table.enable_dataframe_formatter() #为了更好的表格可视化
最后,您可以加载 searchconsole 库,它提供了最简单的方法,无需依赖长函数。 使用我正在使用的参数运行以下代码,并确保 client_config 与上传的 json 文件具有相同的名称。
导入搜索控制台 帐户 = searchconsole.authenticate(client_config='client_secret_.json',serialize='credentials.json', flow='console')
您将被重定向到用于授权应用程序的 Google 页面,选择您的 Google 帐户,然后将您将获得的代码复制并粘贴到 Google Colab 栏中。
我们还没有完成,您必须选择需要数据的属性。 您可以通过 account.webproperties 轻松检查您的属性,看看您应该选择什么。
property_name = input('插入 GSC 中列出的网站名称:') webproperty=account[str(property_name)]
完成后,您将运行一个自定义函数来创建一个包含我们数据的对象。
def extract_gsc_data(webproperty, start, stop, *args): 如果 webproperty 不是无: print(f'为 {webproperty} 提取数据') gsc_data = webproperty.query.range(start, stop).dimension(*args).get() 返回 gsc_data 别的: print('Webproperty 未找到,请选择正确的') 返回无
该函数的想法是获取您之前定义的属性和时间范围,以开始和结束日期的形式,以及维度。
能够选择维度的选择对于 SEO 专家来说至关重要,因为它可以让您了解是否需要一定程度的粒度。 例如,在某些情况下,您可能对获取日期维度不感兴趣。
我的建议是始终选择查询和页面,因为 Google Search Console 界面可以单独导出它们,并且每次合并它们非常烦人。 这是 Search Console API 的另一个好处。
在我们的例子中,我们也可以直接获取日期维度,以展示一些需要考虑时间的有趣场景。
ex = extract_gsc_data(webproperty,'2021-09-01','2021-12-31','查询','页面','日期')
选择一个合适的时间范围,考虑到对于较大的属性,您将需要等待很多时间。 对于这个例子,我只考虑 3 个月的时间跨度,平均而言,这足以从大多数数据集中获得有价值的见解。
如果您正在处理大量数据,您甚至可以选择一周,我们关心的是过程。
为了适合示例,我将在这里向您展示的内容要么基于合成数据,要么基于修改过的真实数据。 因此,您在此处看到的内容是完全真实的,并且可以反映真实世界的场景。
数据清洗
对于那些不知道的人,我们不能按原样使用我们的数据,有一些额外的步骤可以确保我们正常工作。 首先,我们必须将我们的对象转换为 Pandas 数据框,这是一种您必须熟悉的数据结构,因为它是 Python 中数据分析的基础。
df = pd.DataFrame(data=ex) df.head()
head 方法可以显示数据集的前 5 行,它非常便于查看数据的外观。 我们可以使用一个简单的函数来计算我们有多少页。
删除重复项的一个好方法是将对象转换为集合,因为集合不能包含重复元素。
一些代码片段的灵感来自于 Hamlet Batista 的笔记本和另一个来自 Masaki Okazawa 的笔记本。
删除品牌条款
首先要做的是删除品牌关键词,我们正在寻找那些不包含我们品牌词的查询。 这对于自定义函数非常简单,您通常会拥有一组品牌术语。
出于演示目的,您不需要将所有这些都过滤掉,但请进行实际分析。 这是 SEO 中最重要的数据清理步骤之一,否则您可能会出现误导性结果。
domain_name = str(input('插入以逗号分隔的品牌词:')).replace(',', '|') 重新进口 domain_name = re.sub(r"\s+", "", domain_name) print('使用正则表达式删除所有空格:\n') df['品牌/非品牌'] = np.where( df['query'].str.contains(domain_name), '品牌', '非品牌' )
我们将在数据集中添加一个新列,以识别这两个类之间的差异。 我们可以通过表格或条形图可视化它们占查询总数的多少。
我不会向您展示条形图,因为它非常简单,而且我认为表格更适合这种情况。
brand_count_df = df['品牌/非品牌'].value_counts().rename_axis('cats').to_frame('counts') brand_count_df['百分比'] = brand_count_df['counts']/sum(brand_count_df['counts']) pd.options.display.float_format = '{:.2%}'.format brand_count_df
您可以快速查看品牌关键字和非品牌关键字之间的比率,以了解要从数据集中删除多少。 这里没有理想的比例,尽管您肯定希望拥有更高比例的非品牌关键字。
然后,我们可以删除所有标记为品牌的行并继续其他步骤。
#仅选择非品牌关键字 df = df.loc[df['品牌/非品牌'] == '非品牌']
填充缺失值等步骤
如果您的数据集具有缺失值(或行话中的 NA),您有多种选择。 最常见的是将它们全部删除或用占位符值(如 0 或该列的平均值)填充它们。
没有正确的答案,两种方法各有利弊,也有风险。 对于 Google Search Console 数据,我最好的建议是使用 0 之类的占位符值,以低估某些指标的影响。
df.fillna(0, inplace = True)
在我们进行实际数据分析之前,我们需要调整我们的特征,即数据集的列。 这个位置特别有趣,因为我们想将它用于一些很酷的数据透视表。
我们可以将位置四舍五入为整数,这符合我们的目的。
df['position'] = df['position'].round(0).astype('int64')
您应该遵循上述所有其他清洁步骤,然后调整日期列。
我们在 pandas 的帮助下提取数月和数年。 如果在较短的时间范围内工作,则无需如此具体,这是一个考虑半年的示例。
#将日期转换为正确的格式 df['date'] = pd.to_datetime(df['date']) #提取月份 df['month'] = df['date'].dt.month #提取年份 df['year'] = df['date'].dt.year
[电子书] 数据 SEO:下一次大冒险
探索性数据分析
Python 的主要优点是您可以执行与 Excel 中相同的操作,但选项更多且更容易。 让我们从每个分析师都非常熟悉的东西开始:数据透视表。
分析每个职位组的平均点击率
分析平均每个职位组的点击率是最有洞察力的活动之一,因为它可以让您了解网站的一般情况。 应用枢轴,然后绘制它。
pd.options.display.float_format = '{:.2%}'.format query_analysis = df.pivot_table(index=['position'], values=['ctr'], aggfunc=['mean']) query_analysis.sort_values(by=['position'], 升序=True).head(10) ax = query_analysis.head(10).plot(kind='bar') ax.set_xlabel('平均位置') ax.set_ylabel('CTR') ax.set_title('CTR 按平均位置') ax.grid('on') ax.get_legend().remove() plt.xticks(旋转=0)
图 1:按位置表示 CTR 以发现异常。
此处的理想情况是图表左侧的点击率更高,因为通常位置 1 的点击率应该更高。 不过要小心,您可能会看到前 3 个广告位的点击率低于预期的情况,您必须进行调查。
请同时考虑边缘情况,例如位置 11 比第一更好的情况。 正如 Search Console 的 Google 文档中所解释的那样,该指标并不遵循您最初可能想到的顺序。
此外,它补充说,这个指标是一个平均值,因为链接的位置每次都在变化,不可能有 100% 的准确度。
有时您的页面排名很高但不够令人信服,因此您可以尝试修复标题。 由于这是一个高级概述,您不会看到细微的差异,因此如果这个问题是大规模的,请期望快速采取行动。
还要注意,当一组处于较低位置的页面的平均点击率高于处于较好位置的页面时。
出于这个原因,您可能希望将分析扩展到 15 位或更多位置,以发现奇怪的模式。
每个位置的查询计数和衡量 SEO 工作量
您为其排名的查询的增加总是一个好的信号,但这并不一定意味着将来会有更好的排名。 查询计数是计算您为其排名的查询数量的过程,并且是您可以使用 GSC 数据执行的最重要的任务之一。
数据透视表再次提供了巨大的帮助,我们可以绘制结果。
ranking_queries = df.pivot_table(index=['position'], values=['query'], aggfunc=['count']) ranking_queries.sort_values(by=['position']).head(10)
作为 SEO 专家,您想要的是在最左侧,即顶部位置有更高的查询计数。 原因很自然,平均而言,较高的位置可以获得更好的点击率,这可以转化为更多的人点击您的页面。
斧头=ranking_queries.head(10).plot(kind='bar') ax.set_ylabel('查询次数') ax.set_xlabel('位置') ax.set_title('排名分布') ax.grid('on') ax.get_legend().remove()
图 2:按职位划分,我有多少查询?
您关心的是随着时间的推移增加顶部位置的查询计数。
玩弄日期维度
让我们看看点击次数在考虑的时间间隔内如何变化,让我们首先获得点击次数的总和:
clicks_sum = df.groupby('date')['clicks'].sum()
我们按日期维度对数据进行分组,并获得每个点击次数的总和,这是一种汇总。
我们现在已经准备好绘制我们得到的东西了,代码会很长,只是为了改善可视化,不要被它吓到。
# 整个时期的点击总和 %config InlineBackend.figure_format = '视网膜' 从 matplotlib.pyplot 导入图 图(图尺寸=(8, 6),dpi=80) ax = clicks_sum.plot(color='red') ax.grid('on') ax.set_ylabel('点击总和') ax.set_xlabel('月') ax.set_title('每月点击次数的变化') xlab = ax.xaxis.get_label() ylab = ax.yaxis.get_label() xlab.set_style('斜体') xlab.set_size(10) ylab.set_style('斜体') ylab.set_size(10) ttl = ax.title ttl.set_weight('粗体') ax.spines['right'].set_color((.8,.8,.8)) ax.spines['top'].set_color((.8,.8,.8)) ax.yaxis.set_label_coords(-.15, .50) ax.fill_between(clicks_sum.index, clicks_sum.values, facecolor='yellow')
图 3:绘制与月份变量相关的点击总和
这是一个从 2021 年 6 月开始一直到 2022 年 1 月一半的示例。您在上面看到的所有线条都具有使此可视化更漂亮的作用,您可以尝试使用它来看看会发生什么。
每个位置的查询计数,每月快照
我们可以在 Python 中绘制的另一个很酷的可视化是热图,它比简单的条形图更直观。 我将向您展示如何根据时间和位置显示查询计数。
将 seaborn 导入为 sns sns.set_theme() df_new = df.loc[(df['position'] <= 10) & (df['year'] != 2022),:] # 加载示例航班数据集并转换为长格式 df_heat = df_new.pivot_table(index = "position", columns = "month", values = "query", aggfunc='count') # 用每个单元格中的数值绘制热图 f, ax = plt.subplots(figsize=(20, 12)) x_axis_labels = [“九月”、“十月”、“十一月”、“十二月”] sns.heatmap(df_heat, annot=True, linewidths=.5, ax=ax, fmt='g', cmap = sns.cm.rocket_r, xticklabels=x_axis_labels) ax.set(xlabel = 'Month', ylabel='Position', title = '每个位置的查询计数如何随时间变化') #rotate 位置标签使它们更具可读性 plt.yticks(旋转=0)
图 4:根据位置和月份显示查询计数进度的热图。
这是我最喜欢的一个,热图可以非常有效地显示数据透视表,例如在这个例子中。 该时间跨度超过 4 个月,如果您横向阅读,您可以看到查询计数如何随着时间的推移而变化。 从 9 月到 12 月,位置 10 略有增加,但位置 2 显着下降,如紫色所示。
在以下场景中,您的大部分查询都排在最前面,这可能是非常不寻常的。 如果发生这种情况,您可能需要返回并分析数据框,寻找可能的品牌术语(如果有)。
正如您从代码中看到的那样,制作复杂的绘图并不难,只要您掌握了背后的逻辑。
如果你做的是“正确”的事情,查询计数应该会随着时间增加,我们可以绘制两个不同时间范围内的差异。 在我提供的示例中,情况显然并非如此,尤其是对于最高职位,您应该有更高的点击率。
介绍一些基本的 NLP 概念
自然语言处理 (NLP) 是 SEO 的天赐之物,您无需成为专家即可应用基本算法。 N-gram 是最强大但最简单的想法之一,可以让您深入了解 GSC 数据。
N-gram 是字母、音节或单词的连续序列。 对于我们的分析,单词将是度量单位。 当相邻元素是两个(一对)时,n-gram 称为 bigram,如果它们是三个,则称为 trigram,依此类推。 我建议你用不同的组合来测试,最多不超过 5 克。
通过这种方式,您可以发现竞争对手页面中最常见的句子或评估您自己的句子。 由于 Google 可能依赖基于短语的索引,因此最好针对句子而不是单个关键字进行优化,如涉及该主题的 Google 专利所示。
正如 Bill Slawski 本人在上页所述,理解相关术语的价值对于优化和您的用户都具有重要价值。
nltk 库以 NLP 应用程序而闻名,它使我们能够删除给定语言(如英语)中的停用词。 将它们视为您想要删除的噪音,事实上,文章和非常常用的词不会增加理解文本的任何价值。
导入 nltk nltk.download('停用词') 从 nltk.corpus 导入停用词 stoplist = stopwords.words('english') 从 sklearn.feature_extraction.text 导入 CountVectorizer c_vec = CountVectorizer(stop_words=stoplist, ngram_range=(2,3)) # ngram 矩阵 ngrams = c_vec.fit_transform(df['query']) # ngram 的计数频率 count_values = ngrams.toarray().sum(axis=0) # ngram 列表 vocab = c_vec.vocabulary_ df_ngram = pd.DataFrame(sorted([(count_values[i],k) for k,i in vocab.items()], reverse=True) ).rename(columns={0: '频率', 1:'bigram/trigram'}) df_ngram.head(20).style.background_gradient()
我们获取查询列并计算二元组的频率,以创建一个存储二元组及其出现次数的数据帧。
这一步实际上对于分析竞争对手的网站也非常重要。 您可以通过每次调整 n 来查看他们的文本并检查最常见的 n-gram 以查看您是否在高排名页面中发现不同的模式。
如果您考虑一下它会更有意义,因为单个关键字不会告诉您有关上下文的任何信息。
低垂的果实
最可爱的事情之一是检查低垂的果实,那些你可以轻松改进的页面,以便尽早看到好的结果。 这对于说服您的利益相关者的每个 SEO 项目的第一步至关重要。 因此,如果有机会利用这些页面,那就去做吧!
我们考虑这样一个页面的标准是展示次数和点击率的分位数。 换句话说,我们正在过滤位于前 80% 印象中但在 20% 中获得最低 CTR 的行。 这些行的点击率将低于其余行的 80%。
top_impressions = df[df['impressions'] >= df['impressions'].quantile(0.8)] (top_impressions[top_impressions['ctr'] <= top_impressions['ctr'].quantile(0.2)].sort_values('impressions', 升序 = False))
现在您有一个列表,其中包含按展示次数降序排列的所有机会。
根据您的网站需求及其大小,您可以考虑其他标准来定义什么是容易实现的目标。
对于较小的网站,您可能会考虑寻找更高的百分比,而在大型网站中,您应该已经根据我使用的标准获得了大量信息。
[电子书] 面向非技术思想家的技术 SEO
介绍querycat:分类和关联
Querycat 是一个简单但功能强大的库,具有用于聚类关键字的关联规则挖掘等功能。 我只会向您展示关联,因为它们在此类分析中更有价值。
您可以通过查看 querycat GitHub 存储库来了解有关这个很棒的库的更多信息。
关于关联规则学习的简短介绍
关联规则学习是一种查找规则的方法,这些规则定义了项目集之间的关联和共现。 这与另一种无监督机器学习方法,即所谓的聚类略有不同。
最终目标是相同的,获取关键字集群以了解我们的网站在某些主题上的表现。
Querycat 让您可以在两种算法之间进行选择:Apriori 和 FP-Growth。 我们将选择后者以获得更好的性能,因此您可以忽略前者。
FP-Growth 是 Apriori 的改进版本,用于查找数据集中的频繁模式。 关联规则学习对于电子商务交易也非常有用,例如,您可能有兴趣了解人们一起购买什么。
在这种情况下,我们的重点全部放在查询上,但我提到的另一个应用程序可能是谷歌分析数据的另一个有用的想法。
从数据结构的角度解释这些算法非常具有挑战性,我认为这对于您的 SEO 任务来说是不必要的。 我将仅解释一些基本概念以了解参数的含义。
2种算法的3个主要元素是:
- 支持——它表达了一个项目或一个项目集的流行度。 用技术术语来说,它是查询 X 和查询 Y 一起出现的事务数除以事务总数。
此外,它可以用作去除不常见项目的阈值。 对于提高统计显着性和性能非常有用。 设置一个好的最小支撑是非常好的。 - 置信度——您可以将其视为术语同时出现的概率。
- Lift – 对(第 1 期和第 2 期)的支持与第 1 期的支持之间的比率。我们可以查看它的值以深入了解术语之间的关系。 如果大于 1,则项是相关的; 如果小于 1,则项不太可能有关联:如果 lift 恰好为 1(或接近),则没有显着关系。
本文提供了有关库作者编写的 querycat 的更多详细信息。
现在我们准备进入实际部分。
导入查询猫 query_cat = querycat.Categorize(df, 'query', min_support=10, alg='fpgrowth') dfgrouped = df.groupby('category').agg(sumclicks = ('clicks', 'sum')).sort_values('sumclicks', ascending=False) #create group 过滤少于 15 次点击的类别(任意数量) filtergroup = dfgrouped[dfgrouped['sumclicks'] > 15] 过滤器组 #应用过滤器 df = df.merge(filtergroup, on=['category','category'], how='inner')
在此过程中,我们过滤了频率较低的类别,我选择了 15 个作为基准。 这只是一个随意的数字,背后没有标准。
让我们使用以下代码段检查我们的类别:
df['category'].value_counts()
那么点击率最高的 10 个类别呢? 让我们检查一下每个查询有多少个查询。
df.groupby('category').sum()['clicks'].sort_values(ascending=False).head(10)
选择的数字是任意的,一定要选择一个能过滤掉大部分群体的数字。 一个可能的想法是获取展示次数的中位数并降低最低的 50%,前提是您要排除小组。
获取集群以及如何处理输出
我的建议是导出你的新数据框以避免再次运行 FP-Growth,请这样做以节省有用的时间。
一旦您有了集群,您就想知道每个集群的点击次数和展示次数,以便评估哪些领域需要最多改进。
grouped_df = df.groupby('category')[['clicks', 'impressions']].agg('sum')
通过一些数据处理,我们能够改善我们的关联结果,并为每个集群获得点击和印象。
group_ex = df.groupby(['category'])['query'].apply(' | '.join).reset_index() #删除重复的查询,然后按字母顺序排序 group_ex['query'] = group_ex['query'].apply(lambda x: ' | '.join(sorted(list(set(x.split('|')))))) df_final = group_ex.merge(grouped_df, on=['category', 'category'], how='inner') df_final.head()
您现在拥有一个 CSV 文件,其中包含所有关键字集群以及点击次数和展示次数。
#save csv 文件并将其下载到本地计算机。 如果您使用 Safari,请考虑切换到 Chrome 下载这些文件,因为它可能无法正常工作。 df_final.to_csv('clusters_queries.csv') files.download('clusters_queries.csv')
实际上,有更好的聚类方法,这只是一个示例,说明如何使用 querycat 执行多个任务以立即使用。 这里的主要目标是获得尽可能多的见解,特别是对于您没有那么多知识的新网站。
目前最好的方法涉及语义,所以如果你想专注于聚类,我建议你考虑学习图或嵌入。
但是,如果您是新手,这些都是高级主题,您可以简单地尝试一些在线提供的预构建 Streamlit 应用程序。
抓取数据³
结论和下一步
Python 可以在分析您的网站方面提供重要帮助,并且可以帮助您将数据清理、可视化和分析结合在一个地方。 更高级的任务肯定需要从 GSC API 中提取数据,并且是对数据自动化的“温和”介绍。
虽然您可以使用 Python 进行许多更高级的计算,但我的建议是检查在 SEO 价值方面什么是有意义的。
例如,从长远来看,查询计数作为一个整体更为重要,因为您希望您的网站被考虑用于更多查询。
使用 notebook 对使用注释打包代码有很大帮助,这也是我建议您习惯 Google Colab 的主要原因。
这只是数据分析可以为您提供的开始,因为最好的想法来自合并不同的数据集。
Google Search Console 本身就是一个强大的工具,而且它是完全免费的,您可以从中获得的实用信息量几乎是无限的。