phantomjs - 在页面加载后执行Javascript函数,然后输出新的更改

时间:2016-02-18 04:40:28

标签: javascript php web-scraping phantomjs casperjs

我使用phantomjs 2.1.1而且有些事情困扰着我。 这是我用来抓取网址的代码片段,网站的html被写入output.html文件

page = require('webpage').create();
    page.open(url, function (status) {
        if (status !== 'success') {
            console.log('Unable to load the address!');
            phantom.exit();
        } else {
            window.setTimeout(function () {
                var content = page.content;
                fs.write("output.html", content, 'w');
            }, 40000); //40 seconds timeout
        }
    });

现在,我也需要刮掉它的分页。接下来的页面由javascript函数页面加载(2);或第(3)页;我尝试使用

完成它
 var pageinationOutput = page.evaluate(function (s) {
    page(2);
 });
 console.log(pageinationOutput); // I need the output made by the  `page(2);` call.

        page = require('webpage').create();
            page.open(url, function (status) {
                if (status !== 'success') {
                    console.log('Unable to load the address!');
                    phantom.exit();
                } else {
                    window.setTimeout(function () {
                        var content = page.content;
                        fs.write("output.html", content, 'w');
                    }, 40000); //40 seconds timeout
                }
            });

但我没有得到任何输出。 如何在页面加载完成后执行JavaScript函数并获取javascript exec之后发生在网站内容上的新更改,在这种情况下,网站将调用下一页(使用ajax)在第(2)页之后;方法调用。

提前致谢!

2 个答案:

答案 0 :(得分:0)

我自己找到了解决方案,但我不确定这是否是完美的解决方法。

代码:

page.open(url, function (status) {
    if (status !== 'success') {
        console.log('Unable to load the address!');
        phantom.exit();
    } else {
        window.setTimeout(function () {
            var content = page.content;
            fs.write("output.html", content, 'w');
            page.evaluate(function (cb) {
                window.page(2);
            });
            var waiter = window.setInterval(function () {
                var nextPageContent = page.evaluate(function (cb) {
                    return document.documentElement.outerHTML;
                });
                if (nextPageContent !== false) {
                    window.clearInterval(waiter);
                    fs.write("output-2.html", content, 'w');
                }
            }, 40000);//40 seconds timeout  

        }, 40000);//40 seconds timeout  
    }
});

答案 1 :(得分:0)

我最近发布了一个项目,可以让PHP访问浏览器。在此处获取:https://github.com/merlinthemagic/MTS。它也是PhantomJS。

如果您提供了URL,我可以提供一个有效的示例。我需要知道你如何确定最后一页。在示例中,我只需将其设置为10。 我还需要知道页面按钮是否具有id属性,如果它们没有问题,我们会找到另一种触发它们的方法。但是对于这个例子我假设他们这样做并且简单地将id设为page_2,page_3 ....

下载并设置后,您只需使用以下代码:

$myUrl          = "http://www.example.com";
$windowObj      = \MTS\Factories::getDevices()->getLocalHost()->getBrowser('phantomjs')->getNewWindow($myUrl);

//now you can either retrieve the DOM for each page:
$doms = array();
//get the initial page DOM
$doms[]  = $windowObj->getDom();

$pageID   = "page_";
$lastPage = 10;
for ($i = 2; $i <= $lastPage; $i++) {
   $windowObj->mouseEventOnElement("[id=".$pageID. $i . "]", 'leftclick');
   $doms[]  = $windowObj->getDom();
}

//$doms now hold all the pages, so you can parse them.