サイトのスクレイピングを防ぐにはどうすればよいですか? [closed] 質問する

サイトのスクレイピングを防ぐにはどうすればよいですか? [closed] 質問する

私は大規模なアーティスト データベースを備えたかなり大規模な音楽 Web サイトを運営しています。他の音楽サイトが当サイトのデータをスクレイピングしていることに気づきました (ダミーのアーティスト名をあちこちに入力し、Google 検索を実行しています)。

スクリーンスクレイピングを防ぐにはどうしたらいいでしょうか? それは可能ですか?

ベストアンサー1

注:この回答の完全版はStack Overflowの長さ制限を超えているため、GitHubへより多くのヒントと詳細が記載された拡張版をお読みください。


スクレイピング ( Web スクレイピングスクリーンスクレイピングWeb データ マイニングWeb ハーベスティング、またはWeb データ抽出とも呼ばれる) を阻止するには、これらのスクレイパーがどのように機能するか、さらには、スクレイパーが適切に機能しない原因は何かを理解しておくことが役立ちます。

スクレーパーにはさまざまな種類があり、それぞれ動作が異なります。

  • クモなどGoogleのボットまたはウェブサイトのコピーサイトHTトラックは、データを取得するために他のページへのリンクを再帰的にたどります。これらは、特定のデータを取得するためのターゲットを絞ったスクレイピングに使用されることがあり、多くの場合、各ページから必要なデータを抽出するために HTML パーサーと組み合わせて使用​​されます。

  • シェル スクリプト: スクレイピングには、一般的な Unix ツールが使用されることがあります。ページをダウンロードするには Wget または Curl を使用し、データを抽出するには Grep (正規表現) を使用します。

  • JsoupをベースにしたHTMLパーサーなどスクレイピーなどです。シェル スクリプトの正規表現ベースのものと同様に、これらは HTML のパターンに基づいてページからデータを抽出し、通常は他のすべてを無視して機能します。

    たとえば、Web サイトに検索機能がある場合、このようなスクレーパーは検索のリクエストを送信し、結果ページの HTML からすべての結果リンクとそのタイトルを取得して、検索結果のリンクとそのタイトルのみを取得します。これらが最も一般的です。

  • 例えば、次のようなスクリーンスクレーパー。セレンまたはファントムJSは、実際のブラウザで Web サイトを開き、JavaScript、AJAX などを実行し、通常は次のようにして Web ページから目的のテキストを取得します。

    • ページが読み込まれ、JavaScript が実行された後にブラウザから HTML を取得し、HTML パーサーを使用して必要なデータを抽出します。これらは最も一般的な方法であり、HTML パーサー/スクレーパーを破る多くの方法もここで機能します。

    • レンダリングされたページのスクリーンショットを撮り、OCR を使用してスクリーンショットから必要なテキストを抽出します。これはまれであり、本当にデータが必要な熱心なスクレーパーだけがこれを設定します。

  • ウェブスクレイピングサービスなどスクレイピングハブまたは着物実際、あなたのサイトをスクレイピングして、他の人が使用できるようにコンテンツを抽出する方法を見つけることを仕事とする人々がいます。

    当然のことながら、プロのスクレイピング サービスは阻止するのが最も困難ですが、サイトのスクレイピング方法を理解するのが難しくて時間がかかるようにすると、これらのサービス (および料金を支払ってサービスを提供する人々) は Web サイトをスクレイピングする気にはなれないかもしれません。

  • 他のサイトのページにあなたのウェブサイトを埋め込むフレーム、モバイル アプリにサイトを埋め込むこともできます。

    技術的にはスクレイピングではありませんが、モバイル アプリ (Android および iOS) は Web サイトを埋め込み、カスタム CSS および JavaScript を挿入できるため、ページの外観が完全に変わります。

  • 人間によるコピー&ペースト: 人々はあなたのコンテンツを他の場所で使用するためにコピー&ペーストします。

