[英]Re-run casperjs script
我是CasperJS的新手,已經編寫了簡單的抓取腳本,現在我面臨着更加艱巨的任務:我想從網址列表中抓取某種數據,但是有些頁面有時會“失敗”,我有一個驗證碼解析服務,因為默認情況下此頁面中的一些頁面具有驗證碼,但是phantomjs在呈現某些驗證碼時有時會不一致,有時會加載,有時則不會。
我認為的解決方案是使用無法加載驗證碼的頁面重新運行腳本,以獲取所需的數據量。 但是我似乎沒有讓它運行,我想到了用整個東西創建一個函數,然后在casper.run()
方法內部調用它,並檢查所刮取的數據量是否達到了我需要的最小值(如果不重新運行),但是我真的不知道如何完成它,就我所見,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作為引擎來避免“不一致”,但是我無法設法在我擁有的casper.evaluate()
內部使用casper.evaluate()
__utils__.sendAjax()
方法,所以這是一個大問題。 還是有一種方法可以在單獨的實例中異步執行GET請求? 如果是這樣,我將不勝感激您的建議
更新:我從未設法用casperjs解決它,但是我找到了針對我的特定用例的解決方法,請查看我的答案以獲取更多信息
也許帶有back功能,所以像這樣:
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();
我從來沒有找到一種方法可以從casper中做到這一點,這就是我解決的方法:
有一個程序A,用於管理用戶輸入(在我的情況下以C#編寫)。 該程序A是執行casperjs腳本並讀取其輸出的程序。 如果我需要重新運行該腳本,則只輸出一條帶有某些規范的消息,以便將其捕獲到程序A中。
這可能不是最好的方法,但是對我有用。 希望能幫助到你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.