私たちの立場を明言します。私たちは Geonode であり、プロキシを販売しているため、商業的な利害関係から、この問題に関してはクローラー側の立場にあります。 率直に言えば、ハニーポット回避の大部分は単に「適切にクロールすること」に尽き、最も効果的な対策は費用がかからないものです。それは、robots.txt を遵守することです。 トラップの多くは、サイト側がすでにクローラーに訪問しないよう求めているパスに設置されているため、ルールを遵守するクローラーはそれらに遭遇することはありません。 残りの罠は、CSSをレンダリングし、許可されていないフォームへの送信を避け、クロールの範囲を制限することで回避できます。これらはいずれも当社から何かを購入する必要はなく、ハニーポットを回避するためにプロキシを必要とするクローラーは、すでに根本的なミスを犯しているクローラーであると言えます。
ハニーポットトラップとは
その定義は技術的なものではなく、行動的なものです。つまり、自動化されたクライアントのみが操作するコンテンツであり、その操作を通じてそのクライアントが自動化されたものであることを特定するために配置されたものです。
その理屈は単純で、反論するのはかなり難しいものです。 人間の訪問者はブラウザを使用し、ブラウザはCSSを適用してレイアウトをレンダリングし、目に見える内容を表示します。一方、HTMLを解析するクローラーは、マークアップ内のすべてを等しく認識します。これには、目に見えないようにスタイル設定されたリンク、画面外に隠されたフォームフィールド、そして人が目にする場所からはどこからもリンクされていないパスなども含まれます。
これらいずれかとインタラクションすることは、強力なシグナルとなります。アクセシビリティツールやテキストモードブラウザも異なる挙動を示すため決定的な証拠とは言えませんが、サイト側が対応を取るには十分な強さです。
その結果はサイトによって異なります。ログに記録して無視するサイトもあれば、アクセス制限をかけるサイト、そのアドレスをブロックするサイトもあります。また、機能制限されたコンテンツを無期限に提供し続けるサイトもありますが、これは成功のように見えるため最悪の結果と言えます。さらに、以下で説明するような、より精巧な対応を行うサイトも現れています。
遭遇する6つの種類
1. 見えないリンク。 display: none、visibility: hidden、寸法が0、背景色と一致する色、または画面外に配置されたスタイルが適用されたリンク。HTMLには存在するが、レンダリングされたページには表示されない。
<a href="/trap/do-not-follow" style="display:none">Products</a>
<a href="/hidden" class="visually-hidden">Sitemap</a>
最も一般的な形態であり、回避も最も容易です。
2. 許可されていないパス。 robots.txt 内の Disallow ディレクティブの下にのみ記載され、どこからもリンクされていないURLです。これを見つける唯一の方法は、除外ファイルを読み込んでからそれを無視することですが、そのパスへのリクエストは、意図的な非準拠のほぼ確実な兆候となります。
3. 非表示のフォームフィールド。 CSSで非表示にされ、人間が決して入力することのないフィールド。このフィールドに値が含まれた送信は、HTMLを解析する何かによるものである。コメントフォームや登録フローでよく見られ、そこでは正当かつ効果的なスパム対策となっている。
4. 無限のURL空間。 必ずしも意図的なものではありませんが、いずれにせよ同等の損害をもたらします。「来月」へのリンクがあるカレンダーは、無限のURLを生成します。大規模なカタログにおけるファセットナビゲーションは、組み合わせの爆発を引き起こします。深さ制限やパターン制限のないクローラーは、何かがそれを止めるまでこれらを追跡し続けます。
5. タイミングの罠。 遅延後にのみ表示されるコンテンツや、人間が処理できる速度よりも速く送信されたフォームを拒否する仕組みなどです。これらは、マークアップを解析するクライアントではなく、即座に動作するクライアントを捕捉します。
6. 改ざんされた、または生成されたコンテンツ。 最も新しいカテゴリーであり、独自のセクションを設けるに値するほど重要なものです。
AIターピットと生成迷路
これは真に新しい展開であり、このトピックがここ数年で様相を一変させた理由でもあります。
CloudflareのAI Labyrinthが、最も広く導入されている事例です。Cloudflareはこれを、「AIが生成したコンテンツを用いて、AIクローラーの動作を遅らせ、混乱させ、リソースを浪費させる新しい対策手法」と説明しています。
その仕組みは次の通りです。Workers AIが様々なトピックに関する多様なHTMLページを生成し、高速配信のためにR2に保存します。そして、これらの囮ページは、「人間の訪問者には見えないが、ボットクローラーにはアクセス可能な」隠しリンクを通じて、実際のページからリンクされます。
Cloudflareが、なぜこれが機能するのかを説明する文言は、ハニーポット原理についてこれまでに書かれた中で最も的確な表現です:
実際の人間なら、AIが生成した無意味な情報の迷路を4段階も深くたどったりはしないでしょう。
重要なのは、配信されるコンテンツが「本物であり、科学的事実に関連しているものの、クロール対象のサイトとは無関係、あるいはそのサイトの独自情報ではない」という点だ。つまり、クローラーはテキストに一貫性があるかどうかを確認しても、それを検知できない。一貫性は保たれている。単に別の事柄について書かれているだけなのだ。
この機能は無料プランを含むすべてのCloudflareプランで利用可能であり、ボット管理セクションのトグルを1つ切り替えるだけで有効化でき、「追加の設定は不要」です。
独立したツールも同様の原理で動作します。Nepenthesは、出口リンクのない無限のページの迷路を生成します。 Iocaineはリバースプロキシとして動作し、理解しておく価値のある追加の手順を踏んでいます。それは、配信するURLを「汚染」することです。これにより、後にブラウザを装って戻ってきたクローラーであっても、そのリクエストキューにtarpitが配信したURLしか含まれていないという事実から、依然として特定することが可能です。これは一時的なマーカーではなく、永続的なマーカーです。
クローラーを運用する者にとって、これには2つの意味があります。
コンテンツの質による検知は機能しません。 ページの内容は首尾一貫しており、事実に基づいています。それらを特定できるのは、サイトと無関係であり、人が見つけられるような場所からはリンクされておらず、その数が無限であるという点だけです。
クロールの範囲を限定することは、もはや単なる整理整頓ではなく、不可欠な要件となっている。 深さ制限、ページ数制限、重複検出機能のないクローラーは、生成された無意味なデータのために数日分の演算リソースとギガバイト単位の従量制帯域幅を浪費し、その過程で一度もエラーを受け取らない可能性がある。ギガバイト単位の課金体系では、これは実質的に「何の価値もない」請求書となる。
不正な手段を使わずにそれらを回避する方法
ここで紹介する対策はすべて、適切に構築されたクローラーであれば本来行うべきことです。
robots.txt を遵守する。 これだけでトラップの大部分を回避できます。なぜなら、サイト側がトラップを仕掛けるのは、アクセスが許可されていないパスだからです。これは現在、順序ではなく特異性に基づいてマッチングを行う標準規格——RFC 9309——となっており、その正しい読み方についてはrobots.txt ファイルの読み方で解説しました。
リンクをたどる前に、計算された可視性を確認してください。 ヘッドレスブラウザでは、これは簡単です:
const links = await page.$$eval('a[href]', els =>
els.filter(el => {
const s = getComputedStyle(el);
const r = el.getBoundingClientRect();
return s.display !== 'none' && s.visibility !== 'hidden' &&
parseFloat(s.opacity) > 0 && r.width > 1 && r.height > 1;
}).map(el => el.href)
);
インラインの style 属性を読み取るのではなく、getComputedStyle を使用することに注意してください。スタイルシートのルールによって非表示にされたリンクには、検査すべきインラインスタイルが存在しないからです。
ブラウザがない場合は、ヒューリスティックを適用します。インラインスタイルに display:none または visibility:hidden が含まれるリンク、空のアンカーテキスト、hidden、visually-hidden、sr-only などのクラス名はスキップし、href が可視テキストのどこにも現れないリンクは疑わしいものとみなします。
クロールの範囲を絶対的に制限する。 最大深度、最大ページ数、およびドメインごとの予算を設定してください。これは単なる予備策ではなく、厳格な停止条件として機能させる必要があります。これは、無限のスペースがどのように生成されたかに関わらず、唯一有効な防御策です。
重複を検出する。 コンテンツのハッシュ化により、表面的には異なる生成ページを捕捉できます。 URLパターンの分析により、無制限に増え続けるパスを検知できます。あるディレクトリから200ページが生成され、終わりが見えない場合は、一旦停止して状況を確認してください。
許可されていないフォームは送信しないでください。 隠しフィールドによる罠は、見つけたすべての入力欄に値を入力するクライアントしか捕まえられません。
レート制限とペース配分。 人間らしいタイミングを保つことで、タイミングトラップを回避すると同時に、その他のあらゆるシグナルも低減できます。
身元を明かす。 名前と連絡先URLを持つクローラーは、運営者が許可するかどうかを選択できる対象となります。これは厳密にはトラップ回避策ではありませんが、トラップに引っかかった後の対応が変わってきます。
実環境での罠の検知
罠に迷い込んでしまったことを示す兆候を、現れる速さの順に大まかに並べたものです。
ページ数が収束しない。 キューが縮小するどころか増え続けており、これが最も早い警告であり、測定も最も容易です。
コンテンツに一貫性はあるが、無関係である。 読みやすく、かつサイトの実際のテーマとは何の関係もないページ。これが「AIラビリンス」の特徴です。
URLが生成されたパターンに従っている。 パスが長く、セグメント構造が異様で、実際のサイトなら存在しそうなURLが繰り返されていない。
妥当な場所からの被リンクがない。 ページ同士は相互にリンクしているが、外部からのリンクは一切ない。
応答時間が不自然に均一である。 生成されたコンテンツはキャッシュから配信されるが、実際のページでは応答時間にばらつきがある。
エラー率は変わらないのに、データの品質が低下する。 これは最も明確な後期段階の兆候であり、すべてのリクエストが200を返すことが重要な理由でもある。
実用的な確認方法は、手動チェックではなく継続的なアサーションです。クロールの過程で、検出された新しいURLと取得されたページの比率が低下していない場合、URLが消費できる速度よりも速いペースで生成されていることを意味します。有限のサイトでは、そのような挙動は決して見られません。
サイト運営者向け:実装方法
もう一方についても簡単に触れておきます。なぜなら、同じ理解が双方に当てはまるからです。
非表示のフォームフィールドが最も効果的です。 追加は簡単で、自動フォーム送信に対して有効であり、実際のユーザーには影響を与えません。フィールドには目立たない名前を付け、インラインではなくスタイルシート内のCSSで非表示にし、そのフィールドに入力された送信はすべて拒否するようにします。
非表示のリンクは、ページをレンダリングしないクローラーを捕捉します。 効果的であり、robots.txtのdisallowと組み合わせて、準拠したクローラーが捕捉されないようにする価値があります。除外しなかったトラップのせいで、適切に動作するクローラーにペナルティを課すのは、自業自得の問題です。
管理型ターピットは、トグル式になりました。 Cloudflareの機能は無料プランを含むすべてのプランで利用可能で、設定も不要なため、どのサイトでも簡単に導入できます。
アクセシビリティこそが真の制約です。 スクリーンリーダーやテキストブラウザは、視覚障害のないユーザーのブラウザのように視覚的なスタイルを適用しません。 display: noneを使用したトラップは、支援技術がこれを尊重するため一般的に安全です。一方、画面外への配置や透明なテキストを使用したトラップは、スクリーンリーダーのユーザーに読み上げられ、ユーザーがそれに従ってアクセスし、ブロックされてしまう可能性があります。これらを実装する場合は、スクリーンリーダーを使用してテストしてください。
そして、実際に何を望んでいるのかを決めましょう。 検索エンジン、価格比較パートナー、アクセシビリティツール、モニタリングサービス、AIエージェントなどはすべて自動トラフィックを送信しており、その中には必要なものもあります。一律のトラップでは、これらすべてを捕捉してしまいます。ユーザーエージェントによって正常と確認されているクローラーを除外し、robots.txtですでに拒否されているパスにのみトラップを設置することが、不要なトラフィックを捕捉しつつ、必要なトラフィックは通過させる適切な対策です。
適応するよりも、いつ手を引くべきか
当社は、いわゆる「適応」を製品とするベンダーであるため、この判断基準については明確に述べておく価値がある。
もしサイトがトラップを仕掛けているなら、それは何かを伝えているのです。robots.txtによるアクセス拒否や、自動アクセスを禁止する利用規約と相まって、そのメッセージは曖昧ではありません。それにもかかわらず、その対策を回避するよう工夫し続けることは、技術的な問題にとどまらない結果を招く選択となります。
その代わりとなる方法は、多くの場合より優れており、ほぼ常にコストも安くなります:
問い合わせる。 自分が誰で、何が必要なのかを説明するメールを送れば、多くの人が予想する以上にこの問題は解決します。また、パートナーフィードを利用すれば、問題そのものが解消されます。
公式APIの有無を確認する。 強力な保護措置を講じているサイトの多くも、正当なユーザーが利用できる手段を確保するために、公式APIを公開しています。
データが他の場所に存在しないか確認する。 公開データセット、アーカイブ、公式提出書類、ライセンス供与を受けたプロバイダーなど。
必要なデータを絞り込む。 スクレイピングの多くは、本来の目的以上に大量のデータを収集しています。要求範囲を狭めれば、正当な手段で満たしやすくなります。
そして実用的な観点として:ターピットは、サイト側のコストよりもユーザー側のコストを高くするように設計されています。Cloudflareはページを一度生成すれば、ストレージから配信し続けます。一方、ユーザーはギガバイト単位、コンピューティング時間単位、そしてエンジニアリング時間単位で料金を支払います。この不均衡は意図的なものであり、努力しても改善されることはありません。
よくある質問
ウェブスクレイピングにおける「ハニーポットトラップ」とは何ですか?
自動化されたクライアントのみが反応する、ページ上に配置されたコンテンツのことです。例えば、目に見えないリンク、非表示のフォームフィールド、あるいは人間が通常見ることのない場所からリンクされているパスなどが挙げられます。 これとやり取りすることで、そのクライアントがボットであると特定され、サイト側はログ記録、レート制限、またはブロックといった対応を行います。
ハニーポットトラップを回避するにはどうすればよいですか?
多くのトラップは許可されていないパスに設置されているため、robots.txt を遵守してください。生の HTML を解析するのではなく、リンクをたどる前に計算された可視性を確認してください。 表示されていないフォームフィールドには入力しないでください。また、クロールには厳格な階層深度とページ数の制限を設けてください。これが無限の空間に対する唯一の防御策です。
AIターピットとは何ですか?
自動化されたクローラーに対し、生成されたページの無限の迷路を提示して、そのリソースを浪費させるシステムです。 Cloudflareの「AI Labyrinth」は、サイトとは全く無関係でありながら首尾一貫した事実に基づくコンテンツを生成し、実際のページから目に見えない形でリンクを張ります。これは無料プランを含むすべてのプランで、1つのトグルを切り替えるだけで利用可能です。
ハニーポットに引っかかる前にそれを検知することはできますか?
ある程度は可能です。ページをレンダリングし、計算されたスタイルを確認することで、隠されたリンクを確実に検出できます。生成された迷路の場合は、コンテンツに一貫性があるため検出が難しくなります。その兆候としては、増え続けるキュー、サイトと無関係なコンテンツ、繰り返されないURLパターンなどが挙げられます。いずれにせよ、クロールの範囲を制限することが有効な防御策となります。
隠しリンクはSEOやアクセシビリティに悪影響を及ぼしますか?
隠しテキストは、歴史的に検索エンジンによって操作的なものと見なされてきたため、トラップには通常、robots.txtによるアクセス拒否が組み合わされています。アクセシビリティの方がより大きな懸念事項です。display: noneは支援技術によって尊重されますが、画面外や透明なテキストはスクリーンリーダーのユーザーに読み上げられ、ユーザーがそれに従ってしまう可能性があります。
クローラーがハニーポットに遭遇するとどうなりますか?
ケースによって異なります。ログを記録するサイトもあれば、レート制限をかけるサイト、アドレスをブロックするサイト、あるいは無期限に品質の低下したコンテンツを配信し続けるサイトもあります。後者が最悪のケースです。すべてが200を返すため、データの品質が知らぬ間に低下してしまうからです。 ターピットはこれとは異なる動作をします。つまり、永遠にコンテンツを提供し続けるのです。
ハニーポットの罠は合法ですか?
自身のサイトに設置することは完全に合法です。何を配信するかはあなたが決めることだからです。 その結果得られた識別情報をサイト側がどう扱うかは、そのサイトの利用規約によって規定されます。クローラー側から見れば、ハニーポットに引っかかること自体は違法ではありませんが、利用規約に違反する可能性があり、これは契約上の問題となります。
クローラーがターピットで無駄な費用を費やすのを防ぐにはどうすればよいですか?
ドメインごとの探索深度やページ数に厳格な制限を設けること、ほぼ重複するページを検出するためのコンテンツのハッシュ化、そして新規発見されたURLと取得済みページの比率が低下しない場合にアラートを発する仕組みです。これらがなければ、従量制のクローラーは、完璧な成功率を報告しながらも、生成されたページに何日も費やし、ギガバイト単位のデータを消費してしまう可能性があります。
まとめ
ハニーポットトラップは、クローラーにはマークアップが表示され、人間にはレンダリングされたページが表示されるという1つの前提に基づいて機能します。それ以外はすべてバリエーションに過ぎません――見えないリンク、非表示のフィールド、robots.txt でのみ言及されるパス、あるいは終わりのない迷路などです。
こうした防御策は、いずれにせよ、しっかり構築されたクローラーが本来行うべきことそのものです。robots.txt を遵守しましょう。そこには多くの罠が潜んでおり、遵守にコストはかかりません。 生のHTMLを解析するのではなく、計算された可視性を確認してください。表示されていない限り、フォームには手を出さないでください。そして、クロールに厳格な制限を設けてください。これは、コンテンツが意図的に実際の文章と見分けがつかないように生成された迷路から身を守る唯一の手段です。
この最後のカテゴリーが経済的状況を一変させました。管理されたターピットはページを一度生成すればキャッシュから配信できますが、クローラーはギガバイト単位や計算時間単位で課金され、そのたびに200を返されます。この非対称性こそがポイントであり、今ではどのサイトでもスイッチ一つで利用可能で、いかなる努力も無意味です。
そのため、一見地味なこの選択肢も真剣に検討する価値がある。トラップを仕掛けているサイトは、あるメッセージを発信しているのだ。フィードを要求したり、APIを確認したり、あるいは他の場所でデータを見つけたりする方が、通常、あなたを敗北させるよう仕組まれた相手を出し抜こうとするよりも、速く、安く、そして持続可能である。