これらの異なる種類のスクレーパーには多くの重複があり、異なるテクノロジーと方法を使用していても、多くのスクレーパーは同じように動作します。

これらのヒントは、主に私自身のアイデア、スクレーパーの作成中に遭遇したさまざまな困難、そしてインターネット上の情報やアイデアの断片です。

スクレイピングを止める方法

何をしても、スクレイパーはスクレイピングの方法を見つけ出すことができるため、スクレイピングを完全に防ぐことはできません。ただし、いくつかのことを行うことで、スクレイピングの多くを阻止できます。

ログとトラフィック パターンを監視し、異常なアクティビティが見られる場合はアクセスを制限します。

定期的にログを確認し、同じ IP アドレスからの類似したアクションが多数あるなど、自動アクセス (スクレーパー) を示す異常なアクティビティが見られる場合は、アクセスをブロックまたは制限できます。

具体的には、次のようなアイデアがあります。

  • レート制限:

    ユーザー (およびスクレイパー) が一定時間内に実行できるアクションの数を制限します。たとえば、特定の IP アドレスまたはユーザーから 1 秒あたり数回の検索のみを許可します。これにより、スクレイパーの速度が低下し、効果がなくなります。アクションが実際のユーザーよりも速く完了した場合には、キャプチャを表示することもできます。

  • 異常なアクティビティを検出:

    特定の IP アドレスからの類似したリクエストが多数発生している、過剰な数のページを閲覧している、異常な数の検索を実行しているなど、異常なアクティビティが見られる場合は、アクセスをブロックしたり、後続のリクエストに対してキャプチャを表示したりできます。

  • IP アドレスによる監視とレート制限だけでなく、他の指標も使用してください。

    ブロックやレート制限を行う場合は、IP アドレスごとに行うのではなく、他の指標や方法を使用して特定のユーザーやスクレーパーを識別することができます。特定のユーザーやスクレーパーを識別するのに役立つ指標には、次のものがあります。

    • ユーザーがフォームに記入する速さ、ボタンのどこをクリックするか。

    • JavaScript を使用すると、画面サイズや解像度、タイムゾーン、インストールされているフォントなど、さまざまな情報を収集でき、これを使用してユーザーを識別できます。

    • HTTP ヘッダーとその順序、特に User-Agent。

    たとえば、単一の IP アドレスから多数のリクエストを受け取り、すべて同じユーザー エージェント、画面サイズ (JavaScript で決定) を使用しており、ユーザー (この場合はスクレイパー) が常に同じ方法で一定の間隔でボタンをクリックする場合、それはおそらくスクリーン スクレイパーです。同様のリクエストを一時的にブロックできます (たとえば、特定の IP アドレスからのそのユーザー エージェントと画面サイズのすべてのリクエストをブロックする)。こうすることで、共有インターネット接続の場合など、その IP アドレスの実際のユーザーに迷惑をかけずに済みます。

    さらに、異なる IP アドレスから送信された場合でも、分散スクレイピング (ボットネットまたはプロキシ ネットワークを使用するスクレイパー) を示す類似のリクエストを識別できるため、これをさらに進めることができます。異なる IP アドレスから送信されたが、それ以外は同一のリクエストが多数ある場合は、ブロックできます。繰り返しますが、実際のユーザーを誤ってブロックしないように注意してください。

    これは、JavaScript を実行するスクリーンスクレーパーに対して効果的です。スクリーンスクレーパーから多くの情報を取得できるためです。

    Security Stack Exchange の関連質問:

  • アクセスを一時的にブロックする代わりに、Captcha を使用します。

    レート制限を実装する最も簡単な方法は、一定時間アクセスを一時的にブロックすることですが、Captcha を使用する方がよい場合もあります。下記の Captcha のセクションを参照してください。

登録とログインが必要

