Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用PhantomJS下载csv文件_Javascript_Http_Download_Phantomjs - Fatal编程技术网

Javascript 如何使用PhantomJS下载csv文件

Javascript 如何使用PhantomJS下载csv文件,javascript,http,download,phantomjs,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-T

当我使用普通浏览器(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
现在,我想用PhantomJS下载并解析这个文件。我设置了
页面
onResourceReceived
侦听器,以查看Phantom是否会接收/下载该文件

clientRequests.phantomPage.onResourceReceived = function(response) {
    console.log('Response (#' + response.id + ', stage "' + response.stage + '"): ' + JSON.stringify(response));
};
当我发出幻影请求下载文件时(这是page.open(“文件的URL”),我可以在幻影日志中看到该文件已下载。以下是日志:

"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"

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

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

  • 在evaluate函数中,您可以调用AJAX来下载文件并对其进行编码,然后您可以将这些内容返回到phantom脚本
  • 您可以使用一些GitHub页面上提供的自定义幻影库
如果您需要使用PhantomJS下载文件,然后逃离PhantomJS并使用CasperJS。CasperJS基于PhantomJS,但它有更好、更直观的语法和程序流

这是一篇很好的解释“的帖子。在这篇文章中,你可以找到关于文件下载的部分

如何使用CasperJS下载CSV文件(即使服务器发送头
内容处置:附件;filename='file.CSV
,此功能也有效)

在这里,您可以找到一些可供下载的自定义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();
上面的代码将下载
http://captaincoffee.com.au/dump/csv.csv
CSV文件,并将结果打印为base64字符串。这样,您甚至不必将数据下载到文件中,而是将数据作为base64字符串


如果您明确希望将文件下载到文件系统,可以使用CasperJS中提供的
下载
功能。

我找到了PhantomJS的解决方案。通过阅读本文,我发现了一个通过jQuery的ajax方法下载url并将文件编码为base64的方法

我想下载的文件是纯文本(CSV),所以我删除了编码函数。我的目标页面也已经包含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);

前两个答案假设您可以提前知道最终CSV文件的URL。如果链接指向一个HTML页面,该页面执行Javascript计算重定向到该文件,并且您不想在PhantomJS之外对该Javascript进行求值,那么情况就不会是这样了。你的选择是:

  • 将PhantomJS放在上游代理之后,并使用所述上游代理截取下载URL(及其预期的Cookie和Referer头)-但是如果页面也生成二进制XMLHttpRequests,则必须小心确定真实的下载URL,而不是一些随机数据“blob”
  • 与PhantomJS不同,使用Headless Chrome可以自动保存下载的文件(或者使用PyVirtualDisplay的Firefox,也可以设置为保存文件,或者等待Headless Firefox),并监视下载目录,但您必须能够自己确定下载何时完成(或者使用上游代理监控其完成情况,但Headless Chrome/Firefox当前无法设置为忽略SSL证书,这意味着如果站点变得“安全”监视Headless Chrome/Firefox的请求比监视PhantomJS的请求要困难得多,至少在修复之前是这样;您可以监视CONNECT请求,但如果它保持活动状态,您将无法确定传输是否已完成)
  • 将PhantomJS置于上游代理之后,该代理将所有未知内容类型更改为
    text/plain
    ,并删除
    content-Disposition
    标题,这样您就可以以正常方式从PhantomJS读取文件,该方式适用于CSV文件,但不适用于包含0字节的二进制文件

  • 第一个选项(PhantomJS+上游代理)如果上游代理可以监视PhantomJS发送到远程站点的
    Accept
    头,则会变得更容易。至少在PhantomJS版本2.1.1中,主要请求有
    Accept:text/html、application/xhtml+xml、application/xml;q=0.9、*/*;q=0.8
    、样式表请求有
    Accept:text/css、*/*;q=0.1
    ,以及所有其他请求sts(图像、脚本、XMLHttpRequest)默认为
    Accept://*
    ,尽管这可以被使用
    XMLHttpRequest.setRequestHeader()的站点覆盖
    。因此,如果上游代理看到一个包含
    text/html
    Accept
    头的请求,并将该请求传递给服务器,结果会生成一个CSV文件或其他非html文档,那么很有可能保存该文件。

    如果我告诉我的同事对我的每一天进行更新投票,Wtf man可能会重复在这几年里,我在StackOverflow和其他网络上的得分将超过600分。当我在一个小时内看到3次投票时,我也很惊讶,但这并不坏。如果你调查这个问题,太多的人都在面对同一个问题,我想看看是否有人找到了一个好的解决方案。在写下我的评论后,我已经看了您发布了历史记录,发现这里不太可能存在投票欺诈。不过,我仍然觉得奇怪,您在不到10分钟的时间内,在[phantomjs]和[casperjs]这样的低票数标签中获得了3张高票。可能是因为[http],但不知怎的,我对此表示怀疑。关于副本,我抓住了wron