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

标签 javascript web-scraping phantomjs casperjs

是否可以将文件下载到文件夹并使用 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/

相关文章:

javascript - 在 React Native 中将数据保存到异步存储 onPress

javascript - 为什么 Math.toString() 返回 [object Math]?

javascript - 使用嵌套 open() 函数时何时退出?

jasmine - webpage.open() 从不调用回调

python - 使用scrapy抓取动态内容

php - PhantomJs 无法执行二进制文件

javascript - 使用 JQuery 随机显示一个 div 类

Javascript 和 Java 日期 JSON 序列化

python - 将表抓取到列表中

python ( Selenium ): how to login to a website with a login redirect/organization sign on