サイトで実行可能な場合は、コンテンツを閲覧するためにアカウントの作成を要求します。これはスクレイパーに対する抑止力として有効ですが、実際のユーザーに対する抑止力としても有効です。

  • アカウントの作成とログインを必須にすると、ユーザーとスクレイパーのアクションを正確に追跡できます。こうすることで、特定のアカウントがスクレイピングに使用されていることを簡単に検出し、禁止することができます。IP アドレスだけでなく特定のスクレイパーを識別できるため、レート制限や不正使用の検出 (短時間での大量の検索など) などが容易になります。

スクリプトが多数のアカウントを作成するのを避けるには、次の操作を行う必要があります。

  • 登録には電子メール アドレスが必要で、アカウントを有効にするために開く必要があるリンクを送信してその電子メール アドレスを確認します。電子メール アドレスごとに 1 つのアカウントのみを許可します。

  • 登録/アカウント作成時にキャプチャを解読する必要があります。

コンテンツを表示するためにアカウントの作成を要求すると、ユーザーと検索エンジンが離れてしまいます。記事を表示するためにアカウントの作成を要求すると、ユーザーは他の場所に行ってしまいます。

クラウドホスティングおよびスクレイピングサービスのIPアドレスからのアクセスをブロックする

場合によっては、スクレイパーは Amazon Web Services、GAE、VPS などの Web ホスティング サービスから実行されることがあります。このようなクラウド ホスティング サービスで使用される IP アドレスからのリクエストに対して、Web サイトへのアクセスを制限します (またはキャプチャを表示します)。

同様に、スクレーパーは多くのリクエストが検出されないようにするためにプロキシ サーバーを使用する可能性があるため、プロキシまたは VPN プロバイダーが使用する IP アドレスからのアクセスを制限することもできます。

プロキシ サーバーや VPN からのアクセスをブロックすると、実際のユーザーに悪影響を与えることに注意してください。

ブロックする場合はエラーメッセージを分かりにくくする

アクセスをブロック/制限する場合は、ブロックの原因をスクレーパーに伝えないようにする必要があります。そうしないと、スクレーパーを修正する方法のヒントがスクレーパーに与えられてしまいます。そのため、次のようなテキストを含むエラー ページを表示するのは好ましくありません。

  • IP アドレスからのリクエストが多すぎます。しばらくしてからもう一度お試しください。

  • エラー、ユーザー エージェント ヘッダーが存在しません。

代わりに、スクレーパーに原因を知らせないわかりやすいエラー メッセージを表示します。次のようなメッセージの方がはるかに優れています。

  • [email protected]申し訳ございません。問題が発生しました。問題が解決しない場合は、からサポートにお問い合わせください。

これは、実際のユーザーがこのようなエラー ページを見た場合に、ユーザーにとって非常に使いやすいものになります。実際のユーザーがエラー メッセージを見た場合にブロックして正当なユーザーから問い合わせを受けることがないように、ハード ブロックの代わりに後続のリクエストに対してキャプチャを表示することも検討してください。

ウェブサイトがスクレーパーによってアクセスされている疑いがある場合は、キャプチャを使用してください。

キャプチャ (「コンピュータと人間を区別する完全に自動化されたテスト」) は、スクレイパーを阻止するのに非常に効果的です。残念ながら、キャプチャはユーザーをイライラさせるのにも非常に効果的です。

そのため、スクレイパーの疑いがあり、スクレイピングを止めたいが、スクレイパーではなく実際のユーザーである場合にアクセスをブロックしたくない場合に便利です。スクレイパーの疑いがある場合は、コンテンツへのアクセスを許可する前にキャプチャを表示することを検討してください。

