如何将此 PhantomJS 脚本更改为 NodeJS 以进行网络抓取

How can I change this PhantomJS script to NodeJS for web scraping

这是我用来在网页中抓取 HTML DOM 的 PhantomJS 脚本。用于等待所有 DOM ready

//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();
    });
});

我正在使用 "phantomjs scrap_phantom.js" 在 cmd 中对其进行测试。上面的代码将起作用。现在,我将此代码更改为 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);

我正在使用 "node scrap_node.js" 在 cmd 中对其进行测试。此代码对我不起作用。它加载了很长时间并且没有 return 任何错误。为什么它对我不起作用?

您的代码存在多个问题。

phantomjs-node 是 node.js 和 PhantomJS 之间的桥梁。它使用略有不同的语法,并且其函数的 none 是同步的。这意味着如果你在 PhantomJS 中写这个:

var result = page.evaluate(function(arg1, arg2){
    //...1
    return stuff;
}, "arg1", "arg2");
//...2

那么 phantomjs-node 中的等价物(见 Functionality Details)是这样的:

page.evaluate(function(arg1, arg2){
    //...1
    return stuff;
}, function(result){
    //...2
}, "arg1", "arg2");

它本质上是异步的。

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

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