2014-04-19 92 views
1

我對CasperJS比較新,寫過簡單的抓取腳本,現在我處於一種更加困難的任務:我想從URL列表中抓取某些數據,但是有些頁面有時會「失敗」,我有一個驗證碼解析服務,因爲這些頁面中的一些默認情況下有captcha,但是phantomjs在渲染驗證碼時有點不一致,有時會加載,有時卻不會。重新運行casperjs腳本

我認爲的解決方案是重新運行帶有未能加載驗證碼的頁面的腳本,以獲得我需要的數據量。但我似乎沒有得到它的運行,我想創建一個函數與整個事情,然後在方法調用它,並檢查是否刮數據量滿足最低我需要如果不重新運行,但我不'我真的知道如何完成它,至於我見過的casperjs在調用函數之前將這些步驟添加到堆棧中(糾正我,如果我錯了)。此外,我正在考慮使用run.complete事件,但不知道如何去做。我的腳本是這樣的:

// This variable stores the amount of data collected 
pCount = 0; 
urls = ["http://page1.com","http://page2.com"];  
// Create casperjs instance... 
casper.start(); 

casper.eachThen(urls, function(response) { 
    if (pCount < casper.cli.options.number) { 
     casper.thenOpen(response.data, function(response) { 
     // Here is where the magic goes on 
     }) 
    } 
}) 
casper.run(); 

反正是有,我可以在一個功能包住casper.eachThen()塊做這樣的事情?

casper.start(); 
function sample() { 
    casper.eachThen(urls, function(response) { 
     if (pCount < casper.cli.options.number) { 
      casper.thenOpen(response.data, function(response) { 
      // Here is where the magic goes on 
      }) 
     } 
    }) 
} 
casper.run(sample); 

而且,我嘗試使用slimerjs發動機,以避免「不一致」,但我不能設法得到工作__utils__.sendAjax()方法casper.evaluate()我裏面,所以這是一個致命弱點。或者有沒有辦法在一個單獨的實例中異步執行GET請求?如果是的話,我將不勝感激您的意見

更新:我從來沒有設法與casperjs解決這個問題,我仍然發現我的特定使用情況的解決方法,檢查我的答案爲更多信息

+0

嗯,我再次看到這個問題,並且[這個主題]可能幫助(http://stackoverflow.com/questions/23891143/casperjs-how-to-repeat-a-step-x-times-onwaittimeout)您。 – Fanch

回答

1

我從來沒有發現一種從卡斯帕做到這一點,這是我如何解決它:

有一個程序的,它可以管理用戶輸入(在我的情況用C#編寫)。這個程序A是執行casperjs腳本並讀取它的輸出的程序。如果我需要重新運行腳本,我只是輸出一些具有一定規格的消息,以便我在程序A中找到它。

它可能不是最好的方法,但它對我很有用。希望它有幫助

1

也許與背部功能,所以這樣的事情:

casper.start() 
.thenOpen('your url'); 
.then(function(){ 
    var count = 0; 
    if (this.exists("selector contening the captcha")){ 
    //continue the script 
    } 
    else if (count==3){ 
     this.echo("in 3 attempts, it failed each time"); 
     this.exit(); 
    } 
    else{ 
     count++; 
     casper.back();//back to the previous step, so will re-open the url 
    } 
.run(); 
+0

:從來沒有真正檢查過()我認爲這是字面上去上一頁像點擊瀏覽器後退按鈕。我一定會試一試。我會告訴你 – davidaam

+0

是的,說實話我沒有嘗試,讓我知道:) – Fanch

+0

它不會工作,就像我想的那樣,back()在__browser的歷史記錄中退到一步,而不是在step的堆棧中。謝謝 – davidaam