設定

当社はプライバシーを重視しており、ウェブサイトの基本機能に必要のない特定のストレージを無効にするオプションを提供しています。カテゴリーをブロックすると、ウェブサイトでの体験に影響が出る可能性があります。詳細はこちら (クッキーポリシー)

自動内部リンク:手法、設定、安全に運用するためのルール

自動内部リンクの仕組みを理解し、6つの手法を比較。手順に沿って設定し、自動リンクをスパムに変えてしまうよくある失敗を避けましょう。

公開日
14/11/2026
更新日
14/11/2026
読了時間
39 分
自動内部リンク:手法、設定、安全に運用するためのルール

ツール

このページの内容

要点

自動内部リンクとは、サイト内のページ同士のリンクを1本ずつ手作業で張るのではなく、ソフトウェアに見つけさせ、提案させ、挿入させることです。面倒な作業(クロール、トピックのマッチング、孤立ページの発見、すべてのリンクの記録)を機械に任せ、ルール(どのページを強化するか、どのアンカーを許可するか、1ページに何本まで張るか)は自分で管理する、という形でうまく機能します。目に入ったキーワードをすべてリンクするプラグインとしてではなく、「提案、承認、公開、測定」の流れとして設定しましょう。

さらに詳しく知るには、こちらに質問

クイック診断

あなたに最適なオンライン集客の方法は?

質問 1 / 425%
お客様はあなたのような事業をどうやって見つけますか?

自動内部リンクとは何か(そして何ではないか)

内部リンクとは、自分のサイトのあるページから同じサイトの別のページへ張るリンクです。内部リンクには3つの役割があります。クローラーにページを発見させること、アンカーテキストと周辺の文章を通じてリンク先ページの内容を検索エンジンや AI に伝えること、そして強いページから弱いページへ評価を渡すことです。基本がまだあいまいなら、まず内部リンクの定義をご覧ください。

自動化とは、プログラムが次のタスクのうち1つ以上を担うことを指します。

  • 発見:サイトをクロールし、すべてのページ、既存のリンク、アンカーを一覧にする。
  • マッチング:キーワード、意味、エンティティをもとに、どのページからどのページへリンクすべきかを決める。
  • アンカーの選定:リンク元の本文にすでにあり、リンク先を説明しているフレーズを見つける。
  • 挿入:リンクを HTML に書き込む。CMS のデータベースに保存するか、レンダリング時に追加する。
  • メンテナンス:URL の変更、ページの削除、新しい記事の公開に合わせてリンクを修正する。

逆に、同じキーワードのリンクを500ページに詰め込む手段でも、サイト構造の代わりでも、全記事の下に出る「関連記事」ウィジェットでもありません。これらは自動化の一部にはなり得ますが、それ単体ではほとんどノイズしか生みません。

手作業の内部リンクが破綻する理由

手作業のリンクは30ページのサイトなら問題ありません。しかし毎週記事を公開するサイトでは、単純な理由で破綻します。新しい記事が1本増えるたびに、仕事が2つ発生するからです。新記事から既存ページへリンクを張ること、そして既存ページから新記事へリンクを張り返すことです。忘れられがちなのは後者です。2年も公開を続けると、誰からもリンクされていない最近の記事と、すでに差し替えたページを指し続ける古い記事が残ります。

自動化の前と後の内部リンク

導入前(手作業)
  • 新記事は発リンクを持つが、被リンクはほとんど得られない
  • 孤立ページが気づかれないまま増える
  • リダイレクトや削除済み URL へのリンクが残る
  • アンカーが書き手次第でばらつく
導入後(自動化+レビュー)
  • 新しいページはすべて関連ページから被リンクを得る
  • クロールのたびに孤立ページを検出する
  • リンク切れやリダイレクト先が更新される
  • アンカーは明文化したルールに従い、記録される

この記事では仕組みそのもの、つまり手法、設定、動くスクリプト、失敗パターンを扱います。戦略面(どのページを優先するか、多言語サイトのリンクをどう設計するか)については、先に内部リンク戦略の専門ガイドをお読みください。2つの記事はセットで使えるように書いています。

なぜ重要か:内部リンクについてデータが示すこと

最低限のラインについて、Google ははっきり述べています。リンクに関するベストプラクティスのドキュメントには「重要なページには、サイト内の少なくとも1つの他のページからリンクを張る必要があります」とあり、Google がリンクをクロールできるのは、基本的に href 属性を持つ <a> 要素の場合だけです。孤立ページが禁止されているわけではありませんが、発見と理解をサイトマップだけに賭けることになります。

最低限を超えた部分で、このテーマについて最も参考になる公開データは、Zyppy の Cyrus Shepard による相関調査「23 Million Internal Links: SEO Case Study」(2026年2月更新)です。約1800サイトの内部リンクデータを Search Console のクリック数と照合しています。

2300万本の内部リンクからわかること

2300万本の内部リンクを、約520000の URL にわたって分析
1800のサイトを、Google Search Console のクリック数と照合
5倍完全一致の内部アンカーを1本以上持つページは、トラフィックが5倍以上
6%内部リンクの6%超にアンカーテキストがまったくなかった

