Javascript 如何使用phantomjs/casperjs处理下载?

Javascript 如何使用phantomjs/casperjs处理下载?,javascript,web-scraping,phantomjs,casperjs,Javascript,Web Scraping,Phantomjs,Casperjs,是否可以将文件下载到文件夹并使用panthomjs/casperjs为其指定名称 例如,我如何下载此页面底部的.csv:并将其命名为aapl.txt 下载链接为: <a href="javascript:getQuotes(true);" id="lnkDownLoad"> Download this file in Excel Format </a> 但由于某些原因,我没有收到任何与普通浏览器不同的文件。控制台日

是否可以将文件下载到文件夹并使用panthomjs/casperjs为其指定名称

例如,我如何下载此页面底部的.csv:并将其命名为aapl.txt

下载链接为:

<a href="javascript:getQuotes(true);" id="lnkDownLoad">
                Download this file in Excel Format
            </a>
但由于某些原因,我没有收到任何与普通浏览器不同的文件。控制台日志是:
b'TITLE:(AAPL)历史价格和数据-NASDAQ.com\r\n点击\r\n列表\r\n\nhttp://www.nasdaq.com/symbol/aapl/historical\r\n'


有什么想法吗?

当你查看代码时,你会发现它并没有真正被混淆。通过点击下载链接,该文件实际上是通过casper下载的,但无法轻松访问。罪魁祸首是PhantomJS,因为PhantomJS不公开请求和响应内容(请参阅),而只公开元数据

这意味着您需要通过函数重复请求。当您在浏览器的开发人员工具中查看页面源代码时,您会看到单击会调用
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混淆了。我需要一种处理下载提示的方法。下载链接调用名为
getQuotes
的javascript函数,其目标是释放直接下载链接。我不知道该如何准确地分析它的作用。如果您使用firefox或chrome点击链接,会出现下载提示,您可以下载.csv。我基本上希望phantomjs处理下载提示,重命名文件并将其保存在我选择的位置,除非有其他方法。当您尝试链接解决方案时会发生什么?有什么问题吗?是的,当我使用你的链接中给出的方法时,我想我没有得到任何资源,它看起来只是重新加载页面,因为在日志中的“侦听”字符串之后,我只得到页面的url,而不是预期的.csv。我使用
casper.wait
只是为了去除日志中的页面资源,如javascript文件等。另外,我也不太明白为什么在听之前会有字符串被点击,因为我后来调用了它。相关:哇,这很难,因为我不太了解jquery和表单,所以我无法找到它。谢谢你的帮助。您知道如何更改下载的目标文件夹吗?在调用
download
之前,使用自定义目录进行调用应该是可行的,因为
download
在内部使用
fs
模块。
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();