gpt4 book ai didi

javascript - 如何使用 NightmareJs 串行下载多个文件?

转载 作者:行者123 更新时间:2023-12-02 13:44:26 32 4
gpt4 key购买 nike

我对 NodeJs 和 NightmareJs 非常陌生。我需要使用 nightmare-inline-download 从同一页面下载多个文件插入。到目前为止,我下面的代码可以下载第一个文件。但我不知道如何下载链接到该页面的所有文件,即如何循环 click(selector).download()以正确的方式。此外,我将如何利用循环下载来获取所有下载的文件名?

注意 HTML <a>我需要点击的标签:<a target="_blank" class="download-link">Download</a> 。没有href属性;单击标签会触发开始下载的脚本。

该网站一次只允许开始一次下载。

这是我到目前为止的代码:

var Nightmare = require('nightmare');
require('nightmare-inline-download')(Nightmare);
var nightmare = Nightmare({ show: false });
nightmare
.goto(pageUrl)
.evaluate({
var links = document.querySelectorAll('.download-link');
for(var i = 0, i < links.length; i++) {
links[i].setAttribute('download-this', 'true');
}
})
.click('[download-this="true"]') // will select just the first element
.download()
.end()
.then(() => {
console.log('done');
});

最佳答案

回答我自己的问题。看完之后 this , thisthis几次,我想出了如何组合选择器和 promise 来循环 click().download()。关键是为evaluate() 中的每个下载链接赋予其自己的唯一ID,然后返回一个ID 数组。之后.then可以将数组简化为 Promise 列表,其中每个 Promise 都会点击并下载由唯一 id 选择的元素。最后的 .then 开始下载。代码变为:

var Nightmare = require('nightmare');
require('nightmare-inline-download')(Nightmare);
var nightmare = Nightmare({ show: false });
nightmare
.goto(pageUrl)
.evaluate({
var links = document.querySelectorAll('.download-link');
var ids = [];
for(var i = 0, i < links.length; i++) {
links[i].setAttribute('download-this', i);
ids.push(i);
}
return ids
})
.then(function (ids) {
return ids.reduce(function (accumulator, id) {
return accumulator.then(function (results) {
nightmare
.click('[download-this=["' + id + '"]')
.download();
results.push(id);
return results; // ids of downloaded files
})
}, Promise.resolve([]))
})
.then(function (results) {
console.log('results', results);
return nightmare.end()
})
.catch(function (error) {
console.error('Error:', error);
return nightmare.end()
});

现在,如果我需要打印有关每次下载的信息,我不会返回下载的文件 ID,而是在 download() 之后添加 .then 以返回信息关于已完成的下载。我从这个test script中获取了这段代码,回想起来,它与我在这个答案中呈现的脚本类似!于是,相关代码就这样改了,来自

    nightmare
.click('[download-this=["' + id + '"]')
.download();
results.push(id);
return results; // ids of downloaded files

    return nightmare
.click('[download-this=["' + id + '"]')
.download()
.then(info => {
results.push(info);
return results; // info about downloaded files
});
<小时/>

关于javascript - 如何使用 NightmareJs 串行下载多个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41522361/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com