出典:Cyrus Shepard、Zyppy、23 Million Internal Links SEO Case Study、2026年2月更新

自動化にとって最も役立つのは、リンク数に関する発見です。内部リンクが0〜4本の URL は Google から平均2クリックしか得ていないのに対し、40〜44本の URL はその4倍を得ていました。約45〜50本を超えると効果は逆転します。著者はこの低下の多くをサイト全体のナビゲーションリンクによるものとし、相関調査であること、つまり方向性の参考にはなるが証明ではないことを慎重に強調しています。

被内部リンク数別に見た URL あたりの Google 平均クリック数

内部リンク0〜4本2クリック
内部リンク40〜44本8クリック(4倍)

出典:Cyrus Shepard、Zyppy、23 Million Internal Links SEO Case Study、2026年2月更新

ここから実務上の教訓が2つ得られます。1つ目は、リンクが足りないページほど伸びしろが大きく、それを見つけるのは自動化の得意分野だということ。2つ目は、アンカーの多様性がクリック数と相関し、URL アンカーや完全一致アンカーを持つページの成績が良かったことです。すべてのページを同じ3語でリンクするシステムは、この多様性を捨てていることになります。

GEO の観点

GPTBot、ClaudeBot、PerplexityBot などの AI クローラーは、Googlebot と同じく <a href> リンクをたどってページを発見します。その多くは JavaScript を実行しないため、クライアント側で挿入したリンクは彼らにとって存在しないかもしれません。各ボットが何を取得するかは、AI クローラーのガイドで解説しています。サーバー側でレンダリングされたきれいな内部リンクは、検索エンジンにも、あなたのページを引用する AI エンジンにも役立ちます。

光る青い線でつながったウェブサイトのページを描いたアイソメトリックイラスト。ロボットアームが新しい内部リンクを追加し、虫眼鏡がそれを確認している
自動内部リンク:機械がリンクを見つけて配置し、人がルールを決めて結果を確認する。

自動内部リンクエンジンの内部構造

本格的なツールは、プラグインでも SaaS でも自作スクリプトでも、同じパイプラインで動いています。これを知っていれば、各ステップをどう処理しているかを聞くだけで、5分でツールを評価できます。

内部リンクエンジンの6ステップのパイプライン

  1. 棚卸しサイトをクロールするか CMS を読み込み、インデックス対象の全ページについて本文、タイトル、H1、既存の発リンクを一覧にする。
  2. 表現各ページを比較可能な形にする。キーワードのリスト、エンティティの集合、または埋め込みベクトル。
  3. マッチングリンク元とリンク先のすべての組み合わせを関連度でスコア化し、ページごとに上位候補を残す。
  4. アンカーの選定リンク元の本文にすでにあり、リンク先を説明しているフレーズを見つける。
  5. ルールの適用上限、除外、優先度、禁止ゾーン(見出し、既存リンク、ナビゲーション)を適用する。
  6. 挿入と記録リンクを書き込み、リンク元、リンク先、アンカー、ルール、日付を保存し、再クロールで確認する。

ステップ1:棚卸しと「本文」が重要な理由

棚卸しでは、本文とテンプレートを分ける必要があります。ヘッダーメニューのリンクは全ページに表示されるので、リンク先について Google にほとんど情報を与えません。一方、関連記事の第3段落にあるリンクは多くを伝えます。優れたエンジンは分析前に nav、header、footer、aside を取り除き、記事本文にだけ挿入します。また、インデックス対象外の URL も除外します。リダイレクト、404、noindex、別ページを指す canonical を返すものはすべて対象外です。

ステップ2:ページの表現

代表的な表現方法は3つあり、粗いものから細かいものへ並べると次のとおりです。

  • キーワード:リンク先ページごとにフレーズのリストを持たせる(例:「内部リンク戦略」「リンク構造」)。高速で予測しやすいが、意味は理解しない。
  • エンティティ:自然言語処理ライブラリが固有の対象(製品、場所、概念)を抽出し、それを扱うページに対応づける。曖昧さの解消に強い。
  • 埋め込み:言語モデルが各ページを数百個の数値からなるベクトルに変換する。似たトピックのページは、同じ単語を共有していなくても近くに配置される。現在の「AI」内部リンクツールの多くはこの方式です。

ステップ3:マッチング

埋め込みを使う場合、マッチングはベクトル間のコサイン類似度で行います。スコアは-1から1の間(テキストでは実質0から1)です。しきい値を超えた組み合わせと、ページごとの上位 N 件を残します。最も重要な設定はしきい値です。低すぎると、ヘビのニシキヘビ(Python)のページをプログラミング言語 Python のページにリンクしてしまい、高すぎると、ほぼ重複したページしか見つかりません。汎用モデルなら0.5〜0.6あたりから始め、提案を50件手作業で確認してから調整しましょう。

ステップ4:アンカーの選定

