[英]Node.js : scraping with Request and Cheerio issue
首先:我是Node的新手,也是一个相对编程的初学者。
我正在尝试使用Express创建一个小型Web应用程序,其唯一目的是从没有开放API的网站中获取数据并重新格式化数据。
为此,我决定学习刮板知识,这使我进入了Cheerio and Request。
我以reddit为例,继续学习。 此示例的最终目标是收集首页上帖子的名称和href以及指向评论的网址,然后在该页面上抓取评论数。
以下是在GET请求中调用到/的路由(请原谅变量名和comments / console.logs,我很沮丧):
/*
* GET home page.
*/
exports.index = function(req, res){
var request = require('request')
, cheerio =require('cheerio')
, mainArr = []
, test = "test"
, uI
, commentURL;
function first() {
request("http://www.reddit.com", function(err, resp, body) {
if (!err && resp.statusCode == 200) {
var $ = cheerio.load(body);
$('.thing', '#siteTable').each(function(){
var url = $('a.title', this).attr('href')
, title = $('a.title', this).html()
, commentsLink = $('a.comments', this).attr('href')
, arr = [];
arr.push(title);
arr.push(url);
arr.push(commentsLink);
mainArr.push(arr);
});
second();
};
});
}
function second() {
for (i = mainArr.length - 1; i >= 0; i--) {
uI = mainArr[i].length - 1;
commentURL = mainArr[i][uI];
console.log(commentURL + ", " + uI + ", " + i);
var foo = commentURL;
request(foo, function(err, resp, body) {
console.log("what the shit");
// var $ = cheerio.load(body);
// console.log(mainArr.length + ", " + commentURL + ", " + i + ", " + uI);
// var test = $('span.title', 'div.content').html();
console.log(test + ", "+ foo + ", " + commentURL + ", " + i + ", " + uI);
// mainArr[1][2] = test;
});
};
if (i<=0) {
res.render('index', {title: test});
};
}
first();
};
函数first(); 按预期工作。 它将标题,href和url放入数组中的注释,然后将该数组推入主数组中,该主数组包含首页上所有帖子的数据点。 然后调用函数second();
该函数的目标是循环遍历主数组(mainArr []),然后选择所有导致注释的url(mainArr [i] [uI]),并启动以该url为第一个参数的request()。
该循环有效,但是在second()函数内部第二次调用request()的过程中,所有操作都崩溃了。 我将变量i永久设置为-1,并将commentURL(设置为当前帖子评论URL的变量)永久定义为arrMain []中的第一个URL。 还有带有arrMain.length的怪异行为。 根据我放置它的位置,它告诉我arrMain是未定义的。
我感觉自己缺少一些明显的东西(可能与异步有关),但是对于我的一生,我找不到它。
如果有任何建议,我将非常感谢!
您的猜测是正确的,这是臭名昭著的“ Javascript循环陷阱”。 例如,请参见此处以获取说明:
除此之外,似乎只有调试打印会受到影响。 有关var test
的注释代码应该可以正常工作。
最后,这种语言在SO中不受欢迎,您最好花2分钟并在本文中更改变量名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.