自 2000 年代初以来,反向链接作为质量信号的重要性几乎没有变化。算法已经发展,但反向链接仍然是一个强大的排名因素。
查找自己的反向链接统计数据并将其与竞争对手进行比较的行为是 SEO 的主要内容。在这个过程中,新的是升级活动的操作并变得更聪明。让我们减少一次性的竞争对手检查,开始批量分析,以及根据通过 SERP 抓取的 X 关键字的反向链接数据,谁/为什么最重要。
在这个
Python SEO
教程中,我将逐步向您展示如何构建脚本来抓取给定关键字的SERP,然后分析该SERP中的前X个站点以找到许多反向链接见解。
我们可以从 ahrefs 获得数十个指标进行分析,但在本教程中,我们将重点关注:
-
ahrefs 网址排名
-
反向链接计数
-
引用域计数
-
反向链接的顶级锚文本计数
-
按引用域排列的顶级锚文本计数
-
%,其中查询一克在锚文本中(我认为这个真的很酷!
-
反向链接的平均 ahrefs 链接排名
要求和假设
-
安装了Python 3,理解了基本的Python语法
-
访问Linux安装(我推荐Ubuntu)或centos
-
SERPapi 或类似服务(如果不是 SERPapi,则需要修改 API 调用)
-
arefes接口访问
-
复制代码时要小心,因为缩进并不总是保留得很好
安装 Python 模块
可能需要为您的环境安装的唯一模块是 SERPapi 模块,模糊地称为 google-search-results。如果您在笔记本中,请不要忘记前面的感叹号。
pip3 install google-search-results
导入 Python 模块
-
requests:
用于调用两个 API
-
panda:
存储结果数据
-
json:
处理来自 API 的响应
-
Serpapi:与
Serpapi
API 接口
-
urllib.parse:
用于编码和解码传递给 API 的 URL
-
seaborn:
小熊猫表条件格式的乐趣
import requests
import pandas as pd
import json
from serpapi import GoogleSearch
import urllib.parse
import seaborn as sns
设置 API 变量
首先,让我们为每个 API 设置关键变量。这些密钥通常会在每个平台的帐户部分找到。一定要保护他们。
ahrefs_apikey = “”
serp_apikey = “”
让我们为 SERPapi 调用设置一些变量。如果需要,请参阅其完整的 API 文档,了解许多其他参数。
-
查询:这是您要搜索的
查询
-
位置
:您要传达搜索来自的国家/地区
-
lang
:查询搜索所使用的语言
-
国家/地区
:与地理位置类似,您通常希望它们对齐
-
result_num
:要返回多少个结果。8 通常是第一页,16 是两页,依此类推
-
google_domain
:您要从中搜索的国家/地区特定域名(例如 baidu.com 或 google.fr)。这通常与上面的一些参数一致。
query = “”
location = “”
lang = “”
country = “”
result_num = “”
google_domain = “”
进行 SERP API 调用
接下来,我们使用上面的参数构建简单的 API 调用(添加所需的任何其他参数),运行它,并以
JSON
形式接收结果。简单!
params = {
“q”: query,
“location”: location,
“hl”: lang,
“gl”: country,
“num”: result_num,
“google_domain”: google_domain,
“api_key”: serp_apikey}
search = GoogleSearch(params)
results = search.get_dict()
设置容器列表和数据帧
现在,我们只需创建列表变量,其中的数据将被临时存储,然后移动到 pandas 数据帧,最终将在那里生存。要存储的任何额外指标分析都需要添加为其他列。请注意,我还按空格拆分查询,并创建一个单元语法列表,与查询相比,我们将使用该列表进行锚文本分析。我们将找出反向链接锚文本与查询相比在主题上的强度。
df = pd.DataFrame(columns = [‘URL’, ‘UR’, ‘BL’,’RD’,’Top Anchor RD’,’Top Anchor BL’,”%KW in Anchors”])
keyword_gram_list = query.split(” “)
urls = []
kw_an_ratio_list = []
backlinks_list = []
backlink_UR_list = []
refdomains_list = []
rank_list = []
top_anchor_rd = []
top_anchor_bl = []
Process SERP Result URLs
Now we want to start analyzing the top X sites for the query you used. We start by looping through the results provided by SERPapi. The next step will be hitting the ahrefs API, but before that, we need to encode each SERP result URL as we need to pass the URL via an HTTP parameter. FYI, most of the below tutorial should be within this loop, until we start processing some of the anchor text and appending to the dataframe.
for x in results[“organic_results”]:
urls.append(urllib.parse.quote(x[“link”]))
检索反向链接计数
一旦我们对 URL 进行了编码(使特殊字符参数友好),我们就可以开始第一次 ahrefs 调用。我们需要 4 个不同的调用,因为我们需要的数据分布在 4 个不同的 API 报表终结点中。请参阅完整的 ahrefs API 文档,了解和修改网址参数。第一个调用是获取反向链接和引用域计数。一旦我们进行了调用,我们只需将值加载到我们的列表中以供以后使用。
for x in urls:
apilink = “https://apiv2.ahrefs.com/?token=”+ahrefs_apikey+”&target=”+x+”&limit=1000&output=json&from=metrics_extended&mode=exact”
get_backlinks = requests.get(apilink)
getback = json.loads(get_backlinks.text)
backlinks = getback[‘metrics’][‘backlinks’]
backlinks_list.append(backlinks)
refdomains = getback[‘metrics’][‘refdomains’]
refdomains_list.append(refdomains)
检索网址排名
我们调用的下一个 ahrefs API 是获取 URL 排名。
apilink = “https://apiv2.ahrefs.com/?token=”+ahrefs_apikey+”&target=”+x+”&limit=1000&output=json&from=ahrefs_rank&mode=exact”
get_rank = requests.get(apilink)
getrank = json.loads(get_rank.text)
rank = getrank[‘pages’][0][‘ahrefs_rank’]
rank_list.append(rank)
检索反向链接平均排名
第三个 API 调用是获取 URL 的整个反向链接配置文件(可能需要调整 URL 中的
限制
参数)并
平均
ahref 排名。
apilink = “https://apiv2.ahrefs.com/?token=”+ahrefs_apikey+”&target=”+x+”&limit=2000&output=json&from=backlinks&order_by=ahrefs_rank%3Adesc&mode=exact”
get_bl_rank = requests.get(apilink)
getblrank = json.loads(get_bl_rank.text)
all_bl_ratings = []
for y in getblrank[‘refpages’]:
all_bl_ratings.append(y[‘ahrefs_rank’])
bl_avg_ur = round(sum(all_bl_ratings)/len(all_bl_ratings))
backlink_UR_list.append(bl_avg_ur)
检索锚文本
第四个也是最后一个 API 调用是检索 URL 反向链接的所有锚文本。我们将使用它来查找锚文本配置文件中最高频率的锚文本和 n 元语法查询的百分比。
apilink = “https://apiv2.ahrefs.com/?token=”+ahrefs_apikey+”&target=”+x+”&limit=3000&output=json&from=anchors&mode=exact”
get_anchor = requests.get(apilink)
getanchor = json.loads(get_anchor.text)
在锚文本和顶部引用域锚文本中查询
接下来,我们将检查查询中有多少个单语法单词出现在所有锚文本中。这可能是衡量反向链接锚文本中主题和关键字信号强度的好方法。稍后我们将使用该最终计数来查找总计百分比。最后,我们还通过频率计数确定锚文本。当我们循环浏览反向链接数据时,我们只需将当前数据与前一个数据进行比较,并根据哪个变量更大。
kw_an_count = 0
for count, x in enumerate(getanchor[‘anchors’]):
if any(x[‘anchor’].find(check) > -1 for check in keyword_gram_list):
kw_an_count += 1
if count == 0:
an_rd = x[‘refdomains’]
top_an_rd = x[‘anchor’]
else:
if an_rd < x[‘refdomains’]:
an_rd = x[‘refdomains’]
top_an_rd = x[‘anchor’]
else:
pass
通过反向链接查找顶部锚文本
现在我们对反向链接基本上做同样的事情。我同时这样做的原因是,很多时候你可能有一个网站通过一些样板区域链接到你,最终会向你发送数千个反向链接。这显然会扭曲频率计数,因此这就是为什么上述引用域计数很有用的原因,但我们仍然应该与整个反向链接配置文件进行比较。
if count == 0:
an_bl = x[‘backlinks’]
top_an_bl = x[‘anchor’]
else:
if an_bl < x[‘backlinks’] or top_an_bl == “”:
an_bl = x[‘backlinks’]
top_an_bl = x[‘anchor’]
else:
pass
if top_an_rd == “”:
top_an = “empty anchor”
if top_an_bl == “”:
top_an_bl = “empty anchor”
计算锚文本中查询 1 克的百分比
解决了所有困难的问题,我们接下来需要以查询比率查找锚文本并将其附加到列表中。我们还通过在此处引用域和反向链接来附加顶部锚文本。
kw_an_ratio = int((kw_an_count/len(getanchor[‘anchors’]))*100)
kw_an_ratio_list.append(int(kw_an_ratio))
top_anchor_rd.append(top_an_rd)
top_anchor_bl.append(top_an_bl)
填充数据帧并有条件地格式化
最后要做的是将数据从列表推送到我们之前创建的数据帧。如果你还记得我们对 ahrefs API 的 URL 进行了编码,所以我们只需要使用压缩和解码它们来处理该列表,以便它们对人类友好。
最后,我认为使用 seaborn 模块有条件地使用带有数字指标的列进行颜色格式化以便于扫描会很有趣。请记住,一旦你应用了seaborn函数,它基本上将df变成了一个seaborn对象,所以在应用seaborn之前做所有的处理,否则你会得到错误。
urls = [urllib.parse.unquote(x) for x in urls]
df[‘URL’] = urls
df[‘UR’] = rank_list
df[‘BL’] = backlinks_list
df[‘Avg BL UR’] = backlink_UR_list
df[‘RD’] = refdomains_list
df[‘Top Anchor RD’] = top_anchor_rd
df[‘Top Anchor BL’] = top_anchor_bl
df[‘%KW in Anchors’] = kw_an_ratio_list
cm = sns.light_palette(“green”,as_cmap=True)
df2 = df
df2 = df2.style.background_gradient(cmap=cm)
df2
示例输出
下面是查询
“python seo”
的输出,并抓取结果的第一页。您可以看到,即使 python.org 没有最高的
UR
、
BL
或
RD
计数,它
在其锚文本中的查询 1-gram 百分比也
最高。大信号!