代码背后的逻辑 只需三次调用即可完成。intersect 接受两个到十个域名,返回共同链接它们的域名。refdomains 获取你自身网站的引用域名集合用于相减。bulk_dr 则对剩余域名进行评分。
每次运行的成本极低,且值得计算一次。intersect 消耗两个积分,获取自身列表消耗两个积分,对最多 2,000 个域名评分消耗一个积分。五个积分仅为 $0.0005。
顺序很重要。先相减,再评分。
人们常先对所有域名评分,再过滤。这是本末倒置。评分成本虽低,但当 CSV 包含五万行时,会浪费大量时间。先通过重叠度缩小列表,再对幸存者请求 DR 评分,并将整个过程保留在普通字典中,以便下次运行可复用昨天的结果。
prospects.py RIVALS 中的域名为占位符。字段名通过 .get 读取,因此在依赖某列之前,请先检查一次你自己运行的原始行。
python
import csv, json, os, urllib.request as u, urllib.parse as p
KEY = os.environ['LZ_KEY']
ME = 'mysite.example'
RIVALS = ['rival-a.example', 'rival-b.example', 'rival-c.example']
def get(**kw):
q = p.urlencode(kw)
with u.urlopen(f'https://linkzoid.pro/api.php?{q}&key={KEY}', timeout=30) as r:
d = json.load(r)
if not d['ok']:
raise SystemExit(d)
return d
gap = get(action='intersect', q=','.join(RIVALS), per=1000)['rows']
mine = {r.get('domain') for r in get(action='refdomains', q=ME, per=1000)['rows']}
fresh = [r.get('domain') for r in gap if r.get('domain') not in mine]
scores = get(action='bulk_dr', domains=','.join(fresh[:2000]))['rows']
with open('prospects.csv', 'w', newline='') as f:
wr = csv.writer(f)
for row in scores:
wr.writerow([row.get('domain'), row.get('dr')])
print(len(fresh), 'candidates')
实操示例,假设数字 针对小型垂直领域博客的模拟运行;你的实际数据会有所不同 步骤 输出行数 积分 3 个竞争对手的交集 640 个域名 2 减去你自身的引用域名 剩余 410 个 2 对 410 个域名进行 bulk_dr 评分 410 个已评分 1 保留 DR 20 及以上的域名 约 120 个 0 手动检查前 30 个 打开 30 个页面 0
从 CSV 到外联,避免群发垃圾邮件 01 按重叠度排序 链接到两个或三个竞争对手的域名,最有可能基于主题相关性链接到你。将它们排在前面。
02 手动打开前 30 个 查看链接到竞争对手的页面。它是资源列表、评测文章还是新闻?并非所有这些页面都接受新条目。
03 写一行理由 说明你的页面为竞争对手的页面增添了什么。如果无法用一句话说明,就跳过该网站。
04 记录发送内容 在 CSV 中添加日期、联系人和结果列,并提交。下个季度你会感谢自己。
常见错误与修正 挖掘脚本通常在以下几个地方出错 错误 影响 修正 仅按 DR 排序 大型目录和爬虫网站会排在前面 先按重叠数量排序,再按 DR 排序 向 cutoff 以上的所有域名发送邮件 读起来像垃圾邮件,损害信誉 手动打开前 30 个 手动进行 URL 编码 逗号和斜杠会破坏查询 使用 urllib.parse.urlencode 在一次调用中发送 3,000 个域名 超过 2,000 的上限 将列表分块,每个分块消耗一个积分 将 DR 视为质量指标 它是引用域名数量的对数级计数 将其作为排序键,而非最终结论
选择拥有相同读者的竞争对手 竞争对手决定了交集的结果。反向链接查找器的质量取决于你输入的数据。针对相同读者的三个直接竞争对手能产生清晰的交集,而一个覆盖所有关键词的大型发布商则会给你成千上万个与你页面无关的链接。
假设你运营着一个关于自行车维修的小型博客。你的竞争对手可能是两个维修博客和一个拥有强大指南板块的商店。这是一个不错的组合。如果加入一家全国性媒体,列表中就会出现许多绝不会链接到自行车博客的页面。
两到十个域名是端点接受的窗口,因此请在该范围内选择组合。保持列表足够短,以便你能凭记忆叫出每个竞争对手的名字。短列表更容易辩护。
为什么大型枢纽会污染集合 目录和聚合器几乎链接到所有内容。它们出现在每个交叉点,掩盖了真正出于兴趣而链接出去的少数域名。在信任排序后的列表之前,请先阅读列表顶部。
一个简单的排除文件可以解决大部分问题。将你不希望出现的域名保存在一个文本文件中,每行一个。将其加载到集合中,并在调用评分前丢弃匹配项,这样积分只花费在值得阅读的候选项上。
将竞争对手与你的网站分开 你的域名不应成为竞争对手。这听起来很明显,但从旧项目复制的列表通常会包含它,然后交叉点报告会将你自己的链接返回给你。
将竞争对手放在脚本顶部的配置字典中,并注释说明每个竞争对手存在的原因。下个月你会记得原因,阅读该仓库的陌生人也会明白。
在过滤之前阅读原始行 代码使用 .get 读取每个字段,这可以防止缺少键导致运行崩溃。它也会隐藏错误的键。在编写任何过滤器之前,打印交叉点中的一行,查看字段名和每个值的类型。
以文本形式到达的分数会按文本排序,因此 9 会排在 80 之后。在调用后立即将其转换为数字,脚本的其余部分可以保持简单。
比较前标准化域名 同一个站点在一个列表中可能带有 www. 前缀,而在另一个列表中没有。在比较集合之前,将所有内容小写并去除前缀。否则,你的网站可能会看起来像一个新候选项。
来自粘贴列表的尾随斜杠和多余空格会造成同样的麻烦。一行清理函数的成本低于一次浪费的评分调用。
保留每次运行的日期副本 将每次运行写入带日期的文件,并保留前一个文件。然后你可以区分新候选项和你已经看到的候选项,并查看竞争对手何时开始链接到新位置。
日期文件也是调试奇怪结果的最简单方法。并排打开两个文件,变化通常很明显。
仅对幸存项评分 批量调用一次最多接受 2,000 个域名,消耗 1 个积分。将减法后的幸存者传递给它,而不是完整的交叉点。在上述虚构的运行中,640 行和 410 行在一次调用中评分成本相同,但较小的列表更易读。
运行查找器之前的问题 人们带到这项工作这一部分的大多数问题归结为成本、排序以及调用失败时会发生什么。
构建潜在客户列表成本高吗? 不高。该配方使用 intersect、refdomains 和 bulk_dr,因此在所示规模下每次运行消耗 5 个积分,即 $0.0005。下个月重新运行的成本相同。你花费在阅读页面上的时间才是真正的成本。
为什么不按 DR 对交叉点进行排序并就此停止? DR 以对数尺度计算引用域名。大型目录无论其相关性如何都会排在顶部,因此首先按重叠排序,并将 DR 作为平局打破器,而不是主键。
我可以向 CSV 中的所有内容发送外联吗? 你可以,但这是对列表的浪费。打开链接到竞争对手的页面,判断新条目是否合适,然后再写。CSV 是短名单,而不是邮件列表。
我应该从多少个竞争对手开始? 三个是一个好的开始,在 intersect 接受的两到十个范围内。只有当第一次运行返回的行数不足以排名时,才添加更多。
如果我的域名还没有引用域名怎么办? 那么减法不会移除任何内容,每个交叉点行都成为候选项。这是正确的,但列表会很长。通过重叠削减它,并手动阅读前三十名。
脚本需要付费密钥吗? 是的。intersect、refdomains 和 bulk_dr 调用按积分定价。免费概览操作不需要密钥,$100 注册积分可以覆盖许多此类规模的运行。
在发出任何消息之前 打开候选页面并确认它链接到竞争对手,而不仅仅是链接列表。 检查页面是否适合你的读者,而不仅仅是你的关键词。 移除你已经联系过的任何域名,并在旁边记录日期。 写一句话说明你的页面增加了什么,或者放弃该候选项。 分批发送,以便实际阅读回复。 按计划运行查找器 潜在客户列表变质的速度比大多数人预期的要慢。每月一次就足够了。竞争对手的新链接会在每月刷新时出现,因此每几周运行一次可以捕获大多数链接。每周运行主要复制上周的文件,这就是为什么相同的 backlinks finder 可以在无人值守的情况下运行而不会产生太多噪音。
合理的节奏是每月进行评分,并在每次运行后快速查看顶部行。将减法步骤保留在同一作业中,以便列表从不包含你已经拥有的内容。
将密钥保留在文件之外 脚本从环境变量读取密钥,因此它不会出现在仓库中。在你的调度程序中设置 LZ_KEY 为秘密,或从 git 之外的文件中导出它。
crontab 行可以在前面设置变量的情况下调用相同的脚本。检查服务器上持有密钥的文件是否具有严格的权限。
在写入 CSV 之前失败 401 或 402 应停止运行,读取为 false 的 ok 标志也应停止运行。代码在打开文件之前抛出异常,因此失败的运行永远不会用部分文件覆盖昨天的 CSV。
记录每次运行的支出 每个响应都带有 _credits,因此在作业结束时打印余额。几个月后,该行会告诉你计划的费用是否符合预期,以及循环是否开始重新获取页面。
如果你希望在数据库中而不是文件夹中保留历史记录,请将其与 SQLite diff 配对。
关于 DR 能说什么和不能说什么 这里的 DR 是 round(100 times log(ref_domains + 1) over log(20,000,000))。它随引用域名增加而增加,仅此而已。请记住这一点。一个站点可能处于 55,但对你来说仍然无用。
用它来排名,然后阅读。查看该站点发布的内容,它是否链接到一百个不相关的商店,以及上面是否有任何最近的变化。这些检查每个站点需要一分钟,没有脚本可以替代它们。
一旦列表干净,将其保存为日期文件并在一个月后重新运行。Actions runbook 展示了如何安排它,n8n 比较 涵盖了无代码路线,如果你的外联人员更喜欢它。
速率和大小说明 每次调用最多返回 1,000 行并计费一次,因此分页 5,000 个交叉点行消耗 10 个积分,即 $0.001。深度分页在 50,000 行处停止。在服务器上使用 sort 和 order=desc,而不是在 Python 中对大列表进行排序。