是否可以将文件下载到文件夹并使用 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();
关于javascript - 如何使用 phantomjs/casperjs 处理下载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25695318/