javascript - NodeJS 多站点网络抓取

标签 javascript json node.js

我正在学习 NodeJS 并尝试抓取粉丝 wikia 以获取 Angular 色名称并将它们存储在 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;

最佳答案

您为您发出的每个请求调用 res.send()

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

您必须恰好调用一次res.send()
Promises(和 Promise.all())将帮助您做到这一点。

关于javascript - NodeJS 多站点网络抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48505533/

相关文章:

c# - 将嵌套的 JSON 反序列化为字典、字符串和类

java - Jersey JSON 响应作为 HttpUrlConnector 而不是 JSON

javascript - 如何动态地将 lodash 对象(过滤器对象)转换为 jquery 的 ListView

node.js - 如何使用 `yarn` 覆盖嵌套依赖项?

javascript - 使用 JSON select 查询 JSON 对象

javascript - 访问谷歌分析管理 API

javascript - WebGL2 : incomplete framebuffer

mongodb - 更新 MongoDB 中的嵌入式文档

node.js - REST API 和移动应用的身份验证策略

javascript - 渲染文本输入后使用 useState Hook 更新对象