Node.js noob。我正在使用node.io来抓取网站,但我很想在node.io中使用jquery。 node.io提供的$ object没有提供太大的灵活性。
var nodeio = require('node.io'), options = {timeout: 10},
jQuery = require('jquery');
exports.job = new nodeio.Job(options, {
input: ['hello', 'foobar', 'weather'],
run: function (keyword) {
this.getHtml('http://www.google.com/search?q=' + encodeURIComponent(keyword), function (err, $) {
// SOMEHOW CREATE THE JQUERY OBJECT USING $
var results = $('#resultStats').text.toLowerCase();
this.emit(keyword + ' has ' + results);
});
}
});
有人可以帮忙吗?
更新
我没有注意到node.io可以选择使用带有jsdom:true
选项的jquery。即使我使用此选项它也不起作用,我总是得到超时错误或$ $未定义错误。
答案 0 :(得分:2)
好的,找出问题所在。
node.io有一个使用jquery的选项,你需要传递这个选项jsdom:true
。我使用的node.io(0.3.0)版本中有一个错误,它总是返回超时。
// lib/node.io/dom.js
window.onload = function() {
callback.apply(self, [null, $, data, headers, response]);
}
现在这已在node.io版本0.3.1中修复
谢谢大家的回复!
答案 1 :(得分:1)
看一下jsdom - 一个模仿JS中DOM的模块,允许你使用为浏览器设计的任何JS库。
此博客文章介绍了如何将其与jQuery结合使用:http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs。
答案 2 :(得分:1)
你可能只是看看迈克尔使用蜘蛛---它开箱即用支持这个用例,并且是为了抓取而构建的。
https://github.com/mikeal/spider
示例:
var spider = require('../main');
spider()
.route('www.nytimes.com', '/pages/dining/index.html', function (window, $) {
$('a').spider();
})
.route('travel.nytimes.com', '*', function (window, $) {
$('a').spider();
if (this.fromCache) return;
var article = { title: $('nyt_headline').text(), articleBody: '', photos: [] }
article.body = ''
$('div.articleBody').each(function () {
article.body += this.outerHTML;
})
$('div#abColumn img').each(function () {
var p = $(this).attr('src');
if (p.indexOf('ADS') === -1) {
article.photos.push(p);
}
})
// console.log(article);
})
.route('dinersjournal.blogs.nytimes.com', '*', function (window, $) {
var article = {title: $('h1.entry-title').text()}
// console.log($('div.entry-content').html())
})
.get('http://www.nytimes.com/pages/dining/index.html')
.log('info')
;
另外,如果您对node.io有意图 - 我认为node.io将数据作为可选参数传递:
io.getHTML('someurl', function(err, junk, data){
jsdom.env({
html: data,
scripts : [
'http://code.jquery.com/jquery-1.5.min.js'
]
}, function(err, window) {
var $ = window.jQuery;
// use jquery here
});
});