キャプチャを使用する際に注意すべき点:

  • 自分で作らず、Googleのようなものを使いましょう再キャプチャ: 自分でキャプチャを実装するよりもはるかに簡単で、自分で思いついたぼやけた歪んだテキストソリューションよりもユーザーフレンドリーです(ユーザーは多くの場合、ボックスにチェックを入れるだけで済みます)。また、スクリプト作成者にとっても、サイトから提供される単純な画像よりも解決がはるかに困難です。

  • HTML マークアップにキャプチャの解答を含めないでください。実際に、キャプチャの解答をページ自体に含めている Web サイトを 1 つ見たことがありますが (かなりうまく隠されていますが)、これはまったく役に立ちません。このようなことはしないでください。繰り返しますが、reCaptcha などのサービスを使用すると、このような問題は発生しません (適切に使用した場合)。

  • キャプチャは一括で解読できます: 低賃金で実際に人間がキャプチャを一括で解読するキャプチャ解読サービスがあります。ここでも、reCaptcha を使用するのが得策です。保護機能 (ユーザーがキャプチャを解くのに与えられる時間が比較的短いなど) があるからです。データが本当に価値のあるものでない限り、この種のサービスは使用される可能性は低いでしょう。

テキストコンテンツを画像として提供する

サーバー側でテキストを画像にレンダリングし、それを表示できるようにすることで、単純なスクレーパーによるテキストの抽出を妨げます。

ただし、これはスクリーン リーダー、検索エンジン、パフォーマンス、その他ほとんどすべての面で悪影響を及ぼします。また、一部の地域では違法であり (アクセシビリティのため、たとえばアメリカ障害者法)、OCR で簡単に回避できるため、実行しないでください。

CSS スプライトでも同様のことを行うことができますが、同じ問題が発生します。

完全なデータセットを公開しないでください。

可能であれば、スクリプトやボットがデータセット全体を取得する手段を提供しないでください。例: 多数の個別の記事があるニュース サイトがあるとします。これらの記事は、オンサイト検索で検索することによってのみアクセスできるようにすることができます。サイト上のすべての記事のリストとその URL がどこにもない場合は、検索機能を使用することによってのみこれらの記事にアクセスできるようになります。つまり、サイトからすべての記事を取得したいスクリプトは、すべての記事を見つけるために、記事に出現する可能性のあるすべてのフレーズを検索する必要があります。これは時間がかかり、非常に非効率的であり、うまくいけばスクレイパーが諦めることになります。

以下の場合には効果がありません:

  • いずれにしても、ボット/スクリプトは完全なデータセットを必要としません。
  • 記事は、 のような URL から提供されます。これにより (および同様のもの)、スクレーパーはすべての を単純に反復処理し、その方法ですべての記事をリクエストexample.com/article.php?articleId=12345できるようになります。articleId
  • 記事内のリンクをたどって他の記事に移動するスクリプトを作成するなど、最終的にすべての記事を見つける方法は他にもあります。
  • 「and」や「the」などを検索すると、ほとんどすべての情報が表示される可能性があるため、注意が必要です。(上位 10 件または 20 件の結果のみを返すことで、この問題を回避できます)。
  • コンテンツを見つけるには検索エンジンが必要です。

API、エンドポイント、および類似のものを公開しないでください。

意図せずとも、API を公開しないようにしてください。たとえば、Adobe Flash または Java アプレット (絶対にやめてください!) 内から AJAX またはネットワーク リクエストを使用してデータをロードする場合、ページからのネットワーク リクエストを調べてそれらのリクエストの送信先を把握し、リバース エンジニアリングしてそれらのエンドポイントをスクレーパー プログラムで使用するのは簡単です。説明されているように、エンドポイントを難読化して、他のユーザーが使用しにくいようにしてください。

HTML パーサーとスクレーパーを阻止するには:

HTML パーサーは HTML 内の識別可能なパターンに基づいてページからコンテンツを抽出することで機能するため、これらのパターンを意図的に変更してこれらのスクレーパーを破壊したり、操作したりすることができます。これらのヒントのほとんどは、スパイダーやスクリーンスクレーパーなどの他のスクレーパーにも適用されます。

HTMLを頻繁に変更する

