最近在学习大牛alsotang的案例(https://github.com/alsotang/node-lessons/tree/master/lesson4) 运行第四课中的案例可以正常得到数据,另外我尝试了另外一个网站也没有问题。但是抓取网站kijiji(http://www.kijiji.ca/b-immobilier/ville-de-montreal/c34l1700281?ad=wanted) 信息时遇到了报错Cannot read property ‘parent’ of undefined 。关于这个页面抓取,我可以确定首页面链接抓取没问题,单独抓取每个子页面信息也没问题。请问有没有遇到过类似问题的同学可以指点一下。谢谢
报错信息: [ERROR] 18:07:23 TypeError TypeError: Cannot read property ‘parent’ of undefined at Function.exports.update (C:\Users\zhi_xie\nodejs\neomovie\node_modules\ch eerio\lib\parse.js:55:25) at module.exports (C:\Users\zhi_xie\nodejs\neomovie\node_modules\cheerio\lib \parse.js:17:11) at Function.exports.load (C:\Users\zhi_xie\nodejs\neomovie\node_modules\chee rio\lib\static.js:19:14) at C:\Users\zhi_xie\nodejs\neomovie\routes\crawlerusers.js:49:25 at Array.forEach (native) at C:\Users\zhi_xie\nodejs\neomovie\routes\crawlerusers.js:45:23 at all (C:\Users\zhi_xie\nodejs\neomovie\node_modules\eventproxy\lib\eventpr oxy.js:388:20) at EventProxy.trigger (C:\Users\zhi_xie\nodejs\neomovie\node_modules\eventpr oxy\lib\eventproxy.js:175:22) at C:\Users\zhi_xie\nodejs\neomovie\routes\crawlerusers.js:62:12 at Request.callback (C:\Users\zhi_xie\nodejs\neomovie\node_modules\superagen t\lib\node\index.js:746:30)
代码如下:
var User = require('../models/user');
exports.crawlerusers = function (req, res, next) {
var eventproxy = require('eventproxy');
var superagent = require('superagent');
var cheerio = require('cheerio');
// url 模块是 Node.js 标准库里面的
// http://nodejs.org/api/url.html
var url = require('url');
var kijijiUrl = 'http://www.kijiji.ca/b-immobilier/ville-de-montreal/c34l1700281?ad=wanted';
superagent.get(kijijiUrl).end(function (err, res) {
if (err) {
return console.error(err);
}
var topicUrls = [];
var $ = cheerio.load(res.text);
// 获取首页所有的链接-成功!
$('div.container-results').children('table').each(function (idx, element) {
var $element = $(element);
// $element.attr('href') 本来的样子是 /topic/542acd7d5d28233425538b04
// 我们用 url.resolve 来自动推断出完整 url,变成
// https://cnodejs.org/topic/542acd7d5d28233425538b04 的形式
// 具体请看 http://nodejs.org/api/url.html#url_url_resolve_from_to 的示例
var href = url.resolve(kijijiUrl, $element.attr('data-vip-url'));
topicUrls.push(href);
});
console.log(topicUrls);
// 得到一个 eventproxy 的实例
var ep = new eventproxy();
// 命令 ep 重复监听 topicUrls.length 次(在这里也就是 21 次) `topic_html` 事件再行动
ep.after('topic_html', topicUrls.length, function (topics) {
// topics 是个数组,包含了 21 次 ep.emit('topic_html', pair) 中的那 21 个 pair
// 开始行动
//如果用第三课的方法直接抓取每个子页面的titles,可以成功!
topics = topics.map(function (topicPair) {
var topicUrl = topicPair[0];
var topicHtml = topicPair[1];
var $ = cheerio.load(topicHtml);
return ({
titles: $('table.ad-attributes').find('tr').not('.divider').children('th').text().trim(),
});
});
console.log(topics[0]);
});
console.log("--------------------------------------------");
console.log("Totally fetched " + topicUrls.length + " Urls");
console.log("--------------------------------------------");
topicUrls.forEach(function (topicUrl) {
superagent.get(topicUrl).end(function (err, res) {
//console.log('fetch ' + topicUrl + ' successful');
ep.emit('topic_html', [topicUrl, res.text]);
});
});
});
};