アンカーは、リンク元の文にすでにあるフレーズにすべきです。新しい言葉を足すのは本文の書き換えであり、別の作業です。エンジンはリンク元の本文から、リンク先を説明するフレーズを探します。リンク先のメインキーワード、H1、近い言い換え、あるいはリンク先がすでに Search Console で順位を得ているクエリです。最後のものが最良の情報源です。実際のユーザーがそのページをどう表現しているかを反映しているからです。

ステップ5とステップ6:ルール、挿入、記録

品質を左右するのはルールです(後述の専用セクションを参照)。挿入場所は3つのうちいずれかです。保存されたコンテンツの中(リンクが記事の一部になり、恒久的でエディタでも見える)、サーバー側のレンダリング時(ページ生成時にフィルターがリンクを追加し、元に戻しやすい)、ブラウザ上の JavaScript(SEO にとって最も弱い選択肢)。どの方法でも、自動リンクの記録は必須です。記録がなければ、監査も測定も取り消しもできません。

自動内部リンクの6つの手法を比較

「自動内部リンク」と一口に言っても、技術はまったく異なります。多くのサイトは最終的に2つか3つを組み合わせています。

1. ルールベースのキーワード自動リンク

原理:「フレーズとリンク先 URL」の対応表を管理し、そのフレーズが現れた場所に自動でリンクを張ります。使いどころ:用語集、製品名、少数の収益ページ。長所:予測しやすく、透明で、低コスト。短所:文脈を理解しない、どこでも同じアンカーになる、対応表が古くなる。例:各記事で「クロールバジェット」が最初に出たときだけ、クロールバジェットの用語ページへリンクする(1記事1本まで)。

2. 構造・テンプレートモジュール

原理:CMS がサイト構造からリンクを生成します。パンくずリスト、カテゴリー一覧、「関連記事」、前後の記事、子ページを一覧にするハブページなどです。使いどころ:常に。これが土台の層です。長所:メンテナンス不要で、カテゴリー内のページが孤立しないことを保証する。短所:テンプレートリンクは文脈が乏しく、「関連記事」モジュールは意味ではなく日付やタグで選ぶことが多い。例:全記事に表示されるパンくず「ブログ > SEO > 内部リンク」。

3. 人の承認つきセマンティック提案

原理:埋め込みで関連ページとアンカー候補を見つけ、編集者が提案を1件ずつ承認または却下します。使いどころ:記事数が約50本から数千本のコンテンツサイト。長所:文脈を理解し、人の判断が入り、アンカーが自然にばらける。短所:レビューに時間がかかり、品質はしきい値次第。例:「キーワードカニバリゼーション」の記事を公開すると、すでに本文でカニバリゼーションに触れている過去記事5本をツールが提案する。

4. エンティティベースのリンク

原理:各ページからエンティティを抽出し、サイト内でそのエンティティの基準となるページへリンクします。使いどころ:ブランド、地名、人物、食材、ソフトウェアなど固有の対象が多いサイト。長所:曖昧さの解消に強く、「1エンティティ1ページ」の整理された対応表ができる。短所:エンティティとページの対応表が必要で、抽象的なテーマには弱い。例:旅行サイトで「京都」への言及はすべて京都ガイドにリンクし、京都のホテルページにはリンクしない。

5. グラフ駆動のリンク(内部 PageRank)

原理:サイトをグラフとして扱います。ツールは各ページの内部スコア(PageRank に似た指標)、トップページからのクリック深度、被リンク数を計算し、優先ページへ評価を流し、深い階層のページを浅い位置へ引き上げるリンクを提案します。使いどころ:大規模サイト、EC、ビジネス上重要なページが埋もれているサイト。長所:関連性だけでなく、目的に対して最適化できる。短所:モデルは Google によるリンク評価の近似にすぎず、関連性フィルターと組み合わせないと、純粋なグラフのロジックが無関係なリンクを生むことがある。例:クリック深度5のカテゴリーページが、関連クエリで上位の強いガイド3本からリンクを得て、深度2に上がる。

6. 執筆時のリンク

原理:サイトのページ一覧を手元に持った書き手や AI ライティングツールが、原稿を書く時点でリンクを配置します。使いどころ:定期的に記事を公開するすべてのサイト。長所:リンクのために書かれた文の一部になるので、アンカーが自然に読める。短所:新しいページからの発リンクは処理できるが、過去のページからの被リンクは処理しないため、バックフィルの手法と組み合わせる必要がある。例:Sorank の AI ブログ記事ジェネレーターは、サービス、製品、カテゴリーの各ページへの内部リンクをあらかじめ入れた状態で記事を書きます。

手法関連性運用の手間アンカーの質設定ミス時のリスク向いているケース
ルールベースのキーワード自動リンク低低単調高(キーワードの詰め込み)用語集、製品名
構造・テンプレートモジュール中非常に低汎用的低すべてのサイトの土台
承認つきセマンティック提案高中(レビュー)自然で多様低ブログ、コンテンツハブ
エンティティベースのリンク固有の対象では高中正確中旅行、EC、カタログ
グラフ駆動(内部 PageRank)ばらつきあり高(分析)フィルター次第中大規模サイト、埋もれた収益ページ
執筆時のリンク高低最も自然低更新頻度の高いサイト

