Javascript 如何将PhantomJS脚本更改为NodeJS以进行web抓取

Javascript 如何将PhantomJS脚本更改为NodeJS以进行web抓取,javascript,node.js,phantomjs,Javascript,Node.js,Phantomjs,这是PhantomJS脚本,我用它在网页中抓取HTMLDOM。用于等待所有DOM就绪 //scrap_phantom.js var server = require("webserver").create(); var page = require("webpage").create(); var port = require('system').env.PORT || 3000; var url = "http://www.example.com"; server.listen(port,

这是PhantomJS脚本,我用它在网页中抓取HTMLDOM。用于等待所有DOM就绪

//scrap_phantom.js
var server = require("webserver").create();
var page = require("webpage").create();
var port = require('system').env.PORT || 3000;
var url = "http://www.example.com";

server.listen(port, function (request, response) {
    function onPageReady() {
        var htmlContent = page.evaluate(function () {  
            return document.documentElement.outerHTML;
        });
        response.write(htmlContent);
        response.close();
        phantom.exit();
    }
    page.open(url, function (status) {
        function checkReadyState() {
            setTimeout(function () {
                var readyState = page.evaluate(function () {
                    return document.readyState;
                });
                if ("complete" === readyState) {
                    onPageReady();
                } else {
                    checkReadyState();
                }
            });
        }
        checkReadyState();
    });
});
我正在cmd中用“phantomjs scrapt_phantom.js”测试它。上述代码将起作用。现在,我将此代码更改为NodeJS脚本,如下所示:

//scrap_node.js
var http = require("http");
var phantom = require('phantom');
var url = "http://www.example.com";

http.createServer(function(request, response) { 
    function onPageReady() {
        var htmlContent = page.evaluate(function () {  
            return document.documentElement.outerHTML;
        });
        response.write(htmlContent);
        response.close();
        phantom.exit();
    }

phantom.create(function (ph) {
    return ph.createPage(function (page) {
        page.open(url, function (status) {
            function checkReadyState() {
                setTimeout(function () {
                    var readyState = page.evaluate(function () {
                        return document.readyState;
                    });
                    if ("complete" === readyState) {
                        onPageReady();
                    } else {
                        checkReadyState();
                    }
                });
            }
            checkReadyState();
        });
    });
    }, {
        dnodeOpts: {weak: false}
    });
}).listen(3000);

我正在cmd中用“node scrapt_node.js”测试它。这个代码对我不起作用。它加载了很长时间,并且没有返回任何错误。为什么它对我不起作用?

您的代码存在多个问题

phantomjs节点是node.js和phantomjs之间的桥梁。它使用稍有不同的语法,并且没有一个函数是同步的。这意味着如果您在PhantomJS中编写此代码:

var result = page.evaluate(function(arg1, arg2){
    //...1
    return stuff;
}, "arg1", "arg2");
//...2
那么phantomjs节点(请参阅)中的等效项是:

它本质上是异步的

另一件事是
phantom
没有
exit
功能,但是
ph


此外,
setTimeout(function(){…})
没有做任何有用的事情。您需要传递一些超时值,它才会有用。

对于正在发生的事情,“此代码对我不起作用”不是一个合适的描述。你看到错误了吗?输出是什么?您希望发生什么?”“即“@ArtjomB”。它的负荷很长时间。。。没有任何错误返回。我看不出来。localhost:3000 show>>>上的浏览器无法加载网页,因为服务器未发送任何数据。谢谢你的帮助,我会查的
page.evaluate(function(arg1, arg2){
    //...1
    return stuff;
}, function(result){
    //...2
}, "arg1", "arg2");