是否可以将文件下载到文件夹并使用panthomjs / casperjs为其指定特定名称?
例如,如何下载此页面底部的.csv:http : //www.nasdaq.com/symbol/aapl/historical并将其命名为aapl.txt?
下载链接是:
<a href="javascript:getQuotes(true);" id="lnkDownLoad">
Download this file in Excel Format
</a>
它的目标是调用一个javascript函数,其目的是混淆直接下载链接(我认为),但是当您单击它时,它会发出经典的下载提示。我希望phantomjs能够正常处理该下载(更改文件名并选择将其保存在驱动器磁盘上的位置)
编辑:此代码应该单击下载链接并侦听传入的资源:
var casper = require('casper').create();
var x = require('casper').selectXPath;
casper.userAgent("Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36")
casper.start('http://www.nasdaq.com/symbol/aapl/historical', function () {
//this.echo(this.getTitle());
console.log('TITLE : ' + this.getTitle());
});
casper.wait(5000, function() {
casper.on('resource.received', function (resource) {
casper.echo("LISTENING");
casper.echo(resource.url);
});
});
casper.thenClick(x('//*[@id="lnkDownLoad"]'), function() {
console.log('CLICKED');
});
casper.run();
但是由于某些原因,与普通浏览器不同,我没有收到任何文件。控制台日志为:b'TITLE : (AAPL) Historical Prices & Data - NASDAQ.com\r\nCLICKED\r\nLISTENING\r\nhttp://www.nasdaq.com/symbol/aapl/historical\r\n'
任何的想法 ?
查看代码时,您会发现它并没有真正被混淆。通过单击下载链接,该文件实际上是通过casper下载的,但无法轻松访问。罪魁祸首是PhantomJS,因为PhantomJS不公开请求和响应内容(请参阅参考资料page.onResourceReceived
),而仅公开元数据。
这意味着您需要通过download
函数重复请求。当您在浏览器的开发人员工具中查看页面源代码时,会看到getQuotes(true)
单击即被调用。通过搜索getQuotes
(Chrome中的Ctrl+ Shift+ F),您可以找到相关功能。
通过分析功能,您可以得出结论,$("#getFile").submit();
即实际下载只是来自具有很多隐藏值的表单的POST请求。如果仔细查看getQuotes
,您会发现该函数还将隐藏值之一添加到表单中。这意味着您需要getQuotes
在伪造表单提交之前致电。
实际的伪造是相对容易的。第一件事是从POST请求中使用的表单生成请求对象,第二件事是找到请求的URL。这是完整的代码:
var casper = require('casper').create();
var x = require('casper').selectXPath;
casper.userAgent("Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36")
casper.start('http://www.nasdaq.com/symbol/aapl/historical');
casper.wait(5000); // probably not necessary
casper.thenClick('#lnkDownLoad');
casper.then(function(){
var parameters = this.evaluate(function(){
// from http://stackoverflow.com/a/2403206
var paramObj = {};
$.each($('#getFile').serializeArray(), function(_, kv) {
paramObj[kv.name] = kv.value;
});
return paramObj;
});
var url = this.getElementAttribute('#getFile', 'action');
this.download(url, 'aapl.csv', 'POST', parameters);
});
casper.run();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句