自動化は構造に仕えるもので、構造の代わりにはならない

何かを設定する前に、リンクで描きたい形を決めましょう。Wikipedia 型のメッシュは、あらゆるページを関連するあらゆるページにつなぎます。セマンティックツールの標準的な出力で、百科事典的なコンテンツに向いています。セマンティックコクーンは、同じトピックツリーのページ同士にリンクを限定し、親ページは下へ、子ページは上と横へリンクします。ルールで、最上位を除くコクーン間のリンクを禁止する必要があります。URL サイロはフォルダ構造(/guides/seo/...)に従います。「同じフォルダ内とハブページにだけリンクする」という単純なルールで実現できます。トピッククラスターとピラーページのガイドで説明しているトピッククラスターは、コクーンとメッシュの中間にあたります。どれを選ぶかはSEO のためのサイト構造の記事で解説しています。

自動リンクを安全に保つルール

ルールのないリンクエンジンはスパム生成器です。最初に実行する前に書き出しておくべき設定と、出発点として使える値を紹介します。

完全自動の挿入と、提案して承認する方式の比較

完全自動
  • どんな規模にもすぐ対応できる
  • 編集の手間がかからない
  • ミスが大量に公開される
  • 不自然なアンカーや誤った文脈がすり抜ける
  • リンクがなぜあるのか説明しにくい
提案して承認
  • 機械が見つけ、人が決める
  • 各リンクに担当者と理由がある
  • 却下した提案からルールが改善される
  • 信頼できるルールは自動に切り替えられる
  • 毎週レビューの時間が必要

上限と密度

  • 1ページあたりの自動リンク数:1500語程度の記事で3〜5本。書き手が張ったリンクとは別に数えます。Google は理想的な本数はないとしつつ、過剰なリンクには注意を促しています。どんな目安よりも、自サイトのデータのほうが多くを教えてくれます。
  • 1ページにつき1つのリンク先へは1本まで。同じ記事で同じ URL に3回リンクしても読者には何の得もなく、レポートが分かりにくくなるだけです。
  • 最小間隔:自動リンク同士の間を50〜80語以上空け、段落が青い文字だらけにならないようにします。
  • サイト全体でのアンカーフレーズごとの上限:同じリンク先に対してまったく同じアンカーを使えるページ数に上限を設け、それ以上は言い換えを強制します。

禁止ゾーン

見出し、目次、画像のキャプション、引用、CTA ボタン、著者ボックス、既存の <a> の内側(入れ子のリンクは無効な HTML)には絶対に挿入しないでください。ページ自身へのリンク、リダイレクトする URL へのリンク、noindex のページや別 URL に canonical されたページへのリンクも禁止です。

アンカーのルール

Google のドキュメントは、アンカーテキストを「説明的で、適度に簡潔で、掲載されているページに関連したもの」にするよう求め、「ここをクリック」や「続きを読む」は一般的すぎる例として挙げています。これをルールに置き換えると、アンカーは2〜6語、既存の文から取り、リンク先ごとにサイト全体で少なくとも2〜3種類の言い換えを用意し、1つのアンカーには1つの意図を対応させる、となります。「内部リンクツール」がある記事では無料の分析ツールを、別の記事では有料機能を指していたら、検索エンジンに2つの別の話をしていることになります。アンカーの種類はアンカーテキストのガイドで詳しく解説しています。

クロール可能なリンクとアンカーテキストの例を示した、リンクのベストプラクティスに関する Google 検索セントラルのドキュメントページ
Google のリンクに関するベストプラクティス:クロール可能な リンクと説明的なアンカーテキストは、どの自動内部リンクツールも守るべき前提です。

そのまま使える設定例

設定画面のあるプラグインでもスクリプトでも、ルールはファイルとして書き出しましょう。それがドキュメントになり、監査の記録にもなります。

{
  "global": {
    "max_auto_links_per_page": 5,
    "max_links_per_target_per_page": 1,
    "min_words_between_links": 60,
    "similarity_threshold": 0.55,
    "insert_only_in": ["article .content"],
    "skip_selectors": ["h1", "h2", "h3", "h4", "a", "figcaption", "blockquote", ".toc", ".cta", "nav", "footer"],
    "skip_targets_if": ["redirect", "noindex", "canonical_elsewhere", "status_not_200"],
    "mode": "suggest"
  },
  "priority_targets": [
    {"url": "/pricing", "boost": 1.5},
    {"url": "/guides/internal-linking-strategy", "boost": 1.3}
  ],
  "rules": [
    {"phrase": "crawl budget", "target": "/glossary/crawl-budget", "max_site_uses": 40, "mode": "auto"},
    {"phrase": "topic cluster", "target": "/glossary/topic-cluster", "max_site_uses": 40, "mode": "auto"}
  ],
  "never_link": ["/legal", "/login", "/cart"]
}

ヒント

新しいルールはすべて「suggest」モードで始めましょう。そのルールの提案を、修正なしで20件続けて承認できたら「auto」に切り替えます。

手順:自分のサイトに自動内部リンクを導入する

