使用npm抓取工具抓取链接时,出现错误:
C:\Users\ryani\Desktop\JavaScript\crawler\crawler.js:15
$('a').each(function(index, value) {
^
TypeError: Cannot read property 'each' of undefined
我已经尝试过设置超时和各种调试技术......我不确定为什么它会变得不确定;当我将代码放在html页面上的标签中时,它可以正常工作。
crawler.js:
var Crawler = require("crawler");
var c = new Crawler({
"maxConnections":10,
"callback":function(error, res, $) {
if (error) {
console.log("error");
console.log(error);
} else {
$('a').each(function(index, value) {
console.log($(this).attr('href'));
//c.queue(href)
});
}
}
});
c.queue('http://www.google.com');
答案 0 :(得分:2)
问题是你没有初始化Cheerio(var $ = res。$;)。
试试这个,从提供的网址中提取所有喜欢的内容...
var Crawler = require("crawler");
var c = new Crawler({
maxConnections: 10,
// This will be called for each crawled page
callback: function(error, res, done) {
if (error) {
console.log(error);
} else {
var $ = res.$;
var links = [];
$('a').each(function(i, elem) {
links[i] = $(this).attr('href');
});
// $ is Cheerio by default
//a lean implementation of core jQuery designed specifically for the server
console.log(links);
}
done();
}
});
c.queue('http://www.google.com');
答案 1 :(得分:2)
我之前从未使用过Crawler
节点模块,但查看了here找到的用法示例。
回调函数的3个参数是;
$
是其属性中的一个通过将代码编写为callback :function(error, res, $) {
,$
变量位于参数的第3位,因此基本上它被用来表示done
函数。现在你说done
。$
这是不正确的,因为函数对象没有那个属性,因而错误。
也就是说,您的代码应该类似于:
res.$('a').each(function(i, elem) {
links[i] = $(this).attr('href');
});
此外,您需要调用done
参数,否则进程将卡在那里。例如$()
。但是我建议你按照他们的代码示例,因为$
不是一个好的变量名。建议将第三个变量$
重命名为done
。