抓取javascript生成的网页数据

Dun*_*ung 5 javascript php html-parser

我的问题是:如何从这个网站获取数据http://vtis.vn/index.aspx但是直到你点击"Danhsáchchậm"之后才会显示数据.我非常努力和仔细地尝试,当你点击"Danhsáchchậm"这是触发一些javascript函数的onclick事件时,其中一个js函数是从服务器获取数据并将其插入到标记/占位符中这一点你可以使用像firefox这样的东西来检查数据,是的,数据会显示给网页上的用户/查看者.那么,我们又如何以编程方式废弃这些数据呢?

我写了一个报废功能,但当然它没有得到我想要的数据,因为直到我点击按钮"Danhsáchchậ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)));
                               }
                          }
                         }
Run Code Online (Sandbox Code Playgroud)

谢谢你,StackOverflow是一个很棒的地方.D.

Cha*_*had 6

你需要看看PhantomJS.

从他们的网站:

PhantomJS是一个带有JavaScript API的无头WebKit.它具有对各种Web标准的快速和本机支持:DOM处理,CSS选择器,JSON,Canvas和SVG.

使用API​​,您可以编写"浏览器"脚本以与该页面进行交互并获取所需的数据.然后你可以随心所欲地做任何事情; 包括在必要时将其传递给PHP脚本.


话虽这么说,如果可能的话尽量不要"刮"数据.如果页面正在进行ajax调用,那么可能有一个API可以使用吗?如果没有,也许你可以说服他们做一个.这当然比屏幕抓取更容易,更易于维护.


Dyl*_*n B 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
Run Code Online (Sandbox Code Playgroud)

其次,您需要php-phantomjs 包。假设您已经安装Composer

composer require jonnyw/php-phantomjs
Run Code Online (Sandbox Code Playgroud)

或者按照此处的安装文档进行操作

第三,将包加载到您的脚本中,而不是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";
}
Run Code Online (Sandbox Code Playgroud)