按脚本或其他方式下载文件

时间:2015-10-27 00:01:38

标签: javascript jquery html web-scraping

在一个网站,而不是我的网站,搜索结果

<a href="show?file=191719&token=r1j">
<a href="show?file=191720&token=gh5">
<a href="show?file=191721&token=98j">
.....
<a href="show?file=191733&token=ty0">

在我点击其中一个后,我转到一个页面,我填写表格,然后我去下载页面,然后点击链接:

<a href="download?file=191719&token=r1j">

我必须手动为150个文件做太长时间!

我想要的是使用脚本或其他东西,我通过获取结果页面中的文件ID直接下载所有文件并将其放入下载链接。

3 个答案:

答案 0 :(得分:1)

您可以使用excel生成链接,将其另存为txt文件并使用带-i参数的wget下载。

答案 1 :(得分:1)

使用此javascript片段,其中http://www.that-website.com/是该网站的网址,如果有太多,请不要一次性下载所有文件,每次下载几十个文件,指定开始和结束文件编号,< em>请注意,浏览器弹出窗口阻止程序会阻止此操作,因此您需要在浏览器的弹出窗口阻止程序中允许弹出此网页

<强> JS:

var fileNumber,
start = 191719,
finish = 191729;
for(fileNumber = start; fileNumber <= finish; ++fileNumber){
    window.open("http://www.that-website.com/download?file=" + fileNumber);
}

<强>更新 由于随机令牌在网址中实现,最简单的方法是在window.open()的多行中手动输入,如下所示:

window.open("http://www.that-website.com/download?file=191719&token=r1j");
window.open("http://www.that-website.com/download?file=191720&token=gh5");
window.open("http://www.that-website.com/download?file=191721&token=98j");

依旧几十个。

更新2: 请参阅此JSFiddle

中的示例
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
        <!-- COPY BUNCH OF THE URLs AND PASTE THEM IN HERE THEN RELOAD THE PAGE, THEN REPEAT OVER AND OVER UNTIL IT IS ALL DONE! -->
        <script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
        <script>
            $(document).ready(function(){
                $('a').each(function(){
                    var showLink = $(this).attr('href');
                    var downloadLink = showLink.replace("show?file", "download?file");
                    window.open("http://www.example.com/" + downloadLink);
                });
            });
        </script>
    </body>
</html>

使用上面的代码,这是一个HTML页面,在你的计算机上,将几个原始文件从该网站页面链接 - ,如:<a href="http://www.example.com/show?file=111&token=23f">TEST</a> 复制到您的本地页面并运行它,仍然是强烈建议您每次粘贴10-30个链接。

答案 2 :(得分:0)

您可以使用 XMLHttpRequest 并行下载文件作为blob,然后使用<a download>来启动下载行为。这会有相同的原则政策限制。

总体思路是

// fetch
var xhr = new XMLHttpRequest();
xhr.addEventListener('load', function () {
    var uri = URL.createObjectURL(this.response); // generate URI to access Blob
    // write, see below
});
xhr.open('GET', target_file_href);
xhr.responseType = 'blob'; // state we want the target as a blob/file
xhr.send(); // send the request
// ---------------

// write
var a = document.createElement('a');
a.href = uri;
a.setAttribute('download'); // make this a download link rather than a change page
document.body.appendChild(a);
a.click();
// cleanup a, uri

这是我在ES5中编写的并行文件下载器,它限制了并发下载的次数。

function ParallelDownloader(max_parallel, retry_on_error) {
    this.links = [];
    this.current = 0;
    this.max_parallel = max_parallel || 5;
    this.retry_on_error = !!retry_on_error;
}
ParallelDownloader.prototype = Object.create(null);
ParallelDownloader.prototype.add = function (url) {
    if ('splice' in url && 'length' in url)
        this.links.push.apply(this.links, url);
    else
        this.links.push(url);
    this.downloadNext();
};
ParallelDownloader.prototype.downloadNext = (function () {
    function load() {
        var a = document.createElement('a'),
            uri = URL.createObjectURL(this.response),
            cd = this.getResponseHeader('Content-Disposition'),
            filename = null;
        if (cd) {
            cd = cd.match(/;\s+filename=(.+)/);
            if (cd) filename = cd[1];
        }
        if (null === filename) {
            cd = this.__url.match(/\/([^/]+?(?=\?|$))/);
            if (cd) filename = cd[1];
        }
        if (null !== filename) a.setAttribute('download', filename);
        else a.setAttribute('download');
        a.setAttribute('href', uri);
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
        URL.revokeObjectURL(uri);
        --this.__parallelDownloader.current;
        this.__parallelDownloader.downloadNext();
    }
    function error() {
        --this.__parallelDownloader.current;
        if (this.__parallelDownloader.retry_on_error) {
            console.warn('Will retry', this.__url);
            this.__parallelDownloader.unshift(this.__url);
        }
        this.__parallelDownloader.downloadNext();
    }
    return function () {
        var url;
        ++this.current;
        if (this.current > this.max_parallel || this.links.length === 0) {
            --this.current;
            return;
        }
        url = this.links.shift();
        var xhr = new XMLHttpRequest();
        xhr.__parallelDownloader = this;
        xhr.__url = url;
        xhr.addEventListener('load', load);
        xhr.addEventListener('error', error);
        xhr.open('GET', url);
        xhr.responseType = 'blob';
        xhr.send();
        this.downloadNext();
    };
}());

要使用它,你会这样做,例如

var pd = new ParallelDownloader(10); // max 10 concurrent downloads
pd.add([
    '/path1.txt', '/path2.pub', '/path3.pdf'
]);
// or
pd.add('/path4.txt');
pd.add('/path5.txt');
// etc

一旦添加链接并且有一个空闲插槽,下载尝试就会立即启动。 (如果你启用retry_on_error我没有限制它,所以你可能会得到无限循环)