ホームページ >ウェブフロントエンド >jsチュートリアル >ノード、ファントミ、騎手でrawうウェブ
司令官を使用すると、どの引数がサポートされているかを定義できますが、プロンプトを使用すると、実行時にユーザーに入力を(適切に)促すことができます。最終結果は、いくつかのユーザーが提供するデータに基づいて動的な動作を備えたさまざまなアクションを実行するための構文的に甘いインターフェイスです。
たとえば、コマンドを次のように見せたい:
$ <span>node run.js -x hello_world </span>エントリポイント(run.js)は、次のような可能な引数を定義します。
このようなさまざまなユーザー入力ケースを定義します:
program <span>.version('1.0.0') </span> <span>.option('-x --action-to-perform [string]', 'The type of action to perform.') </span> <span>.option('-u --url [string]', 'Optional URL used by certain actions') </span> <span>.parse(process.argv); </span>この時点で、実行するアクションを指定できる基本的なパスを定義し、URLを受け入れるプロンプトを追加しました。このアクションに固有のロジックを処理するモジュールを追加するだけです。 hello_world.jsという名前のファイルをアクションディレクトリに追加することでこれを行うことができます:
<span>var performAction = require('./actions/' + program.actionToPerform) </span> <span>switch (program.actionToPerform) { </span> <span>case 'hello_world': </span> prompt<span>.get([{ </span> <span>// What the property name should be in the result object </span> <span>name: 'url', </span> <span>// The prompt message shown to the user </span> <span>description: 'Enter a URL', </span> <span>// Whether or not the user is required to enter a value </span> <span>required: true, </span> <span>// Validates the user input </span> <span>conform: function (value) { </span> <span>// In this case, the user must enter a valid URL </span> <span>return validUrl.isWebUri(value); </span> <span>} </span> <span>}], function (err<span>, result</span>) { </span> <span>// Perform some action following successful input </span> <span>performAction(phantomInstance, result.url); </span> <span>}); </span> <span>break; </span><span>} </span>ご覧のとおり、モジュールには、PhantomJSオブジェクト(Phantominstance)とURL(URL)のインスタンスが提供されると予想されます。 PhantomJSインスタンスを一時的に定義する詳細について説明しますが、今のところ、特定のアクションをトリガーするための基礎を築いていることがわかります。コンベンションを導入したので、定義された正気な方法で新しいアクションを簡単に追加できます。
騎手を使用してファントムジをrawった
<span>'use strict'; </span> <span>/** </span><span> * <span>@param Horseman phantomInstance </span></span><span> * <span>@param string url </span></span><span> */ </span>module<span>.exports = function (phantomInstance<span>, url</span>) { </span> <span>if (!url || typeof url !== 'string') { </span> <span>throw 'You must specify a url to ping'; </span> <span>} else { </span> <span>console.log('Pinging url: ', url); </span> <span>} </span> phantomInstance <span>.open(url) </span> <span>.status() </span> <span>.then(function (statusCode) { </span> <span>if (Number(statusCode) >= 400) { </span> <span>throw 'Page failed with status: ' + statusCode; </span> <span>} else { </span> <span>console.log('Hello world. Status code returned: ', statusCode); </span> <span>} </span> <span>}) </span> <span>.catch(function (err) { </span> <span>console.log('Error: ', err); </span> <span>}) </span> <span>// Always close the Horseman instance </span> <span>// Otherwise you might end up with orphaned phantom processes </span> <span>.close(); </span><span>}; </span>Horsemanは、PhantomJSプロセスを作成および対話するための強力なインターフェイスを提供するNode.jsパッケージです。 Horsemanとその機能の包括的な説明は、独自の記事を保証するでしょうが、人間のユーザーがブラウザで展示する可能性のある動作を簡単にシミュレートできると言うだけで十分です。 Horsemanは、jQueryを自動的に注入したり、SSL証明書の警告を無視したりするなど、幅広い構成オプションを提供します。また、クッキーの取り扱いとスクリーンショットの撮影の機能も提供します。
CLIフレームワークを介してアクションをトリガーするたびに、エントリスクリプト(run.js)が騎手のインスタンスをインスタンスにし、指定されたアクションモジュールに渡します。擬似コードでは、次のように見えます:
<span>var phantomInstance = new Horseman({ </span> <span>phantomPath: '/usr/local/bin/phantomjs', </span> <span>loadImages: true, </span> <span>injectJquery: true, </span> <span>webSecurity: true, </span> <span>ignoreSSLErrors: true </span><span>}); </span> <span>performAction(phantomInstance, ...); </span>複雑な相互作用のための騎手の方法
これまでのところ、騎手の非常にシンプルな使用法を調べましたが、ブラウザで一連のアクションを実行するためにメソッドを一緒にチェーンすると、パッケージはさらに多くのことを行うことができます。これらの機能のいくつかを実証するために、GitHubを介してナビゲートして新しいリポジトリを作成するユーザーをシミュレートするアクションを定義しましょう。
注意:この例は純粋にデモンストレーションの目的であり、GitHubリポジトリを作成するための実行可能な方法と見なされるべきではありません。これは、Webアプリケーションと対話するために騎手を使用する方法の単なる例です。自動化された方法でリポジトリを作成することに興味がある場合は、公式のGitHub APIを使用する必要があります。
新しいクロールがそうするようにトリガーされると仮定しましょう:
$ <span>node run.js -x hello_world </span>CLIフレームワークの慣習に続いて、既に導入されているため、Create_Repo.jsという名前のアクションディレクトリに新しいモジュールを追加する必要があります。以前の「Hello World」の例と同様に、create_repoモジュールは、そのアクションのすべてのロジックを含む単一の関数をエクスポートします。
このアクションにより、以前よりもエクスポートされた関数により多くのパラメーターを渡すことに注意してください。パラメーターには、ユーザー名、パスワード、リポジトリが含まれます。ユーザーが迅速な課題を正常に完了したら、run.jsからこれらの値を渡します。 ただし、そのいずれかが発生する前に、run.jsにロジックを追加してプロンプトをトリガーしてデータをキャプチャする必要があります。メインスイッチステートメントにケースを追加することにより、これを行います:
program <span>.version('1.0.0') </span> <span>.option('-x --action-to-perform [string]', 'The type of action to perform.') </span> <span>.option('-u --url [string]', 'Optional URL used by certain actions') </span> <span>.parse(process.argv); </span>
このフックをrun.jsに追加したので、ユーザーが関連するデータを入力するとアクションに渡され、クロールを進めることができます。
create_repoクロールロジック自体については、Horsemanの一連の方法を使用してGithubログインページに移動し、提供されたユーザー名とパスワードを入力し、フォームを送信します。
<span>var performAction = require('./actions/' + program.actionToPerform) </span> <span>switch (program.actionToPerform) { </span> <span>case 'hello_world': </span> prompt<span>.get([{ </span> <span>// What the property name should be in the result object </span> <span>name: 'url', </span> <span>// The prompt message shown to the user </span> <span>description: 'Enter a URL', </span> <span>// Whether or not the user is required to enter a value </span> <span>required: true, </span> <span>// Validates the user input </span> <span>conform: function (value) { </span> <span>// In this case, the user must enter a valid URL </span> <span>return validUrl.isWebUri(value); </span> <span>} </span> <span>}], function (err<span>, result</span>) { </span> <span>// Perform some action following successful input </span> <span>performAction(phantomInstance, result.url); </span> <span>}); </span> <span>break; </span><span>} </span>フォーム送信ページがロードされるのを待ってチェーンを続けます:
その後、jqueryを使用して、ログインが成功したかどうかを判断します。
<span>'use strict'; </span> <span>/** </span><span> * <span>@param Horseman phantomInstance </span></span><span> * <span>@param string url </span></span><span> */ </span>module<span>.exports = function (phantomInstance<span>, url</span>) { </span> <span>if (!url || typeof url !== 'string') { </span> <span>throw 'You must specify a url to ping'; </span> <span>} else { </span> <span>console.log('Pinging url: ', url); </span> <span>} </span> phantomInstance <span>.open(url) </span> <span>.status() </span> <span>.then(function (statusCode) { </span> <span>if (Number(statusCode) >= 400) { </span> <span>throw 'Page failed with status: ' + statusCode; </span> <span>} else { </span> <span>console.log('Hello world. Status code returned: ', statusCode); </span> <span>} </span> <span>}) </span> <span>.catch(function (err) { </span> <span>console.log('Error: ', err); </span> <span>}) </span> <span>// Always close the Horseman instance </span> <span>// Otherwise you might end up with orphaned phantom processes </span> <span>.close(); </span><span>}; </span>ログインが失敗した場合、エラーがスローされます。それ以外の場合は、プロファイルページに移動する方法をチェーンし続けます:
<span>var phantomInstance = new Horseman({ </span> <span>phantomPath: '/usr/local/bin/phantomjs', </span> <span>loadImages: true, </span> <span>injectJquery: true, </span> <span>webSecurity: true, </span> <span>ignoreSSLErrors: true </span><span>}); </span> <span>performAction(phantomInstance, ...); </span>プロフィールページに登録したら、[リポジトリ]タブに移動します:
$ <span>node run.js -x create_repo </span>[リポジトリ]タブで、指定された名前のリポジトリが既に存在するかどうかを確認します。もしそうなら、エラーをスローします。そうでない場合は、シーケンスを続行します:
module<span>.exports = function (phantomInstance<span>, username, password, repository</span>) { </span> <span>if (!username || !password || !repository) { </span> <span>throw 'You must specify login credentials and a repository name'; </span> <span>} </span> <span>... </span><span>} </span>エラーがスローされていないと仮定して、プログラムで「新しいリポジトリ」ボタンをクリックし、次のページを待っています。
その後、付属のリポジトリ名を入力してフォームを送信します。
<span>switch (program.actionToPerform) { </span> <span>case 'create_repo': </span> prompt<span>.get([{ </span> <span>name: 'repository', </span> <span>description: 'Enter repository name', </span> <span>required: true </span> <span>}, { </span> <span>name: 'username', </span> <span>description: 'Enter GitHub username', </span> <span>required: true </span> <span>}, { </span> <span>name: 'password', </span> <span>description: 'Enter GitHub password', </span> <span>hidden: true, </span> <span>required: true </span> <span>}], function (err<span>, result</span>) { </span> <span>performAction( </span> phantomInstance<span>, </span> result<span>.username, </span> result<span>.password, </span> result<span>.repository </span> <span>); </span> <span>}); </span> <span>break; </span> <span>... </span>
結果のページに到達したら、リポジトリが作成されたことがわかります:
phantomInstance <span>.open('https://github.com/login') </span> <span>.type('input[name="login"]', username) </span> <span>.type('input[name="password"]', password) </span> <span>.click('input[name="commit"]') </span>
騎手のクロールと同様に、最後に騎手インスタンスを閉じることが重要です:
<span>.waitForNextPage() </span>
馬術師のインスタンスを閉じることができないと、孤立したファントムJSプロセスがマシン上で持続する可能性があります。 データを収集するためにrawう
この時点で、GitHubに新しいリポジトリをプログラム的に作成するために、一連の動作シーケンスを組み立てました。これを達成するために、私たちは一連の騎手の方法をチェックしました。このアプローチは、事前に知られている特定の構造的および行動パターンに役立つ場合がありますが、ある時点でより柔軟なスクリプトを実装する必要があることがわかります。これは、アクションシーケンスがコンテキストに基づいて大きく異なるか、複数の異なる結果を生成する可能性がある場合に当てはまります。また、DOMからデータを抽出する必要がある場合にも当てはまります。 このような場合、Horseman's Evaluate()メソッドを使用できます。これにより、インラインまたは外部リンクJavaScriptを注入することにより、ブラウザでフリーフォームインタラクションを実行できます。
このセクションは、ページから基本データを抽出する例を示しています(この場合、アンカーリンク)。これが必要になる可能性のあるシナリオの1つは、ドメイン上のすべてのURLをヒットするために汚損検出クローラーを構築することです。最後の例と同様に、最初にアクションディレクトリに新しいモジュールを追加する必要があります。
そして、run.jsの新しいアクションのためのフックを追加:
このコードが整ったので、次のコマンドを実行して、任意のページからリンクを抽出するためにクロールを実行できます。
$ <span>node run.js -x hello_world </span>
このアクションは、ページからデータを抽出することを示しており、Horsemanによって組み込まれたブラウザアクションを使用しません。 evaluate()メソッドに入れたJavaScriptを直接実行し、ブラウザ環境でネイティブに実行しているかのようにします。 このセクションでは、以前に言及した最後のことを1つに記録する必要があります。Emaluate()メソッドを使用してブラウザでカスタムJavaScriptを実行できるだけでなく、実行前にランタイム環境に外部スクリプトを挿入することもできます。あなたの評価ロジック。これは、そうすることができます:
program <span>.version('1.0.0') </span> <span>.option('-x --action-to-perform [string]', 'The type of action to perform.') </span> <span>.option('-u --url [string]', 'Optional URL used by certain actions') </span> <span>.parse(process.argv); </span>上記のロジックを拡張することにより、あらゆるWebサイトで実質的にすべてのアクションを実行できます。
騎手を使用してスクリーンショットを撮影します
<span>var performAction = require('./actions/' + program.actionToPerform) </span> <span>switch (program.actionToPerform) { </span> <span>case 'hello_world': </span> prompt<span>.get([{ </span> <span>// What the property name should be in the result object </span> <span>name: 'url', </span> <span>// The prompt message shown to the user </span> <span>description: 'Enter a URL', </span> <span>// Whether or not the user is required to enter a value </span> <span>required: true, </span> <span>// Validates the user input </span> <span>conform: function (value) { </span> <span>// In this case, the user must enter a valid URL </span> <span>return validUrl.isWebUri(value); </span> <span>} </span> <span>}], function (err<span>, result</span>) { </span> <span>// Perform some action following successful input </span> <span>performAction(phantomInstance, result.url); </span> <span>}); </span> <span>break; </span><span>} </span>私がデモをしたい最終的なユースケースは、騎手を使ってスクリーンショットを撮る方法です。これは、Screenshotを表すbase64エンコードされた文字列を返すHorsemanのScreenshotbase64()メソッドで行うことができます。
前の例と同様に、最初にアクションディレクトリに新しいモジュールを追加する必要があります。
そして、run.jsの新しいアクションのためのフックを追加:
<span>'use strict'; </span> <span>/** </span><span> * <span>@param Horseman phantomInstance </span></span><span> * <span>@param string url </span></span><span> */ </span>module<span>.exports = function (phantomInstance<span>, url</span>) { </span> <span>if (!url || typeof url !== 'string') { </span> <span>throw 'You must specify a url to ping'; </span> <span>} else { </span> <span>console.log('Pinging url: ', url); </span> <span>} </span> phantomInstance <span>.open(url) </span> <span>.status() </span> <span>.then(function (statusCode) { </span> <span>if (Number(statusCode) >= 400) { </span> <span>throw 'Page failed with status: ' + statusCode; </span> <span>} else { </span> <span>console.log('Hello world. Status code returned: ', statusCode); </span> <span>} </span> <span>}) </span> <span>.catch(function (err) { </span> <span>console.log('Error: ', err); </span> <span>}) </span> <span>// Always close the Horseman instance </span> <span>// Otherwise you might end up with orphaned phantom processes </span> <span>.close(); </span><span>}; </span>
次のコマンドでスクリーンショットを撮ることができます
プロジェクトの場合はどうであれ、目標を明確に定義し、可能な限り控えめにするようにしてください。可能な場合は許可を得て、できる限り最大限に礼儀正しく、サイトをDDOSにしないように注意してください。多くの自動化されたトラフィックを生成していると疑っている場合は、おそらく目標、実装、または許可レベルを再評価する必要があります。 ノードとPhantomjs HorsemanでのWebクロールに関するよくある質問(FAQ) WebクロールとWebスクレイピングの違いは何ですか?
WebクロールとWebスクレイピングは2つの異なるプロセスですが、それらはしばしば交換可能に使用されます。 Webクロールは、通常、ボットまたはクモによって実行されるWebを体系的に閲覧するプロセスです。 Webサイトのコンテンツのインデックスを作成し、他のWebページへのリンクに従うことが含まれます。一方、Webスクレイピングは、Webサイトから特定のデータを抽出するプロセスです。これには、必要なデータを引き出すために、WebページのHTMLを解析することが含まれます。 Webクローリングはナビゲートとインデックス作成に関するものですが、Webスクレイプはデータ抽出に関するものです。非同期性。これにより、同時処理が可能になります。つまり、複数のページを同時にクロールできます。これにより、同期して実行する他の言語よりも大幅に高速になります。さらに、Node.jsには、Phantomjs HorsemanなどのWebクロールを支援できる多数のライブラリとツールを備えた豊富なエコシステムがあります。 > Phantomjs Horsemanは、Phantomjsを使用してWebブラウザーを自動化するための高レベルAPIを提供するNode.jsパッケージです。リンクをクリックしたり、フォームに記入したり、スクリーンショットを撮影したりするなど、Webページでアクションを実行できます。これにより、Webクロールの強力なツールになります。これにより、人間のユーザーがそうであるようにWebページとやり取りできるようにするためです。Webクローリングで動的コンテンツを処理するにはどうすればよいですか? Webクローラーは、Webページの静的HTMLのみを解析します。ただし、Phantomjs Horsemanなどのツールを使用すると、JavaScriptをレンダリングして、人間のユーザーと同じように動的コンテンツと対話できます。これにより、コンテンツ生成のためにJavaScriptに大きく依存しているWebサイトからデータをクロールおよび抽出できます。
Web Crawlerがブロックされないようにするいくつかの戦略があります。 1つの方法は、Webサイトのrobots.txtファイルを尊重することです。これは、クロールが許可されているWebサイトのどの部分に関するガイドラインを提供します。別の方法は、サーバーの過負荷を避けるために、Webサイトにリクエストを送信するレートを制限することです。 IPアドレスとユーザーエージェントを回転させて、ボットとして検出されないようにすることもできます。
以上がノード、ファントミ、騎手でrawうウェブの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。