HTML を直接処理するスクレイパーは、HTML ページの特定の識別可能な部分からコンテンツを抽出することで処理を行います。たとえば、Web サイトのすべてのページに、記事のテキストを含む というdivID を持つ があるarticle-content場合、サイト上のすべての記事ページにアクセスし、各記事ページの div のコンテンツ テキストを抽出するスクリプトを簡単に作成できます。article-contentこれで、スクレイパーはサイトのすべての記事を他の場所で再利用できる形式で取得できます。

HTML やページの構造を頻繁に変更すると、このようなスクレーパーは機能しなくなります。

  • HTML 内の要素の ID とクラスは頻繁に変更でき、おそらく自動的に変更することもできます。したがって、 が のdiv.article-contentようになりdiv.a4c36dda13eaf0、毎週変更される場合、スクレーパーは最初は正常に動作しますが、1 週間後には機能しなくなります。ID / クラスの長さも必ず変更してください。そうしないと、スクレーパーはdiv.[any-14-characters]代わりに を使用して目的の div を検索します。他の同様の穴にも注意してください。

  • マークアップから目的のコンテンツを見つける方法がない場合、スクレイパーは HTML の構造からコンテンツを見つけます。したがって、すべての記事ページが、の後に続くdiv内のすべてのが記事コンテンツであるという点で類似している場合、スクレイパーはそれに基づいて記事コンテンツを取得します。繰り返しますが、これを打破するには、HTML に余分なマークアップを定期的かつランダムに追加/削除します。たとえば、余分な または を追加します。最新のサーバー側 HTML 処理では、これはそれほど難しくありません。divh1divspan

注意事項:

  • 実装、保守、デバッグは面倒で困難になります。

  • キャッシュが妨げられます。特に、HTML 要素の ID やクラスを変更すると、CSS ファイルや JavaScript ファイルもそれに応じて変更する必要があり、変更するたびにブラウザで再ダウンロードする必要があります。その結果、繰り返しアクセスする訪問者のページ読み込み時間が長くなり、サーバーの負荷が増加します。週に 1 回だけ変更する場合は、大きな問題にはなりません。

  • 賢いスクレーパーは、実際のコンテンツがどこにあるかを推測することで、コンテンツを取得することができます。たとえば、ページ上の大きな単一のテキスト ブロックが実際の記事である可能性が高いことを知ることで、コンテンツを取得することができます。これにより、ページから必要なデータを検索して抽出することが可能になります。ボイラーパイプまさにこれを行います。

基本的に、スクリプトが類似するすべてのページの実際の目的のコンテンツを簡単に見つけられないようにします。

参照XPath に依存するクローラーがページ コンテンツを取得できないようにする方法PHP でこれを実装する方法の詳細については、こちらをご覧ください。

ユーザーの所在地に応じてHTMLを変更する

これは前のヒントと似ています。ユーザーの場所/国 (IP アドレスで決定) に基づいて異なる HTML を提供すると、ユーザーに配信されるスクレーパーが壊れる可能性があります。たとえば、誰かがサイトからデータをスクレーピングするモバイル アプリを作成している場合、最初は問題なく動作しますが、実際にユーザーに配信されると、それらのユーザーが別の国にいる可能性があり、埋め込まれたスクレーパーが消費するように設計されていない別の HTML を取得するため、壊れます。

HTML を頻繁に変更し、そうすることでスクレーパーを積極的に妨害します。

例: にある Web サイトに検索機能があり、example.com/search?query=somesearchquery次の HTML が返されるとします。

<div class="search-result">
  <h3 class="search-result-title">Stack Overflow has become the world's most popular programming Q & A website</h3>
  <p class="search-result-excerpt">The website Stack Overflow has now become the most popular programming Q & A website, with 10 million questions and many users, which...</p>
  <a class"search-result-link" href="/stories/story-link">Read more</a>
</div>
(And so on, lots more identically structured divs with search results)

