admin管理员组文章数量:1244423
I am using Nightmare to create a automated downloader for today's newspaper. I managed to login and go the the specified page. However I could not find out how to download a file with Nightmare.
var Nightmare = require('nightmare');
new Nightmare()
.goto('://digitaleeditie.nrc.nl/welkom')
.type('input[name="username"]', 'Username')
.type('input[name="password"]','Password')
.click('button[type="submit"]')
.wait()
.goto('.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!');
});
I tried to download the file by clicking on the download button. However this seems not to work.
I am using Nightmare to create a automated downloader for today's newspaper. I managed to login and go the the specified page. However I could not find out how to download a file with Nightmare.
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!');
});
I tried to download the file by clicking on the download button. However this seems not to work.
Share Improve this question edited Nov 24, 2014 at 21:23 Artjom B. 61.9k25 gold badges134 silver badges229 bronze badges asked Nov 24, 2014 at 16:32 Fokke DekkerFokke Dekker 1261 silver badge6 bronze badges4 Answers
Reset to default 5PhantomJS (and CasperJS and Nightmare) don't trigger a download (dialog) when you click on something that should be downloaded. So, it is necessary to download it yourself. If you can find out the URL of the file, then it can be easily downloaded using an XMLHttpRequest from the page context.
So you need to exchange
.click('a[href="/digitaleeditie/helekrant/epub/nrc_20141124.epub"]')
for
.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");
})
You can also use the newer way of requesting binary data.
.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");
})
Both of the ways are described on MDN. Here is a sample script which shows a proof of concept.
There is a Nightmare download plugin. You can download the file just with this code below:
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./segmentio/nightmare')
.click('a[href="/segmentio/nightmare/archive/master.zip"]')
.waitDownloadsComplete()
.then(() => {
console.log('done');
});
I got my downloads super easy using the request
module, as described here.
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);
});
}
Run npm i request
in order to use request
.
Nightmare will download it properly if you click on the download link.
const Nightmare = require('nightmare');
const show = ( process.argv[2].includes("true") ) ? true : false;
const nightmare = Nightmare( { show: show } );
nightmare
.goto("https://github./segmentio/nightmare")
.click('a[href="/segmentio/nightmare/archive/master.zip"]')
.end(() => "Done!")
.then((value) => console.log(value));
本文标签: javascriptDownload a file using NightmareStack Overflow
版权声明:本文标题:javascript - Download a file using Nightmare - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1740140261a2230758.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论