レシピ

Pythonでバックリンク検索:40行でプロスペクトリストを作成

競合他社にはリンクされているが自社にはリンクされていないドメインを見つけ、1回の呼び出しでスコアリングし、CSVをソートします。以下に、仮の数字を用いた具体的な例を示します。

ドラフトツールと紙の点々を結ぶ赤い糸を備えたワークショップのベンチ

コードの前に論理を

このタスクには3回のAPI呼び出しが必要です。intersectは2〜10個のドメインを取り、それらの複数のドメインにリンクしているドメインを返します。refdomainsで自社サイトの参照元ドメインセットを取得し、そこから除外します。その後、bulk_drで残りのドメインをスコアリングします。

1回の実行あたりのコストは非常に小さく、この計算は一度行っておく価値があります。intersectに2クレジット、自社リストに2クレジット、2,000ドメインまでのスコアリングに1クレジットが必要です。5クレジットは$0.0005に相当します。

順序が重要です。スコアリングする前に除外してください。

多くの人はまずすべてのドメインをスコアリングし、後でフィルタリングします。これは逆です。スコアリングのコストは低いですが、CSVに5万件の行がある場合、時間とリソースの無駄になります。まず重複に基づいてリストを絞り込み、残ったドメインのDRを照会し、全体をプレーンな辞書形式で保持して、2回目の実行で前回の結果を再利用できるようにします。

prospects.py

RIVALS内のドメインはプレースホルダーです。フィールド名は.getで読み取るため、カラムを信頼する前に、自身の実行からの生データ1行を確認してください。

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つの競合他社のintersect640ドメイン2
自社の参照元ドメインを除外残り4102
410件に対するbulk_dr410件スコアリング済み1
DR 20以上を保持約1200
上位30件を手動確認30ページ開封0

CSVからアウトリーチへ、スパムを送らない方法

01

重複でソート

2つまたは3つの競合他社にリンクしているドメインは、あなたにリンクする理由を持つドメインです。それらを優先してください。

02

手動で上位30件を開く

競合他社にリンクしているページを確認してください。それはリソースリスト、レビュー記事、ニュース記事のどれですか?これらのうち、新しいエントリーを受け付けるのは一部だけです。

03

理由を1行で書く

あなたのページが競合他社のページに比べてどのような価値を提供しているかを述べてください。それが1文で説明できない場合は、そのサイトはスキップしてください。

04

送信した内容を記録する

日付、連絡先、結果の列を同じCSVファイルに追加し、コミットしてください。次の四半期には、自分が感謝するようになります。

ミスと修正

見込み客調査スクリプトは、同じいくつかの場所で失敗します
ミスなぜそれが問題なのか修正
DRだけでソートする大きなディレクトリやスクレイパーが上位に来るまず重複数でソートし、次にDRでソートする
基準以上のすべてにメールを送信するスパムのように読まれ、評判を損なう手動で上位30件を開く
手動でURLエンコードするカンマやスラッシュがクエリを壊すurllib.parse.urlencodeを使用する
1回の呼び出しで3,000件のドメインを送信する2,000の制限を超えるリストをチャンクに分け、チャンクごとに1クレジットを使用する
DRを品質として信頼するそれは参照ドメインのログスケールカウントですそれを判定ではなくソートキーとして扱う
日光を共有する庭の小さな低木2本と大きなオークの木1本

読者を共有する競合他社を選ぶ

競合他社が交差の結果を決定します。バックリンクファインダーは、それに入力するリストの品質にすぎません。同じ読者層を持つ3つの直接競合他社は明確な重複をもたらしますが、あらゆるキーワードでランクインする大手パブリッシャーは、あなたのページについて何も示さない何千ものリンクをもたらします。

自転車の修理に関する小さなブログを運営していると想像してください。競合他社は、2つの修理ブログと、強力なガイドセクションを持つ1つのショップかもしれません。これは適切なセットです。さらに全国規模のメディアを加えると、リストは自転車ブログにはリンクしないページで埋め尽くされます。