この手順はツールに関係なく使えます。数百ページのサイトなら初期設定に1日、その後は週に1時間ほどを見込んでください。

ステップ1:クロールして基準値を取る

Screaming Frog などのデスクトップクローラーでサイト全体をクロールします(設定方法は Screaming Frog 設定ガイドで解説しています)。インデックス対象の各 URL について、被内部リンク数(ユニーク)、クリック深度、発リンク、クローラーの内部リンクスコアをエクスポートします。クロール結果を XML サイトマップと比べ、サイトマップにあるのにクロールで見つからなかった URL が孤立ページです。このエクスポートを日付つきで保存しておきましょう。これが「導入前」の記録になります。

ステップ2:リンクを受けるべきページを一覧にする

すべてのページにリンクを増やす価値があるわけではありません。優先対象の短いリストを作ります。売上につながるページ、価値の高いクエリで5〜20位にいるページ(Search Console の検索パフォーマンス レポートで掲載順位を絞り込む)、そしてコーナーストーンコンテンツです。さらに、すべての孤立ページと、トップから4クリック以上深いページを加えます。このリストがルールの「priority_targets」になります。

ステップ3:アンカーバンクを作る

優先対象ごとに、アンカーフレーズを3〜10個集めます。最良の情報源は Search Console です。検索パフォーマンス レポートでそのページを開き、「クエリ」タブに切り替え、すでに表示回数のあるクエリをエクスポートします。H1、メインキーワード、自然な言い換えも加えます。曖昧なものや、他のページと共有しているものは除外します。

ステップ4:候補を生成して絞り込む

ツールまたはスクリプトを実行します。リンク先ごとに、本文にアンカーが登場し、トピックが十分近いリンク元ページが返ってくるはずです。ファネルが大きく絞られることを想定してください。それはフィルターが機能している証拠です。

リンク候補はこう絞り込まれる

サイト内のリンク元とリンク先のすべての組み合わせ全組み合わせ
類似度のしきい値を超えた組み合わせページごと上位20件
本文に自然なアンカーがある組み合わせアンカーあり
上限と禁止ゾーンのチェックを通過した組み合わせルール通過
承認され公開されたリンク1ページ3〜5本

ステップ5:まとめてレビューする

リンク元、リンク先、アンカー、文、スコアの5列のスプレッドシートで提案を確認します。アンカーだけでなく、文全体を読んでください。自分なら書かないと思うものは却下します。却下の理由(意味が違う、宣伝色が強すぎる、近くにすでにリンクがある)を記録しておけば、それが新しいルールになります。

ステップ6:一度にではなく、段階的に公開する

1回あたり50〜200本のリンクを、追跡できるページ群に公開します。新しいリンクを入れない似たページを対照群として残しておきます。順位はさまざまな理由で動くので、クリック数の変化に比較の基準を持たせることが重要です。

ステップ7:再クロールし、レンダリング後の HTML を確認する

サイトを再クロールします。新しいリンクが JavaScript 実行後だけでなく、生の HTML に <a href> として存在することを確認します。いくつかの URL については、Search Console の URL 検査ツールで Google が見ているレンダリング後の HTML を確認しましょう。

ステップ8:公開フローに組み込む

本当の効果は継続運用から生まれます。記事を公開するたびに、システムは2つのことを行うべきです。新しい記事から外へリンクする(執筆時)ことと、過去のページから新記事へのリンクを提案する(バックフィル)ことです。URL が変わるたびに、そこを指すリンクを更新または削除します。

ヒント

1ページをすばやく確認したいときは、URL を無料の内部リンク分析ツールに貼り付けてください。ページ上のすべての内部リンクとアンカー、属性が一覧表示されるので、自動リンクが予定どおり公開されたかを確認できます。

自作する:Python でセマンティック内部リンクのスクリプトを書く

CMS に良いツールがない場合や、ベンダーが何をしているのか正確に理解したい場合、動くプロトタイプは60行ほどで書けます。このバージョンはサイトマップを読み込み、本文を抽出し、オープンソースのモデルで埋め込みを計算し、人がレビューするための提案を CSV で出力します。サイト自体には一切手を加えません。

インストールとクロール

pip install requests beautifulsoup4 sentence-transformers
import csv, re
from urllib.parse import urljoin
import requests
from bs4 import BeautifulSoup
from sentence_transformers import SentenceTransformer, util

SITEMAP = "https://example.com/sitemap.xml"
urls = re.findall(r"<loc>(.*?)</loc>", requests.get(SITEMAP, timeout=20).text)

pages = {}
for url in urls:
    r = requests.get(url, timeout=20)
    if r.status_code != 200 or r.url != url:
        continue  # skip errors and redirects
    soup = BeautifulSoup(r.text, "html.parser")
    robots = soup.find("meta", attrs={"name": "robots"})
    if robots and "noindex" in robots.get("content", ""):
        continue
    main = soup.find("article") or soup.find("main") or soup.body
    for tag in main.find_all(["nav", "header", "footer", "aside", "script", "style"]):
        tag.decompose()
    pages[url] = {
        "h1": soup.h1.get_text(" ", strip=True) if soup.h1 else "",
        "text": main.get_text(" ", strip=True),
        "links": {urljoin(url, a["href"]).split("#")[0] for a in main.find_all("a", href=True)},
    }

