web-dev-qa-db-ja.com

PuppeteerとPhantomjsでボットとして検出されないようにするにはどうすればよいですか?

PuppeteerとPhantomJSは似ています。私が抱えている問題は両方で発生しており、コードも同様です。

ウェブサイトからいくつかの情報をキャッチしたいのですが、それらの情報を表示するには認証が必要です。ホームページにアクセスすることさえできません。これは、SSのような「疑わしいアクティビティ」のように検出されるためです。 https://i.imgur.com/p69OIjO.png

Cookieという名前のヘッダーを使用してPostmanでテストしたときに問題が発生しないことを発見しました。しばらくすると期限が切れます。だから、Puppeteer/PhantomJSはどちらもCookieをキャッチしていないと思います。なぜなら、このサイトはブラウザーのヘッドレスアクセスを拒否しているからです。

これをバイパスするにはどうすればよいですか?

// Simple Javascript example
var page = require('webpage').create();
var url = 'https://www.expertflyer.com';

page.open(url, function (status) {
    if( status === "success") {
        page.render("home.png");
        phantom.exit();
    }
});
6

一般的に役立つこと:

  • ヘッダーは、以下を含む一般的なブラウザーに類似している必要があります。
  • 複数のリクエストを行う場合は、それらの間にランダムタイムアウトを入れます
  • ページで見つかったリンクを開く場合は、Refererヘッダーを適宜設定します
  • 画像を有効にする必要があります
  • Javascriptを有効にする必要があります
    • navigator.plugins」および「navigator.language」であることを確認しますクライアントのJavaScriptページコンテキストで設定
  • プロキシを使用する
2
Grubshka

アクセスしようとしているWebサイトは、Webスクレイピングを防ぐために Distil Networks を使用しています。

過去の成功 Distil Networksをバイパスして$cdc_変数はChromiumの call_function.js にあります(Puppeteerで使用されます)。

例:

function getPageCache(opt_doc, opt_w3c) {
  var doc = opt_doc || document;
  var w3c = opt_w3c || false;
  // var key = '$cdc_asdjflasutopfhvcZLmcfl_';    <-- This is the line that is changed.
  var key = '$something_different_';
  if (w3c) {
    if (!(key in doc))
      doc[key] = new CacheWithUUID();
    return doc[key];
  } else {
    if (!(key in doc))
      doc[key] = new Cache();
    return doc[key];
  }
}

注:このコメント によると、この変更を行う前にブラックリストに登録されている場合、別の課題に直面します。そのため、「偽のキャンバスフィンガープリンティングを実装し、フラッシュを無効にし、IPを変更し、リクエストヘッダーの順序を変更します(言語の交換とヘッダーの受け入れ)」。

2
Grant Miller

ウェブサイトの観点から考えると、あなたは確かに疑わしい仕事をしています。したがって、このようなものをバイパスしたいときはいつでも、彼らがどう考えているかを考えてください。

クッキーを適切に設定する

PuppeteerやPhantomJSなどは実際のブラウザを使用し、そこで使用されるCookieは郵便配達員などを介して使用する場合よりも優れています。クッキーを適切に使用する必要があります。

page.setCookie(...cookies)を使用してCookieを設定できます。 Cookieはシリアル化されるため、Cookieがオブジェクトの配列である場合は、これを簡単に行うことができます。

const cookies = [{name: 'test', value: 'foo'}, {name: 'test2', value: 'foo'}]; // just as example, use real cookies here;
await page.setCookie(...cookies);

動作を微調整してみてください

ヘッドレスモードをオフにして、Webサイトの動作を確認します。

await puppeteer.launch({headless: false})

プロキシを試す

一部のWebサイトはIPアドレスに基づいて監視します。複数のヒットが同じIPからのものである場合、リクエストをブロックします。その場合は、回転プロキシを使用するのが最善です。

1
Md. Abu Taher