繁体   English   中英

Node.js:抓取Request和Cheerio问题

[英]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循环陷阱”。 例如,请参见此处以获取说明:

JavaScript臭名昭著的循环问题?

除此之外,似乎只有调试打印会受到影响。 有关var test的注释代码应该可以正常工作。

最后,这种语言在SO中不受欢迎,您最好花2分钟并在本文中更改变量名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM