如何使用PhantomJS下载csv文件

MrD*_*MrD 17 javascript http download phantomjs

当我使用普通浏览器(Chrome)浏览网站A时,当我点击网站A上的链接时,Chrome会以CSV文件的形式下载报告.

当我检查服务器响应头时,我得到以下结果:

Cache-Control:private,max-age=31536000
Connection:Keep-Alive
Content-Disposition:attachment; filename="report.csv"
Content-Encoding:gzip
Content-Language:de-DE
Content-Type:text/csv; charset=UTF-8
Date:Wed, 22 Jul 2015 12:44:30 GMT
Expires:Thu, 21 Jul 2016 12:44:30 GMT
Keep-Alive:timeout=15, max=75
Pragma:cache
Server:Apache
Transfer-Encoding:chunked
Vary:Accept-Encoding
Run Code Online (Sandbox Code Playgroud)

现在,我想使用PhantomJS下载并解析此文件.我设置了page onResourceReceived监听器,看看Phantom是否会接收/下载该文件.

clientRequests.phantomPage.onResourceReceived = function(response) {
    console.log('Response (#' + response.id + ', stage "' + response.stage + '"): ' + JSON.stringify(response));
};
Run Code Online (Sandbox Code Playgroud)

当我发出Phantom请求下载文件时(这是page.open('文件的URL')),我可以在Phantom日志中看到该文件已下载.这是日志:

"contentType": "text/csv; charset=UTF-8",
    "headers": {
        "name": "Date",
        "value": "Wed, 22 Jul 2015 12:57:41 GMT"
    },
    "name": "Content-Disposition",
    "value": "attachment; filename=\"report.csv\"",
    "status":200,"statusText":"OK"
Run Code Online (Sandbox Code Playgroud)

我收到了文件及其内容,但是如何访问文件数据?当我打印当前的PhantomJS page对象时,我得到了页面A的HTML而我不希望这样,我想要CSV文件,我需要使用JavaScript解析它.

Mat*_*ock 12

我找到了PhantomJS的解决方案.通过这个讨论,我发现了一个jsfiddle,它通过jQuery的ajax方法下载一个url,并将该文件编码为base64.

我想下载的文件是纯文本(CSV),所以我删除了编码功能.我的目标页面也已包含jQuery,因此我不需要将jQuery注入目标页面.

我的代码假设您已经使用PhantomJS打开了要下载文件的页面,并且该页面中包含jQuery.在我的情况下,我必须首先登录该网站,以获得下载链接.

var fs = require('fs');

var page=this;

var result = page.evaluate(function() {

    var out;
    $.ajax({
        'async' : false,
        'url' : 'fullurltodownload.csv',
        'success' : function(data, status, xhr) {
            out = data;
        }
    });
    return out;

});

fs.write('mydownloadedfile.csv', result);
Run Code Online (Sandbox Code Playgroud)

  • Ajax不支持cookie,因此该解决方案不适用于cookie检查服务器端脚本.伤心:d (3认同)

MrD*_*MrD 8

经过几天的调查,我不得不说有一些解决方案:

  • 在您的evaluate函数中,您可以进行AJAX调用以下载和编码您的文件,然后您可以将此内容返回到幻像脚本
  • 您可以在某些GitHub页面上使用一些自定义Phantom库

如果您需要使用PhanotmJS下载文件,那么请远离PhantomJS并使用CasperJS.CasperJS基于PhantomJS,但它具有更好,更直观的语法和程序流程.

这里有一篇很好的文章解释" 为什么CasperJS比PhantomJS更好 ".在这篇文章中,您可以找到有关文件下载的部分.

如何使用CasperJS下载CSV文件(即使在服务器发送标题时也能正常工作Content-Disposition:attachment; filename='file.csv)

在这里您可以找到一些可供下载的自定义csv文件:http://captaincoffee.com.au/dump/items.csv

要使用CasperJS下载此文件,请执行以下代码:

var casper = require('casper').create();

casper.start("http://captaincoffee.com.au/dump/", function() {
    this.echo(this.getTitle())
});
casper.then(function(){
    var url = 'http://captaincoffee.com.au/dump/csv.csv';
    require('utils').dump(this.base64encode(url, 'get'));
});

casper.run();
Run Code Online (Sandbox Code Playgroud)

上面的代码将下载http://captaincoffee.com.au/dump/csv.csvCSV文件,并将结果打印为base64字符串.所以这样,您甚至不必将数据下载到文件,您将数据作为base64字符串.

如果您明确要将文件下载到文件系统,则可以使用downloadCasperJS中提供的功能.