6

私の質問は次のとおりです。この Web サイトhttp://vtis.vn/index.aspxからデータをスクレイピングする方法ですが、たとえば「Danh sách chậm」をクリックするまで、データは表示されません。「Danh sách chậm」をクリックすると、これはいくつかの JavaScript 関数をトリガーする onclick イベントです。js 関数の 1 つは、サーバーからデータを取得し、タグ/プレースホルダーに挿入することです。この時点で、firefox のようなものを使用してデータを調べることができます。そうです、データは Web ページのユーザー/閲覧者に表示されます。繰り返しになりますが、このデータをプログラムで破棄するにはどうすればよいでしょうか?

私はスクラップ関数を書きましたが、「Danh sách chậm」ボタンをクリックするまでデータが利用できないため、当然、必要なデータを取得できません。

<?php
$Page = file_get_contents('http://vtis.vn/index.aspx');
$dom_document = new DOMDocument();
$dom_document->loadHTML($Page);
$dom_xpath_admin = new DOMXpath($dom_document_admin);
$elements = $dom_xpath->query("*//td[@class='IconMenuColumn']");
foreach ($elements as $element) {
    $nodes = $element->childNodes;
    foreach ($nodes as $node) {
        echo mb_convert_encoding($node->c14n(), 'iso-8859-1', mb_detect_encoding($content, 'UTF-8', true));
    }
}
4

2 に答える 2

6

PhantomJSを確認する必要があります。

彼らのサイトから:

PhantomJSは、JavaScriptAPIを備えたヘッドレスWebKitです。DOM処理、CSSセレクター、JSON、Canvas、SVGなどのさまざまなWeb標準を高速かつネイティブにサポートしています。

APIを使用すると、「ブラウザ」をスクリプト化してそのページを操作し、必要なデータを取得できます。その後、必要なことは何でもできます。必要に応じてPHPスクリプトに渡すことも含まれます。


そうは言っても、可能であれば、データを「スクレイピング」しないようにしてください。ページが行っているajax呼び出しがある場合、代わりに使用できるAPIがあるのではないでしょうか。そうでない場合は、おそらくあなたは彼らにそれを作るように説得することができます。もちろん、これは画面のスクレイピングよりもはるかに簡単で保守しやすいでしょう。

于 2012-10-08T16:58:11.147 に答える
5

まず、 PhantomJSが必要です。Linux での推奨インストール方法:

wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
tar xvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin

次に、php-phantomjs パッケージが必要です。Composerがインストールされていると仮定します。

composer require jonnyw/php-phantomjs

または、こちらのインストール ドキュメントに従ってください。

3 番目に、パッケージをスクリプトにロードします。代わりにfile_get_contents、PhantomJS を介してページをロードします。

<?php
require ('vendor/autoload.php');

$client = Client::getInstance();
$client->getEngine()->setPath('/usr/local/bin/phantomjs');
$client = Client::getInstance();
$request  = $client->getMessageFactory()->createRequest();
$response = $client->getMessageFactory()->createResponse();

$request->setMethod('GET');
$request->setUrl('https://www.your_page_embeded_ajax_request');

$client->send($request, $response);

if($response->getStatus() === 200) {
    echo "Do something here";
}
于 2017-01-02T06:20:14.040 に答える