首页 > 解决方案 > 无法使用回调获取结果

问题描述

我编写了一个脚本,node使用两个不同的函数getPosts()getContent()在其中提供回调,以便打印调用独立函数的结果getResult()。在我的脚本中定义的选择器是完美无缺的。

但是,当我执行我的脚本时,它什么也不打印。它也不会抛出任何错误。我试图模仿Neil这篇文章中提供的逻辑。

我怎样才能成功?

到目前为止,我已经写过:

var request = require('request');
var cheerio = require('cheerio');

const url = 'https://stackoverflow.com/questions/tagged/web-scraping';

function getPosts(callback){
  request(url, function (error,response, html) {
    if (!error && response.statusCode == 200){
      var $ = cheerio.load(html);
      $('.summary .question-hyperlink').each(function(){
        var items = $(this).text();
        var links = $(this).attr("href");
        callback(items,links);
      });
    }
  });
}

function getContent(item,link,callback){
  request(link, function (error,response, html) {
    if (!error && response.statusCode == 200){
      var $ = cheerio.load(html);
      var proLink = $('.user-details > a').eq(0).attr("href");
      callback({item,link,proLink});
    }
  });
}

function getResult() {
  getPosts(function(item,link) {
    getContent(item,link,function(output){
      console.log(output);
    });
  });
}

getResult();

标签: node.jsweb-scrapingrequestcheerio

解决方案


link您收到的值getPosts是一个相对链接,这意味着请求失败。您可以在其自己的变量中提取主机名,并从主机名 + 相对链接创建完整的 URL。

const host = 'https://stackoverflow.com';
const url = '/questions/tagged/web-scraping';

// ...

function getContent(item,link,callback){
  // Here we use the absolute URL
  request(host + link, function (error,response, html) {
    if (!error && response.statusCode == 200){
      var $ = cheerio.load(html);
      var proLink = $('.user-details > a').eq(0).attr("href");
      callback({item,link,proLink});
    }
  });
}

推荐阅读