如何使用PhantomJS下载csv文件如何使用PhantomJS下载csv文件(How to do

2019-05-12 02:07发布

当我使用的是正常的浏览器(Chrome),当我点击本网站上的链接浏览网站A,铬imediatelly下载的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解析这个文件。 我设置page onResourceReceived监听,看是否幻影将接收/下载文件。

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 page对象,我得到的页面A的HTML,我不希望出现这种情况,我想CSV文件,我需要使用JavaScript解析。

Answer 1:

我发现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);


Answer 2:

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

  • 在你的评价功能,可以使AJAX调用下载和编码您的文件,那么你就可以回来返回此内容幻像脚本
  • 你可以使用一些定制的幻影可用库上的一些网页的GitHub

如果你需要使用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();

上面的代码会下载http://captaincoffee.com.au/dump/csv.csv CSV文件,将打印结果为base64字符串。 于是就这样,你甚至不必将数据下载到文件,你有你的数据为base64字符串。

如果你明确要下载文件到文件系统,可以使用download功能,该功能可在CasperJS。



Answer 3:

前2个回答假设你可以预先知道最终的CSV文件的URL。 如果该链接进入一个HTML页面,做一个Javascript计算的重定向到文件,你不想来评价PhantomJS的之外的JavaScript代码将不会是这样。 您的选项则是:

  1. 把PhantomJS背后上游代理服务器,并使用上述上游代理拦截下载URL(及其预期Cookie和参考标头) - 但你必须要小心地识别真正的下载网址,而不是一些随机数据“斑点”如果页面使得二进制XMLHttpRequest的为好;
  2. 而不是PhantomJS使用无头浏览器,可以自动保存下载文件(或火狐PyVirtualDisplay,也可设置为做到这一点,或等待无头火狐)和监控下载目录,但你必须要能够找出自己当下载完成(或使用上游代理来监控它完成,但无头的Chrome / Firefox中,目前无法设置为忽略SSL证书,这意味着,如果该网站进入“安全”它更难以监控的要求无头的Chrome / Firefox浏览器比它要监控PhantomJS,至少到的请求铬问题721739是固定的,你可以看一个连接请求,但如果它更让你将无法知道肯定是转移已经完成的方式) ;
  3. 把PhantomJS背后,改变所有未知的内容类型到上游代理text/plain和删除Content-Disposition头,这样你就可以读取PhantomJS文件以正常的方式,应该为CSV文件工作,但不会为二进制工作在他们0字节。

其中的第一个选项(PhantomJS +上游代理)变得更容易,如果上游代理可以监视Accept标头PhantomJS发送到远程站点。 至少在PhantomJS版本2.1.1,主要请求具有Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 ,样式表请求具有Accept: text/css,*/*;q=0.1 ,以及所有其他请求(图片,脚本,XMLHttpRequest的),默认为Accept: */*尽管这可以通过使用网站覆盖XMLHttpRequest.setRequestHeader() 。 因此,如果上游代理看到与请求的Accept含头text/html ,并通过这个请求到一个CSV文件或其他非HTML文档的服务器的测试结果,然后有一个很好的机会,这是一个拯救。



文章来源: How to download a csv file using PhantomJS