【问题标题】:NodeJS multi site web scrapeNodeJS 多站点网页抓取
【发布时间】:2018-01-29 16:12:30
【问题描述】:

我正在学习 NodeJS,并试图从一个粉丝 wikia 中获取字符名称并将它们存储在 json 文件中。我有一个字符名称数组,我想遍历它们并从数组中的每个 url 中抓取每个字符名称。我遇到的问题是:

throw new Error('Can\'t set headers after they are sent.');

这是我目前的源代码:

var express = require('express');
var fs      = require('fs');
var request = require('request');
var cheerio = require('cheerio');
var app     = express();

app.get('/', function(req, res){

  var bosses = ["Boss1","Boss2"];
  for (boss in bosses) {



    url = 'http://wikiasiteexample.com/' + bosses[boss];

    request(url, function (error, response, html) {
      if (!error) {
        var $ = cheerio.load(html);
        var title;
        var json = { title: "" };

        $('.page-header__title').filter(function () {
          var data = $(this);
          title = data.text();
          json.title = title;
        })
      }


      fs.writeFile('output.json', JSON.stringify(json, null, 4),  {'flag':'a'},  function(err) {
        if (err) {
            return console.error(err);
        }
    });

      res.send('Check your console!')
    })
  }  
})


app.listen('8081')
console.log('Running on port 8081');
exports = module.exports = app;

【问题讨论】:

    标签: javascript json node.js


    【解决方案1】:

    对于您提出的每个请求,您都会致电 res.send()

    您的 HTTP 请求只能有一个响应,因此会报错。

    您必须只调用一次res.send()
    Promise(和Promise.all())会帮助你做到这一点。

    【讨论】:

    • 感谢您的反馈!我以前没有使用过承诺,将不得不对它们进行更多研究!我尝试将我的请求函数包装在一个 Promise 中,但还没有运气。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多