埋め込み、マッチング、アンカーの検出

model = SentenceTransformer("all-MiniLM-L6-v2")
keys = list(pages)
docs = [pages[u]["h1"] + ". " + pages[u]["text"][:2000] for u in keys]
emb = model.encode(docs, normalize_embeddings=True)
sim = util.cos_sim(emb, emb)

# Anchor bank: target URL -> phrases (H1 + queries exported from Search Console)
anchors = {u: [pages[u]["h1"].lower()] for u in keys}
# anchors["https://example.com/crawl-budget"] += ["crawl budget", "crawl budget optimization"]

THRESHOLD, MAX_PER_PAGE = 0.55, 5

def find_anchor(text, phrases):
    for phrase in sorted(phrases, key=len, reverse=True):
        if len(phrase.split()) < 2:
            continue
        m = re.search(r"\b" + re.escape(phrase) + r"\b", text, re.IGNORECASE)
        if m:
            start = max(0, m.start() - 120)
            return m.group(0), text[start:m.end() + 120]
    return None, None

rows = []
for i, src in enumerate(keys):
    added = 0
    for j in sorted(range(len(keys)), key=lambda k: -float(sim[i][k])):
        score = float(sim[i][j])
        if score < THRESHOLD or added == MAX_PER_PAGE:
            break
        tgt = keys[j]
        if tgt == src or tgt in pages[src]["links"]:
            continue
        anchor, context = find_anchor(pages[src]["text"], anchors[tgt])
        if anchor:
            rows.append([src, tgt, anchor, round(score, 2), context])
            added += 1

with open("link_suggestions.csv", "w", newline="", encoding="utf-8") as f:
    csv.writer(f).writerows([["source", "target", "anchor", "score", "context"]] + rows)

本番運用レベルにするには

  • サーバーに配慮する:リクエストの間に待機時間を入れ、明確な User-Agent を設定するか、クロールではなく CMS のデータベースや API から直接コンテンツを読み込みます。
  • 埋め込みに使うテキストを工夫する:タイトル、H1、冒頭300語の組み合わせのほうが、トピックが薄まるページ全文よりも良い結果になることが多いです。
  • マッチングを拡張する:類似度行列はページ数の2乗で増えます。20000ページを超えたら近似最近傍インデックス(FAISS など)を使い、各ページを近傍50件とだけ比較します。
  • 優先度を加える:優先対象のスコアにはブースト係数を、すでに被リンクの多い対象にはペナルティ係数を掛けます。
  • 構造を守る:サイロやコクーンの場合、許可されたフォルダやトピックツリーを共有しない URL の組み合わせは除外します。
  • サーバー側で挿入する:承認したリンクは CMS の API 経由で保存済みコンテンツに書き込み、フロントエンドのスクリプトは使いません。

クローラーでリンクのない言及を見つける

コードを書かなくても、クローラーで作業の一部はこなせます。Screaming Frog では、Custom Search 機能で特定のフレーズを含む全ページを見つけ、XPath を使った Custom Extraction で特定のリンク先へのリンク数を数えられます。フレーズを含むのにリンク先へのリンクが0本のページが候補です。SEO Spider ユーザーガイドでは Link Score についても「内部リンクに基づいてページの相対的な価値を計算する、0から100の指標」と説明しており、クロール後にクロール分析(crawl analysis)を実行する必要があります。

