我们如何使用nodejs,cheerio和recursion抓取多个网页,每个页面包含分页

时间:2018-10-19 15:15:44

标签: javascript node.js

我正在尝试抓取一个与诗歌和诗人信息有关的网站,并希望获得所有诗人的名单以及与每个诗人有关的所有诗题。 我已经成功使用诺言和递归方法成功获取了数组中每个诗人的所有诗人和诗的网址。

    app.get('/poetScrape', function (req, res) {
    doScraping(startUrl);
    res.send('You shoul`enter code here`d check your console');
    });

    var doScraping = function (url) {
        getAllPoets(url).then(function (value) {
          if (value) {
            doScraping(commonUrl + value);
          }
        });
     }

     var getAllPoets = function (url) {
        var poet;
        var poetUrl;
        return new Promise(function (resolve, reject) {
           request(url, function (error, response, htmlSource) {
           var $ = cheerio.load(htmlSource);
           $('ol.poets-grid li').each(function (i, el) {

            var poetName = $('a.name', el).text();
            var noOfPoems = $('div.info', el).text();
            var imgSource = $('a.photo img').attr('src');
            var poetUrl = $('a.photo', el).attr('href');
            poet = new Poet(poetName, imgSource, noOfPoems, poetUrl);
            data.push(poet); //Data contains all poets.
           });
           //Pagination
           var nextUrl = $('div.pagination ul li.next a').attr('href');
           resolve(nextUrl);
          });
       });
    }

我无法为每位诗人获取诗歌,因为这种承诺的事情变得太复杂而难以处理,因为首先我必须遍历“数据”数组,并且对于每个URL(如startUrl),我必须编写代码以获取该页面上的标题以及从该页面开始的标题都遵循分页链接,而下一页的标题则与诗人一样。对于诗歌,我写了以下代码:

     app.get('/poems', function (req, res) {
     res.json(data);
     var allPromises = poemScraping();
     Promise.all(allPromises).then(
       function(result){
         console.log("Promise.all ",result);
      });    
    });

    var poemScraping = function(){
      var allPromises = [];
      data.forEach(function(element){
      var startLink = commonPoemUrl + element.poetUrl + 'poems/page-1/? 
                               a=a&l=3&y=';
      var promise = getPromise(startLink,element);
      promise.then(function(prom){
        allPromises.push(prom);
        return allPromises;
      })

    });


    var getPromise = function(url,poet){

      var myPromise = new Promise(function(resolve,reject){
         var result = allPoemsOfPoet(url,poet);
         resolve (result);      
         }).then(function(value){
         console.log("MyPromise",value);
        return value;
     });
     return myPromise;
     }

     var allPoemsOfPoet = function(url,poet){
        axios.get(url).then(function(value){
          parseData(value,poet).then(function(value){
          console.log("Value",value);
          return value;
          });
        });
     } 

现在我没有得到预期的结果。我无法理解这里发生的许多异步事件。 任何人都可以帮助我弄清楚如何提取这首诗,如果有人在nodejs中的Promises上澄清我,我将不胜感激。

0 个答案:

没有答案