alsotang / node-lessons

:closed_book:《Node.js 包教不包会》 by alsotang
16.54k stars 4.7k forks source link

在学习爬虫课程时,针对自己的需求想请教几个问题。 #107

Open WriterLuo opened 8 years ago

WriterLuo commented 8 years ago

例如案例cnodejs.org中,首页他是会出现分页的,默认课程请求的是第一页中的list,如果我要一并请求第2页面,第3页,甚至所有分页。然后都push进items数组里呢?尝试用多个superagent.get('....')貌似会报错。 还有一个问题,例如http://www.abc.com。我要请求他的目录是动态,例如http://www.abc.com/123 http://www.abc.com/456 http://www.abc.com/789中的内容生成json格式,有什么好的方法吗?谢谢

niinaranpo commented 8 years ago

写的比较丑陋,思路是观察 cnodejs 的 url 格式,发现是用 url 参数确定第几个分页,那么就可以用一个循环来获取需要的分页。

var baseUrl = 'https://cnodejs.org/?tab=all&page=';
var pageNum = 1;
var maxPageNum = 5;
var items = [];

async.whilst(
  function () {
    return pageNum <= maxPageNum;
  },
  function (callback) {
    setTimeout(callback, 1000);
    superagent.get(baseUrl + pageNum)
    .end(function (err, sres) {
      if (err) {
        return next(err);
      }
      var $ = cheerio.load(sres.text);

      $('#topic_list .topic_title').each(function (idx, element) {
        var $element = $(element);
        items.push({
          title: $element.attr('title'),
          href: $element.attr('href')
        });
      });
      if (pageNum == maxPageNum){
       console.log(items); 
      }
      pageNum++;
    }); 
  },
  function (err,n) {
  }
)