如何将此 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(){...})
没有做任何有用的事情。您需要传递一些超时值才能使用它。
这是我用来在网页中抓取 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(){...})
没有做任何有用的事情。您需要传递一些超时值才能使用它。