2014-09-05 46 views
2

是否有可能將文件下載到文件夾並使用panthomjs/casperjs爲其指定名稱?如何使用phantomjs/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'

任何想法?

+0

你試過我的鏈接嗎?直接下載鏈接被javascript模糊處理。我需要一種方法來處理下載提示。 – Wicelo 2014-09-07 06:09:04

+0

下載鏈接調用一個名爲'getQuotes'的javascript函數,其目標是破壞直接下載鏈接。我沒有足夠的知識來分析它究竟做了什麼。如果您點擊鏈接使用Firefox或Chrome,則會出現下載提示,您可以下載.csv。我基本上想要phantomjs處理該下載提示以重命名文件並將其保存在我選擇的位置,除非有其他方法。 – Wicelo 2014-09-07 08:33:35

+0

當您嘗試鏈接解決方案時會發生什麼?有什麼問題嗎? – 2014-09-07 08:43:40

回答

4

當您查看代碼時,您會發現它並未真正混淆。通過點擊下載鏈接,該文件實際上是通過casper下載的,但無法輕鬆訪問。罪魁禍首是PhantomJS,因爲PhantomJS不公開請求和響應內容(請參閱page.onResourceReceived),但僅限元數據。

這意味着您需要通過download函數重複請求。當您在瀏覽器的開發人員工具中查看頁面源代碼時,您會看到getQuotes(true)在點擊時被調用。通過搜索getQuotesCtrl + Shift + F in Chrome),您會發現有問題的功能。

通過分析函數,可以得出結論$("#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(); 
+0

哇這很難我不會找到這個,因爲我不知道jquery和形式不夠好。謝謝你的幫助。你知道如何更改下載的目標文件夾嗎? – Wicelo 2014-09-08 20:47:03

+1

調用['fs.changeWorkingDirectory'](http://phantomjs.org/api/fs/method/change-working-directory.html)與自定義目錄應在調用'download'之前工作,因爲'download'使用' fs'模塊。 – 2014-09-08 20:54:27