ご想像のとおり、これは簡単にスクレイピングできます。スクレイパーが行う必要があるのは、クエリを使用して検索 URL にアクセスし、返された HTML から必要なデータを抽出することだけです。上記のように HTML を定期的に変更することに加えて、古い ID とクラスを含む古いマークアップを残し、CSS でそれを隠し、偽のデータで埋め込むことで、スクレイパーを汚染することもできます。検索結果ページを変更する方法は次のとおりです。

<div class="the-real-search-result">
  <h3 class="the-real-search-result-title">Stack Overflow has become the world's most popular programming Q & A website</h3>
  <p class="the-real-search-result-excerpt">The website Stack Overflow has now become the most popular programming Q & A website, with 10 million questions and many users, which...</p>
  <a class"the-real-search-result-link" href="/stories/story-link">Read more</a>
</div>

<div class="search-result" style="display:none">
  <h3 class="search-result-title">Visit Example.com now, for all the latest Stack Overflow related news !</h3>
  <p class="search-result-excerpt">Example.com is so awesome, visit now !</p>
  <a class"search-result-link" href="http://example.com/">Visit Now !</a>
</div>
(More real search results follow)

つまり、クラスや ID に基づいて HTML からデータを抽出するように作成されたスクレーパーは、一見すると引き続き機能しているように見えますが、CSS で隠されているため実際のユーザーには決して表示されない偽のデータや広告さえも取得することになります。

スクレーパーで不正行為をする: 偽の目に見えないハニーポットデータをページに挿入する

前の例に加えて、スクレーパーを捕捉するために HTML に目に見えないハニーポット項目を追加することができます。前に説明した検索結果ページに追加できる例:

<div class="search-result" style="display:none">
  <h3 class="search-result-title">This search result is here to prevent scraping</h3>
  <p class="search-result-excerpt">If you're a human and see this, please ignore it. If you're a scraper, please click the link below :-)
  Note that clicking the link below will block access to this site for 24 hours.</p>
  <a class"search-result-link" href="/scrapertrap/scrapertrap.php">I'm a scraper !</a>
</div>
(The actual, real, search results follow.)

すべての検索結果を取得するために作成されたスクレーパーは、ページ上の他の実際の検索結果と同様にこれを取得し、リンクにアクセスして目的のコンテンツを探します。実際の人間は、そもそもこれを見ることすらなく (CSS で隠されているため)、リンクにアクセスしません。Google などの本物の望ましいスパイダーも、/scrapertrap/robots.txt で許可されていないため、リンクにアクセスしません。

scrapertrap.phpアクセスした IP アドレスからのアクセスをブロックしたり、その IP からの後続のすべてのリクエストに対してキャプチャを強制したりするなどの操作を実行できます。

  • /scrapertrap/検索エンジンのボットがハニーポットに陥らないように、robots.txt ファイルでハニーポット ( ) を禁止することを忘れないでください。

  • これを、HTML を頻繁に変更するという前のヒントと組み合わせることができます (組み合わせるべきです)。

  • これも頻繁に変更してください。スクレーパーは最終的にこれを回避することを学習します。ハニーポットの URL とテキストを変更します。また、非表示に使用されるインライン CSS を変更し、代わりに ID 属性と外部 CSS を使用することを検討してください。スクレーパーは、styleコンテンツを非表示にするために使用される CSS の属性を持つものを回避することを学習します。また、時々のみ有効にして、スクレーパーが最初は機能し、しばらくすると機能しなくなるようにしてください。これは、前のヒントにも当てはまります。

  • 悪意のある人物は、ハニーポットへのリンクを共有したり、そのリンクを画像としてどこかに埋め込んだり(フォーラムなど)、実際のユーザーのアクセスを阻止することができます。URL を頻繁に変更し、禁止期間を比較的短くしてください。

スクレイパーを検出した場合、偽造された役に立たないデータを提供する

