【问题标题】:Node.js: fs writestream stops writing to file when the file gets too bigNode.js:当文件变得太大时,fs writestream 停止写入文件
【发布时间】:2017-01-05 12:56:01
【问题描述】:

我正在抓取一个包含大量数据的网页,格式为 HTML 表格。您必须提交表单才能生成表格。我的节点脚本提交表单的所有排列,每次都会刮掉结果表,将每一行变成一行数据。

问题是,当我将数据写入某个文件时,当文件大小约为 10MB 时,它就会停止工作。有时会少一点;有时多一点。我试过将文件写成 .csv、.json 和 .txt,每次都出现同样的问题。

我正在使用fs 来执行此任务。相关代码为:

var fs = require("fs");
var stream = fs.createWriteStream("data.csv"); // can also be .json or .txt

stream.write(line_of_data);

我可以console.log(line_of_data) 并且它工作正常,一直到没有数据可供抓取。但在大约 10MB 时,输出文件将不再接受任何数据行。停止点似乎几乎完全是任意的——每次我运行脚本时,它都会在不同的点停止写入。我的硬盘驱动器上有足够的存储空间,所以问题一定与其他问题有关。

【问题讨论】:

标签: javascript node.js web-scraping screen-scraping


【解决方案1】:

我最终使用 MongoDB 来存储数据。要将 MongoDB 作为节点模块安装,请运行 npm install mongodb --save。相关的javascript是:

MongoClient = require("mongodb").MongoClient;
MongoClient.connect("mongodb://localhost:27017/database", function(err, db) {

  if (!err) {

    // set up mongodb collection
    db.createCollection("collection", function(err, collection) {}); 
    var collection = db.collection("collection");

    // after scraping data... 
    // insert a data object (line_of_code)
    collection.insert(line_of_data, {w: 1}, function(err, result) {
      if (err) console.log(err);
    });

  }

});

一些转换数据的命令:

  1. 导出为 CSV:mongoexport --db database --collection collection --out data.csv --type=csv --fields 'field1, field2, field3, etc.'
  2. 转换为 JSON:csvtojson data.csv > data.json(需要 csvtojson
  3. 验证 JSON:jsonlint data.json(需要 jsonlint

【讨论】:

    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2018-07-04
    • 2019-07-22
    • 2017-12-20
    • 2021-08-18
    • 2018-07-02
    相关资源
    最近更新 更多