エンドポイントが受け付けるドメインの範囲は2〜10です。この範囲内に収まるセットを選択してください。競合他社を記憶で名指しできるほど、リストは短く保つ必要があります。短いリストの方が防御(フィルタリング)が容易です。

巨大なハブがセットを汚す理由

ディレクトリやアグリゲーターはほぼすべてにリンクします。それらはあらゆる交差点に現れ、実際の興味からリンクしている限られた数のドメインを埋もれさせてしまいます。信頼する前に、ソートされたリストの上部を確認してください。

単純な除外ファイルでこの問題のほとんどは解決します。常に除外したいドメインを1行に1つずつ記載したテキストファイルに保存してください。それをセットに読み込み、スコアリング呼び出しの前に一致するものを除外することで、クレジットは読む価値のある候補者にのみ費やされます。

競合他社と自サイトの分離

自ドメインは競合他社であってはなりません。当然のことですが、古いプロジェクトからのコピーされたリストにはそれが含まれており、その結果、インタセクトが自サイトへのリンクを自分自身に報告することがあります。

競合他社をスクリプトの上部にある設定辞書に配置し、それぞれがなぜそこに存在するかのコメントを付けてください。来月には理由を思い出し、リポジトリを読む他者にもそれが伝わるようになります。

フィルタリング前の生データ行を読む

コードは.getを使ってすべてのフィールドを読み取るため、キーの欠落による実行エラーを防ぎます。また、間違ったキーも隠蔽されます。フィルタを書く前にインタセクトから1行を出力し、フィールド名と各値の型を確認してください。

テキストとして返されるスコアはテキストとしてソートされるため、9は80の後に並んでしまいます。呼び出しの直後に数値に変換すれば、スクリプトの残りの部分はシンプルに保てます。

比較前にドメインを正規化する

同じサイトが、一方のリストではwww.プレフィックス付きで、もう一方ではなしで表示されることがあります。セットを比較する前に、すべてを小文字に変換しプレフィックスを削除してください。そうしないと、自サイトが新しい候補のように見えることがあります。

貼り付けられたリストに由来する末尾のスラッシュや不要なスペースも同様の問題を引き起こします。1行のクリーンアップ関数のコストは、1回の無駄なスコアリング呼び出しよりも安価です。

各実行の日付付きコピーを保持する

各実行を日付付きファイルに書き出し、以前のファイルも保持してください。そうすれば、新しい候補と既に見た候補を区別でき、競合他社がいつ新しい場所にリンクし始めたかを確認できます。

日付付きファイルは、奇妙な結果をデバッグする最も簡単な方法でもあります。2つのファイルを並べて開けば、変化は通常明らかです。

生き残ったもののみをスコアリングする

バルク呼び出しは1クレジットで最大2,000ドメインを処理します。減算の結果である生存者だけを渡してください。上記の架空の実行では、640行と410行は1回の呼び出しでスコアリングするのと同じコストがかかりますが、小さいリストの方がはるかに読みやすいです。

真鍮の重りと粗い岩が別々の皿に乗った石の秤

フィnderを実行する前の質問

この作業のこの部分で人々が抱える質問のほとんどは、コスト、ソート、および呼び出しが失敗した場合の処理に集約されます。

見込み客リストの構築にはどれくらいのコストがかかりますか?

それほどかかりません。レシピではintersect、refdomains、bulk_drを使用するため、表示されたサイズでは1回の実行あたり5クレジット($0.0005)です。来月の再実行も同じコストです。実際に費やすのは、ページを読むためのあなたの時間です。

インタセクトをDRでソートしてそこで止めないのはなぜですか?

DRは対数スケールで参照ドメイン数をカウントします。大きなディレクトリは関連性に関係なく上位に現れるため、まずオーバーラップでソートし、DRはタイブレーカーとして、メインキーとして使用してください。

CSVのすべての項目にアウトリーチを送ることができますか?

送ることができますが、リストの使い方は最適ではありません。競合他社にリンクしているページを開き、新しいエントリーが適合するかどうかを判断してから、メールを書きます。CSVは候補者リストであり、メーリングリストではありません。