count(//article//a[contains(@href, "/guides/internal-linking-strategy")])
Screaming Frog SEO Spider の製品ページ
Screaming Frog SEO Spider:サイトをクロールし、内部リンクとアンカーをエクスポートして、あるトピックに触れながらリンクしていないページを見つけられます。

自動内部リンクのよくある失敗(と直し方)

自動リンクの問題の多くはペナルティではありません。無駄なリンク、紛らわしいシグナル、機械が書いたように読めるページです。それぞれの見つけ方と直し方を紹介します。

1. キーワードが出るたびにリンクする

何が起きるか:上限を設定していないルールベースのプラグインが、400ページで「SEO 監査」を同じアンカーで同じページへリンクする。見つけ方:クローラーのアンカーテキストのエクスポートで内部アンカーを出現回数順に並べます。1つのフレーズが数百回、まったく同じ形で1つの URL を指していればそれが兆候です。直し方:ルールごとにサイト全体での使用上限を設け、リンク先ごとに最低2種類の言い換えを求め、トピックに軽く触れているだけのページからはリンクを外します。

2. 意味を取り違えたリンク

何が起きるか:単語は一致しても意味が違う(果物の「アップル」が iPhone の記事に、インドネシアの「ジャワ島」がプログラミング言語 Java のチュートリアルにリンクされる)。見つけ方:毎月、自動リンクを30本ランダムに抜き出し、文全体を読みます。直し方:類似度のしきい値を上げ、フレーズの一致とトピックの一致の両方を条件にし、曖昧なルールには除外キーワードを追加します。

3. 1段落のリンクが多すぎる

何が起きるか:エンジンが60語の段落に4本のリンクを詰め込む。読者はクリックしなくなり、文章も読みにくくなります。見つけ方:本文100語あたりのリンク数を計算し、3本を超えたら確認します。直し方:自動リンク同士の最小間隔と、書き手が張ったリンクも含めた1ページあたりの上限を設定します。

4. 見出し、ボタン、他のリンクの内側のリンク

何が起きるか:H2、目次、既存のアンカーの中で一致したフレーズに新しいリンクがかかり、入れ子の <a> タグや青い見出しができる。見つけ方:いくつかのページを HTML バリデーターにかけるか、クロール結果からリンクを含む見出しを検索します。直し方:禁止セレクターを明示し、新しいルールを入れるたびにステージング環境のコピーで試します。

5. JavaScript の中にしか存在しないリンク

何が起きるか:フロントエンドのウィジェットがページ読み込み後にリンクを挿入する。href がない場合や、スクロールやクリックの後にしか現れない場合もあります。見つけ方:生の HTML(ページのソース)とレンダリング後の DOM を比べ、Search Console の URL 検査でレンダリング後の HTML を確認します。直し方:挿入をサーバー側か保存済みコンテンツに移します。レンダリングについては JavaScript SEO のガイドで詳しく解説しています。

注意

AI クローラーの多くは JavaScript をまったく実行しません。スクリプト実行後にしか現れないリンクは、レンダリング後の Googlebot には見えても、ChatGPT、Claude、Perplexity にデータを供給するボットには見えないことがあります。

6. リダイレクト、noindex ページ、404 へのリンク

何が起きるか:古いページ一覧をもとに作られた自動リンクが、移転や削除済みの URL を指し続ける。見つけ方:クロール結果で内部リンクをステータスコード(3xx、4xx)とインデックス対象外のリンク先で絞り込みます。1ページだけなら無料のリンク切れチェッカーで確認できます。直し方:実行のたびにページ一覧を更新し、200を返し、インデックス可能で、自分自身を canonical にしているリンク先だけを受け付け、301を作成したときはその場でリンクを更新します。

7. 「関連記事」ウィジェットだけに頼る

何が起きるか:全記事の最後に関連記事が3本並んでいるので、内部リンクは十分だと思い込む。こうしたブロックはタグや日付で選ばれ、入れ替わり、古いコンテンツをまったく拾わないことがよくあります。見つけ方:孤立ページのレポート(サイトマップにあるのにクロールで到達しない、またはページネーション経由でしか到達しない URL)がいつまでも長いままです。直し方:ウィジェットは残しつつ、本文中に文脈のあるリンクを、ハブページから固定のリンクを追加します。

8. 1つのアンカーが2つのページを指す

何が起きるか:「内部リンクツール」がある記事ではページ A、別の記事ではページ B にリンクしている。関連性のシグナルが分散し、キーワードカニバリゼーションを招くことがあります。見つけ方:クロール結果からアンカーとリンク先の対応表を作り、リンク先が複数あるアンカーを洗い出します。直し方:1つの検索意図には1つのリンク先ページ。弱いほうのページのアンカーを付け替えます。

9. 記録がなく、元に戻せない

何が起きるか:プラグインがコンテンツにリンクを挿入した後でアンインストールされた、あるいはどのリンクが自動なのか誰も分からない。見つけ方:「先月ツールは何本のリンクを追加したか」に答えられません。直し方:自動リンクをすべてテーブル(リンク元、リンク先、アンカー、ルール、日付、ステータス)に保存し、技術的に可能なら HTML に data 属性で印をつけ、1つのルールによるリンクを一括で削除できることを確認しておきます。

失敗探すべき兆候直し方
出現するたびにリンク1つのアンカーが数百回、同じ URL を指すサイト全体の上限、アンカーの言い換え
意味の取り違え手作業のサンプルに不自然な文があるしきい値を上げる、除外キーワード
リンク密度100語あたり3本超語数の間隔、ページごとの上限
禁止ゾーン見出し内のリンク、入れ子のアンカー明示的な除外セレクター
JavaScript だけのリンクページのソースにリンクがないサーバー側での挿入
無効なリンク先クロールで 3xx や 4xx の内部リンク一覧の更新、200 のリンク先のみ
ウィジェット頼み孤立ページのリストが長い文脈リンクとハブからのリンク
1アンカーに2リンク先アンカー対応表に重複1意図1ページ
記録なし自動リンクの本数を数えられないリンク表、data 属性、ロールバック

自動内部リンクの効果を測定する方法

内部リンクで一夜にして順位が跳ね上がることはまずありません。リンクを受けたページを対照群と比べ、4〜12週間かけて測定します。

リンクを公開するたびに追跡する項目

  • 孤立ページの数(サイトマップとクロール結果の比較)
  • トップから4クリック以上深いページ
  • 優先ページごとのユニークな被内部リンク数
  • Search Console でのリンク先ページの表示回数と平均掲載順位
  • リンク先ページのクリック数と対照群との比較
  • サーバーログでのリンク先ページのクロール頻度
  • レビューで却下された自動リンクの割合(ルールの品質)

Search Console のリンク レポート

Search Console のリンク レポートには「上位のリンクされているページ(内部リンク)」が表示され、各ページについてリンク元のページも確認できます。優先ページが上位にあるかといった健全性チェックには役立ちますが、Google のヘルプページには、表は1000行までに制限され、このレポートは「サイト上のすべてのリンクを網羅したリストではない」と記載されています。正しい数値の根拠には自分のクロール結果を使い、Search Console は Google が実際に何を拾ったかを見るために使いましょう。

リンク レポートについて説明した Google Search Console のヘルプページ
Search Console のリンク レポートには内部リンクの多いページが表示されますが、上限は1000行です。正しい数値の根拠ではなく、確認用として使いましょう。

サーバーログ

サーバーログにアクセスできるなら、リンクを公開した後に Googlebot や AI クローラーが新たにリンクされたページを訪れる頻度が増えたかが分かります。発見が改善したことを示す最も直接的なシグナルです。ボットの絞り込み方やクロール頻度の読み方、大規模サイトのクロールバジェットにとってなぜ重要かは、SEO のためのログファイル分析のガイドで解説しています。

結果を正直に読み取る

リンク先ページの表示回数が増え、対照群は変わらなければ、リンクが効いた可能性が高いです。両方が増えたなら、季節要因かアルゴリズムの影響でしょう。表示回数は増えたのにクリックが増えないなら、次に手を入れるべきはリンクの追加ではなく、タイトルとコンテンツです。12週間たっても何も変わらなければ、基本を確認してください。リンクは生の HTML にあるか、リンク先は本当にインデックスされているか。

今日から始めるには

始めるのに大がかりなツールは要りません。20〜50ページのクラスターを1つ選び、クロールし、孤立ページと優先ページを洗い出し、Search Console からアンカーバンクを作り、レビュー済みのリンクを1回分追加します。6週間測定し、学んだことをルールとして書き出してから、次のクラスターへ広げましょう。

頻繁に記事を公開しているなら、最も低コストで効果が出るのは執筆時のリンクです。新しい記事はすべて、正しいページへのリンクを持った状態でエディタを離れるべきです。Sorank が記事を書いて公開するときに行っているのがまさにこれで、トピッククラスタージェネレーターがリンクの従うクラスターを、カニバリゼーション対策を組み込んだうえで設計します。過去のページについては、上で紹介した方法でレビューつきのバックフィルを組み合わせてください。

よくある質問

自動内部リンクは SEO 的に安全ですか?

リンクが関連性を持ち、説明的なアンカーを使い、適切な上限内に収まっていれば安全です。Google のドキュメントはクロール可能なリンクと説明的なアンカーテキストを求め、過剰なリンクに注意を促していますが、自動化そのものは問題にしていません。リスクは、キーワードが出るたびに同じアンカーでリンクするツールにあります。レビューの工程を残し、自動リンクをすべて記録しましょう。

1つの記事に内部リンクは何本入れるべきですか?

Google は理想的な本数はないとしています。実務上の出発点は、1500語程度の記事で書き手が張ったリンクとは別に自動の文脈リンクを3〜5本、リンク先ごとに1本まで、リンク同士に間隔を空けることです。自サイトのページで測定して調整してください。Zyppy の相関調査では、URL あたりの被内部リンクが約40本までは効果が伸び、約45〜50本を超えると逆転していました。

自動内部リンクがあれば内部リンク戦略は不要ですか?

いいえ。自動化は戦略を実行するものです。候補を見つけ、リンクを挿入し、最新の状態に保ちます。どのページを優先するか、リンクがどの構造(メッシュ、セマンティックコクーン、サイロ)に従うか、どのアンカーをどのページに割り当てるかは、引き続き自分で決める必要があります。

30日分のコンテンツプランを無料で入手

競合、あなたのサイト、AIでの可視性を分析し、あなた専用のコンテンツプランを無料で作成します。

Sorankの無料SEOツール

無料ツールをすべて見る

30日分のコンテンツプランを無料で入手

競合、あなたのサイト、AIでの可視性を分析し、あなた専用のコンテンツプランを無料で作成します。

Sorankユーザーの写真Sorankユーザーの写真Sorankユーザーの写真Celio FabianoSorankユーザーの写真顧客Xavier Breullのプロフィール写真
Google
星星星星星
5/5
+5,000
ユーザー

野心的な創業者たちからの声

5件のレビューで 5/5

8 か月で訪問数 0 回から 5000 回

Thibault BMsorank.comGoogleソフトウェア

4か月でクリック数0から1104へ

Dominiqueflight-sensations-idf.comGoogleレジャーと航空

6か月でクリックが0から163に

Coworking Pariscoworking-paris.frGoogleOffice broker

5 か月で訪問者 0 人から 1 万人

Celio Fabianomonrobotlavevitre.frGoogleEC

7か月でクリックがx92倍に

Guide Zanzibarguidezanzibar.comGoogle旅行