当我使用的是正常的浏览器(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解析。
我发现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);
经过几天调查的日子里,我不得不说,有一些解决方案:
- 在你的评价功能,可以使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。
前2个回答假设你可以预先知道最终的CSV文件的URL。 如果该链接进入一个HTML页面,做一个Javascript计算的重定向到文件,你不想来评价PhantomJS的之外的JavaScript代码将不会是这样。 您的选项则是:
- 把PhantomJS背后上游代理服务器,并使用上述上游代理拦截下载URL(及其预期Cookie和参考标头) - 但你必须要小心地识别真正的下载网址,而不是一些随机数据“斑点”如果页面使得二进制XMLHttpRequest的为好;
- 而不是PhantomJS使用无头浏览器,可以自动保存下载文件(或火狐PyVirtualDisplay,也可设置为做到这一点,或等待无头火狐)和监控下载目录,但你必须要能够找出自己当下载完成(或使用上游代理来监控它完成,但无头的Chrome / Firefox中,目前无法设置为忽略SSL证书,这意味着,如果该网站进入“安全”它更难以监控的要求无头的Chrome / Firefox浏览器比它要监控PhantomJS,至少到的请求铬问题721739是固定的,你可以看一个连接请求,但如果它更让你将无法知道肯定是转移已经完成的方式) ;
- 把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文档的服务器的测试结果,然后有一个很好的机会,这是一个拯救。