最初はどのくらいの数の競合他社から始めるべきですか?

3つが適切なスタートです。インタセクトが受け付ける2〜10の範囲内です。最初の実行でランク付けできる行数が少なすぎる場合にのみ、さらに追加してください。

自ドメインにまだ参照ドメインがない場合はどうすればよいですか?

その場合、減算は何も除外せず、すべてのインタセクト行が候補になります。これは正しいですが、リストは長くなります。オーバーラップで絞り込み、上位30件を手動で読んでください。

スクリプトには有料キーが必要ですか?

はい。intersect、refdomains、bulk_dr呼び出しはクレジットで課金されます。無料の概要アクションにはキーは不要で、$100のサインアップクレジットはこの規模の実行を多数カバーできます。

最初のメッセージを送る前に

  • 候補者ページを開き、リンクが競合他社へのものではなく、単なるリンクのリストへのものではないことを確認してください。
  • ページがあなたのキーワードだけでなく、読者にも適していることを確認してください。
  • すでに連絡したドメインを削除し、その横に日付を記録してください。
  • あなたのページが何を加えるのかについて1文を書き、そうでなければ候補者を除外してください。
  • 返信が実際に読めるよう、小さなバッチで送信してください。

スケジュールに従ってフィnderを実行する

見込み客リストは、多くの人が予想するよりもゆっくりと古びていきます。月1回で十分です。競合他社からの新しいリンクは月次の更新で現れるため、数週間に1回の実行でそのほとんどをキャッチできます。週1回の実行は主に先週のファイルの複製になるため、同じバックリンクフィnderがノイズをほとんど出さずに無人で実行される理由です。

理にかなったリズムは、スコアリングを月次で行い、各実行後に上位行を素早く確認することです。減算ステップを同じジョブ内に保持し、リストにすでに持っているものが含まれないようにしてください。

キーをファイルから除外する

スクリプトはキーを環境変数から読み取るため、リポジトリに配置されません。スケジューラでLZ_KEYをシークレットとして設定するか、gitの管理外にあるファイルからエクスポートしてください。

crontabの行は、変数を前に設定して同じスクリプトを呼び出すことができます。キーを含むファイルのサーバー上の権限が厳格であることを確認してください。

CSVに書き込む前に失敗する

401または402は実行を停止すべきであり、falseと読み取られるokフラグも同様です。コードはファイルが開かれる前に例外を発生させるため、失敗した実行が昨日のCSVを部分的なもので上書きすることはありません。

各実行で支出をログに記録する

すべての応答には_creditsが含まれるため、ジョブの最後に残高を出力してください。数ヶ月にわたってその行は、スケジュールが計画どおりのコストであるか、ループがページを再フェッチし始めているかどうかを教えてくれます。

フォルダ内のファイルの代わりにデータベースに履歴を持たせたい場合は、SQLite diffとペアにしてください。

DRが何を示し、何を示さないかについての一言

ここで言うDRは、round(100 * log(ref_domains + 1) / log(20,000,000))です。参照ドメイン数が増加すると上昇し、それ以外は何も変化しません。これを念頭に置いてください。サイトが55の値を持っていても、あなたにとって無用である場合があります。

ランク付けに使用し、その後で読んでください。そのサイトが何を発表しているか、無関係なショップに100リンクしているかどうか、そしてそこに最近変更があったかどうかを確認してください。これらのチェックにはサイトごとに数分かかり、どのスクリプトもそれらを代替できません。

リストがクリーンになったら、それを日付付きファイルとして保持し、1ヶ月後に再実行してください。Actions runbookはスケジュールの設定方法を示しており、n8n comparisonはアウトリーチ担当者が好む場合のノーコードルートを取り扱っています。

レートとサイズの注記

各呼び出しは最大1,000行を返し、1回課金されるため、5,000行のインタセクト行をページネーションするには10クレジット($0.001)かかります。深いページネーションは50,000行で停止します。Pythonで大きなリストを後でソートするのではなく、サーバー側でsortとorder=descを使用してください。