明らかにスクレイパーであるものを検出した場合、偽造された役に立たないデータを提供することができます。これにより、スクレイパーが Web サイトから取得するデータが破損します。また、スクレイパーが騙されていることに気付かないように、偽造データと実際のデータを区別できないようにする必要があります。

例えば、ニュースサイトを運営している場合、スクレイパーを検出したら、アクセスをブロックするのではなく、偽のランダムに生成された記事を偽造すると、スクレイパーが取得するデータが汚染されます。偽造データを本物と区別できないようにすると、スクレイパーが目的のデータ、つまり実際のデータを取得するのが難しくなります。

ユーザーエージェントが空または見つからない場合はリクエストを受け入れない

多くの場合、手抜きで書かれたスクレーパーはリクエストとともにユーザー エージェント ヘッダーを送信しませんが、すべてのブラウザーと検索エンジン スパイダーは送信します。

User Agent ヘッダーが存在しないリクエストを受け取った場合は、キャプチャを表示するか、単にアクセスをブロックまたは制限することができます。(または、上記のように偽のデータを提供するか、その他の方法を使用します。)

偽装するのは簡単ですが、質の低いスクレーパーに対する対策として実装する価値はあります。

ユーザーエージェントが一般的なスクレーパーのものである場合はリクエストを受け入れず、スクレーパーが使用するものはブラックリストに登録します。

場合によっては、スクレイパーは実際のブラウザや検索エンジンのスパイダーが使用しないユーザー エージェントを使用します。次に例を示します。

  • 「Mozilla」(それだけです。他には何もありません。ここでスクレイピングに関する質問をいくつか見ましたが、それを使用しています。実際のブラウザではそれだけを使用することはありません)
  • 「Java 1.7.43_u43」(デフォルトでは、Java の HttpUrlConnection は次のようなものを使用します。)
  • 「BIZCOイージースクレイピングスタジオ2.0」
  • 「wget」、「curl」、「libcurl」、...(Wget と cURL は基本的なスクレイピングに使用されることがあります)

特定のユーザー エージェント文字列がサイト上のスクレーパーによって使用されており、実際のブラウザーや正当なスパイダーでは使用されていないことが判明した場合は、その文字列をブラックリストに追加することもできます。

アセット (CSS、画像) を要求しない場合は、実際のブラウザではありません。

実際のブラウザは (ほとんどの場合) 画像や CSS などのアセットを要求してダウンロードします。HTML パーサーとスクレーパーは実際のページとそのコンテンツのみに関心があるため、アセットを要求してダウンロードしません。

アセットへのリクエストをログに記録し、HTML のみのリクエストが多数ある場合は、スクレーパーである可能性があります。

検索エンジン ボット、古いモバイル デバイス、スクリーン リーダー、誤って構成されたデバイスもアセットをリクエストしない場合があることに注意してください。

クッキーを使用し、要求します。クッキーを使用して、ユーザーとスクレーパーのアクションを追跡します。

ウェブサイトを表示するために、クッキーを有効にすることを必須にすることができます。これにより、経験の浅い初心者のスクレーパー作成者を阻止できますが、スクレーパーがクッキーを送信するのは簡単です。クッキーを使用して必須にする場合は、クッキーを使用してユーザーとスクレーパーのアクションを追跡し、IP ごとではなくユーザーごとにレート制限、ブロック、またはキャプチャの表示を実装できます。

たとえば、ユーザーが検索を実行すると、一意の識別 Cookie が設定されます。結果ページが表示されたら、その Cookie を確認します。ユーザーがすべての検索結果を開いた場合 (Cookie から判断できます)、それはおそらくスクレーパーです。

スクレーパーはリクエストとともにクッキーも送信し、必要に応じて破棄できるため、クッキーの使用は効果的でない可能性があります。また、サイトがクッキーのみで動作する場合、クッキーを無効にしている実際のユーザーのアクセスも妨げられます。

JavaScript を使用して Cookie を設定および取得する場合、JavaScript を実行しないスクレーパーはリクエストで Cookie を取得して送信できないため、ブロックされることに注意してください。

