抓取javascript生成的网页数据

时间:2012-09-27 22:21:52

标签: 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)));
                               }
                          }
                         }

谢天谢地,StackOverflow是一个很棒的地方。 d。

2 个答案:

答案 0 :(得分:6)

您需要查看PhantomJS

从他们的网站:

  

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

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


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

答案 1 :(得分:3)

首先,你需要PhantomJS:

其次,你需要PHP phantomjs:

  1. 安装composer(如果您的服务器上不存在)
  2. 安装包(PHP phantomjs),你可能会看看这个 导:
  3. https://github.com/jonnnnyw/php-phantomjs http://jonnnnyw.github.io/php-phantomjs/4.0/2-installation/

    第三步,将包加载到您的脚本: 要求(&#39; vendor / autoload.php&#39;);

    最后,您将通过phantomjs

    加载页面而不是file_get_content
    $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";
        }