2016-04-06 36 views
0

一部のWebページURIに対してHTML(つまり、ページのロードが完了したときに最初に表示されるもの)を取得しようとしています。静的なHTMLをチェックし、想定し、すべてのエラーを除くと、それは単一のコード行です:PHPのHTMLページのOnLoad HTML/DOMを取得する

function GetDisplayedHTML($uri) { 
    return file_get_contents($uri); 
} 

これは、静的なHTMLのために正常に動作し、そのページが静的ファイルの依存関係/参照を持っている場合は、簡単な解析により拡張が容易です。したがって、<script src="XXX">, <a href="XXX">, <img src="XXX">, and CSSのようなタグも検出でき、依存関係が問題であれば配列に返されます。

しかし、イベント/ AJAXを使用してHTMLが動的に作成されるウェブページはどうですか?たとえば、WebページのHTMLが、目に見えるWebページを構築する簡単なAJAXベースまたはOnLoadスクリプトであるとします。その後、解析だけでは機能しません。

私が必要とするのは、PHPの中から、HTTPレスポンス(すなわち、私たちが最初に取得するHTML)を、いくつかのjavascriptエンジンやブラウザを介してレンダリングし、一旦安定化すると、または静的なDOM?)が存在します。これはユーザーが実際に見ているものになります。

このようなWebページは絶えず変化する可能性があるので、「安定」(OnLoadまたはX秒後?)を定義する必要があります。また、タイマーや非同期のイベント状態(つまり、将来的にWebページの更新を引き起こす可能性のあるもの)をキャプチャする必要はありません。私は、その時点でユーザーが見ることができる静的な外観を表現するのに十分なDOMだけが必要です。

これをPHPでプログラムで実現するには、何が必要ですか?

+0

ページにプロキシし、JavaScriptを処理し、レンダリングされたhtmlを提供する事前レンダリングサービスがあります。 javascriptを多用するアプリを使用する多くの開発者は、これらのサービスを使用して、レンダリングされたコンテンツをGoogleやその他の検索エンジンに出力します。あなたはそのようなアプローチを取る必要があるように思えます。 https://github.com/prerender/prerender – skrilled

+0

私はサードパーティのオンラインサービスに頼りたくありません。しかし、プリレンダーは、多くのプラットフォームで動作する[PhantomJS](http://phantomjs.org)のシムであり、使用例があります。私はそれがPHPコード内から実行することができ、問題を解決する可能性があります推測?あなたはそう思いますか? – Stilez

答えて

1

JSでページをレンダリングするには、ブラウザを使用する必要があります。 PhantomJSはこのようなタスク用に作成されました。ファントムで実行する簡単なスクリプトは次のとおりです。

var webPage = require('webpage'); 
var page = webPage.create(); 
var system = require('system'); 
var args = system.args; 

if (args.length === 1) { 
    console.log('First argument must be page URL!'); 
} else { 
    page.open(args[1], function (status) { 
     window.setTimeout(function() { //Wait for scripts to run 
      var content = page.content; 
      console.log(content); 
      phantom.exit(); 
     }, 500); 
    }); 
} 

結果のHTMLがコンソール出力に返されます。

./phantomjs.exe render.js http://yandex.ru 

をそれとも、それを実行するためにPHPを使用することができます: あなたはこのように、コンソールから実行することができます

<?php 
$path = dirname(__FILE__); 
$html = shell_exec($path . DIRECTORY_SEPARATOR . 'phantomjs.exe render.js http://phantomjs.org/'); 

echo htmlspecialchars($html); 

私のPHPコードはPhantomJSの実行ファイルは、PHPスクリプトと同じディレクトリにあることを前提としています。

+0

非常に参考になりました、ありがとう!私はPHPから実行しているので、この例が役立ちます。ページの内容がダンプされ、PhantomJSがOnLoadイベントの実行後X秒後またはX秒後に終了することを前提としています(ページのロードとイベントコードにより、ダンプする必要があるときに明確ではない場合私はPhantomJSにそれを供給することができますが、それ以上のノウハウが必要です - そのビットの助けを借りていますか? – Stilez

+0

私はpage.openコールバックがonLoadイベントの後に実行されたと信じています。いくつかのタイムアウトを設定することによって、ページJSが実行されるのを待つことができます。私は500ミリ秒のタイムアウトで私の答えを更新しました。 –

+0

これは素晴らしいですよ、ありがとう!したがって、このコールバックには、ページの読み込みタイミングに「プラスビット」を含めることが含まれます。これはほぼ完璧です。私はそれを答えとしてマークしました。 1つの質問が簡単な場合 - ページがゲートウェイでブロックされているURL/IPから何かにアクセスしようとすると(最悪のトラッカースクリプトの一部がブロックされてマシンが遅くなる)、ウェブのタイムアウトまでonLoadは起動しません〜30秒)、遅くなります。ページの読み込みに関係なく、開始から5000ms以上待つことはできません。 – Stilez

関連する問題