首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Nightmare下载文件

使用Nightmare下载文件
EN

Stack Overflow用户
提问于 2014-11-25 00:32:38
回答 4查看 7.8K关注 0票数 8

我正在使用Nightmare为今天的报纸创建一个自动下载程序。我设法登录并转到指定的页面。然而,我无法找到如何使用Nightmare下载文件。

代码语言:javascript
复制
var Nightmare = require('nightmare');
new Nightmare()
  .goto('https://login.nrc.nl/login?service=http://digitaleeditie.nrc.nl/welkom')
    .type('input[name="username"]', 'Username')
    .type('input[name="password"]','Password')
    .click('button[type="submit"]')
    .wait()
    .goto('http://digitaleeditie.nrc.nl/digitaleeditie/NH/2014/10/20141124___/downloads.html')
    .wait()
    .click('a[href="/digitaleeditie/helekrant/epub/nrc_20141124.epub"]')
    .wait()

    .url(function(url) {
        console.log(url)
    })
    .run(function (err, nightmare) {
      if (err) return console.log(err);
      console.log('Done!');
    });

我试图通过单击download按钮来下载文件。然而,这似乎不起作用。

EN

回答 4

Stack Overflow用户

发布于 2014-11-25 05:17:18

当你点击应该下载的东西时,PhantomJS (以及CasperJS和Nightmare)不会触发下载(对话框)。因此,有必要自己下载它。如果您可以找到文件的URL,那么就可以使用页面上下文中的XMLHttpRequest轻松地下载它。

所以你需要交换

代码语言:javascript
复制
.click('a[href="/digitaleeditie/helekrant/epub/nrc_20141124.epub"]')

代码语言:javascript
复制
.evaluate(function ev(){
    var el = document.querySelector("[href*='nrc_20141124.epub']");
    var xhr = new XMLHttpRequest();
    xhr.open("GET", el.href, false);
    xhr.overrideMimeType("text/plain; charset=x-user-defined");
    xhr.send();
    return xhr.responseText;
}, function cb(data){
    var fs = require("fs");
    fs.writeFileSync("book.epub", data, "binary");
})

您还可以使用较新的方式请求二进制数据。

代码语言:javascript
复制
.evaluate(function ev(){
    var el = document.querySelector("[href*='.pdf']");
    var xhr = new XMLHttpRequest();
    xhr.open("GET", el.href, false);
    xhr.responseType = "arraybuffer";
    xhr.send();

    var bytes = [];
    var array = new Uint8Array(xhr.response);
    for (var i = 0; i < array.length; i++) {
        bytes[i] = array[i];
    }
    return bytes;
}, function cb(data){
    var fs = require("fs");
    fs.writeFileSync("book.epub", new Buffer(data), "binary");
})

这两种方式都被描述为on MDNHere是一个示例脚本,它显示了概念证明。

票数 5
EN

Stack Overflow用户

发布于 2016-12-21 00:06:54

有一个Nightmare download plugin。只需使用以下代码即可下载该文件:

代码语言:javascript
复制
var Nightmare = require('nightmare');
require('nightmare-download-manager')(Nightmare);
var nightmare = Nightmare();
nightmare.on('download', function(state, downloadItem){
  if(state == 'started'){
    nightmare.emit('download', '/some/path/file.zip', downloadItem);
  }
});

nightmare
  .downloadManager()
  .goto('https://github.com/segmentio/nightmare')
  .click('a[href="/segmentio/nightmare/archive/master.zip"]')
  .waitDownloadsComplete()
  .then(() => {
    console.log('done');
  });

票数 3
EN

Stack Overflow用户

发布于 2016-09-09 13:26:50

正如here所描述的那样,我使用 module可以非常容易地获得我的下载。

代码语言:javascript
复制
var Nightmare = require('nightmare');
var fs = require('fs');
var request = require('request');

new Nightmare()
  .goto('https://login.nrc.nl/login?service=http://digitaleeditie.nrc.nl/welkom')
  .insert('input[name="username"]', 'Username')
  .insert('input[name="password"]','Password')
  .click('button[type="submit"]')
  .wait()
  .goto('http://digitaleeditie.nrc.nl/digitaleeditie/NH/2014/10/20141124___/downloads.html')
  .wait()
  .then(function () {
    download('http://digitaleeditie.nrc.nl/digitaleeditie/helekrant/epub/nrc_20141124.epub', 'myBook.epub', function () {
      console.log('done');
    });
  })
  .catch(function (err) {
    console.log(err);
  })

function download(uri, filename, callback) {
  request.head(uri, function () {
    request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
  });
}

要使用request,请运行npm i request

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27109563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档