JavaScript + Ajaxを使用してコンテンツを読み込みます

ページ自体が読み込まれた後に、JavaScript + AJAX を使用してコンテンツを読み込むことができます。これにより、JavaScript を実行しない HTML パーサーはコンテンツにアクセスできなくなります。これは、スクレーパーを作成する初心者や経験の浅いプログラマーにとって効果的な抑止力となることがよくあります。

次の点に注意してください:

  • JavaScriptを使用して実際のコンテンツを読み込むと、ユーザーエクスペリエンスとパフォーマンスが低下します。

  • 検索エンジンも JavaScript を実行できないため、コンテンツのインデックスを作成できません。これは検索結果ページでは問題にならないかもしれませんが、記事ページなど他のページでは問題になる可能性があります。

マークアップ、スクリプトからのネットワーク要求、その他すべてを難読化します。

Ajax と JavaScript を使用してデータを読み込む場合は、転送されるデータを難読化します。たとえば、サーバー上でデータをエンコードし (base64 のような単純なもの、またはより複雑なものを使用)、Ajax 経由で取得した後、クライアントでデコードして表示することができます。これにより、ネットワーク トラフィックを検査している人は、ページの動作やデータの読み込みをすぐには確認できなくなります。また、エンドポイントからリクエスト データを直接要求する人が困難になります。これは、スクランブル解除アルゴリズムをリバース エンジニアリングする必要があるためです。

  • データの読み込みに Ajax を使用する場合は、たとえば JavaScript または HTML に埋め込むことができるセッション キーをパラメーターとして要求するなどして、最初にページを読み込まずにエンドポイントを使用することを困難にする必要があります。

  • 難読化されたデータを最初の HTML ページに直接埋め込み、JavaScript を使用して難読化を解除して表示することもできます。これにより、余分なネットワーク リクエストを回避できます。これを行うと、スクレーパーを作成する人が JavaScript (これも難読化する必要があります) をリバース エンジニアリングする必要があるため、JavaScript を実行しない HTML のみのパーサーを使用してデータを抽出することが非常に難しくなります。

  • 難読化方法を解読したスクレーパーを阻止するために、難読化方法を定期的に変更することをお勧めします。

ただし、このようなことを行うと、いくつかの欠点があります。

  • 実装、保守、デバッグは面倒で困難になります。

  • 実際に JavaScript を実行してデータを抽出するスクレーパーやスクリーンスクレーパーに対しては効果がありません。(ただし、ほとんどの単純な HTML パーサーは JavaScript を実行しません)

  • JavaScript が無効になっていると、実際のユーザーに対してサイトが機能しなくなります。

  • パフォーマンスとページの読み込み時間が低下します。

非技術的な:

  • 削らないように言うと、それを尊重する人もいる

  • 弁護士を探す

  • データを利用できるようにし、API を提供します。

    データを簡単に利用できるようにし、帰属表示とサイトへのリンクを要求することもできます。おそらく、それには $$$ を請求するでしょう。

その他:

  • Cloudflareのアンチスクレイピングや、ディスティルネットワーク(仕組みの詳細についてはここ) は、これらの機能やその他の機能を実行します。

  • 実際のユーザーにとっての使いやすさとスクレーパー耐性のバランスを見つけます。行うすべてのことは、何らかの形でユーザー エクスペリエンスに悪影響を及ぼすため、妥協点を見つけます。

  • モバイルサイトとアプリも忘れないでください。モバイルアプリがある場合は、スクリーンスクレイピングも可能で、ネットワークトラフィックを検査して、使用されている REST エンドポイントを特定できます。

  • スクレイパーは他のスクレイパーをスクレイピングできます: あなたのウェブサイトからスクレイピングされたコンテンツを持つウェブサイトが 1 つある場合、他のスクレイパーはそのスクレイパーのウェブサイトからスクレイピングできます。

参考文献:

おすすめ記事