expressjs与phantom联合使用报错,求解
发布于 12 年前 作者 mz121star 5304 次浏览 最后一次编辑是 9 年前

首先在此强调一下,我不想用phantomjs-node 这种node包,这种包我也试了,也有很多问题。我是按照如下方式实现的

我想用nodejs实现一个抓取网页的功能,抓取网页我用phantomjs,然后我用node去执行phantomjs的代码,

现在phantomjs抓取网页的代码如下。 #

 var page = require('webpage').create(),
 system = require('system'),
 t, address;
 if (system.args.length === 1) {
 phantom.exit(1);
 } 
 else {
 t = Date.now();
 address = system.args[1];
 page.open(address, function (status) {
 if (status !== 'success') {
 /*console.log('FAIL to load the address');*/
 } else {
 t = Date.now() - t;
 console.log(/*'Page title is ' +*/ page.evaluate(function () {
 var head = document.getElementsByTagName("head")[0]
 var basee = document.createElement("base")
 basee.href = document.location.origin
 head.insertBefore(basee, head.firstChild);
 return document.head.innerHTML + document.body.innerHTML;
 }));
 /*console.log('Loading time ' + t + ' msec');*/
 }
 phantom.exit();
 });
}

在nodejs中,我用child_process去执行,代码如下

 var child_process = require('child_process');
 var events = require('events');
 exports.GetPageVisual = function (url, callback) {
var emitter = new events.EventEmitter();
setTimeout(function () {
 child = child_process.spawn('phantomjs', ['getPage.js', url]);
 child.stdout.setEncoding('utf8');
 child.stdout.on("data", function (data) {
 emitter.emit("success", data);
 });
 child.stderr.on('data', function (data) {
 emitter.emit("error", data);
 });
 child.on('exit', function (code, signal) {
 emitter.emit("exit", code);
 });
}, 100)
return emitter;

}

我用如下测试代码,去抓取网页,可以正常使用

 var _util=require("./util");

_util.GetPageVisual("http://blog.miaozhuang.net").on("success",function(d){ console.log(d); }) .on("error", function (err) { console.log(err);

})
.on("exit",function(d){
 console.log('子进程已退出,代码:' + d);
})

但是我把这段代码放到expressjs的请求中时候,却会报错,代码执行了error中的函数

err返回值为:<Buffer 43 61 6e 27 74 20 6f 70 65 6e 20 27 67 65 74 50 61 67 65 2e 6a 73 27 0d 0a>

子进程已退出,代码:-1

求解!!!!!!!!!!!!!!!!!!!!!!!!

 exports.getPage = function (req, res) {
 params.page=req.params.url
_util.GetPageVisual(params.page)
 .on("success", function (d) {
 res.send(d);
 })
 .on("error", function (err) {
 console.log("error":err);
 })
 .on("exit",function(d){
 console.log('子进程已退出,代码:' + d);
 })
/*getPage(params.page).on("success", function (d) {
 res.send(d);
 })
 */

};

1 回复

phantomjs 工程下有 rasterize.js 这个文件, 直接使用这里面的代码吧 还有就是child.stdout.setEncoding(‘utf8’); 不知道有没有什么问题

回到顶部

AltStyle によって変換されたページ (->オリジナル) /