2016-06-07 2 views
0

Reddit 게시물 목록에서 스크린 샷을 캡처하는 빠른 스크립트를 만들었습니다. 이 스크립트는 json 파일 (아래에 표시된 예)에서 reddit URL을 가져온 다음 각 페이지를 방문하여 스크린 샷을 캡처합니다.casper.waitForSelector, 시간 초과 및 오류 처리

스크립트는 가장 잘 작동합니다. 그러나 때때로, casper.waitForSelector 기준이 충족되지 않으면 잠시 멈추고 계속 실행됩니다. 결국 그것은 전체 서버를 정지시킵니다. 나는 충분한 오류 처리를하고 있다고 생각했다. casper.waitForSelector 기준에 맞지 않는 페이지를 무시하고 화면 캡처를 위해 다음 항목으로 이동하도록 스크립트를 수정하려면 어떻게해야합니까?

JS가

var casper = require('casper').create({ 
    verbose: true, 
    viewportSize: { 
     width: 1280, 
     height: 720 
    }, 
    logLevel: 'error', 
    pageSettings: { 
     ignoreSslErrors: true, 
     loadImages: true, // load images 
     loadPlugins: true, // do not load NPAPI plugins (Flash, Silverlight, ...) 
     webSecurityEnabled: false, // ajax 
     userAgent: 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36' 
    } 
}); 

//Create random names for files 
function randString(x) { 
    var s = ""; 
    while (s.length < x && x > 0) { 
     var r = Math.random(); 
     s += (r < 0.1 ? Math.floor(r * 100) : String.fromCharCode(Math.floor(r * 26) + (r > 0.5 ? 97 : 65))); 
    } 
    return s; 
} 


function getReddit(reddit, filename) { 
    casper.thenOpen(reddit, function() { 
     if (casper.exists("#thing_" + filename)) { 
      casper.waitForSelector("#thing_" + filename, function() { 
       casper.captureSelector(randString(10) + '.png', "#thing_" + filename, { 
        quality: 100 
       }); 
      }); 
     } else { 
      console.log("Reddit Error: " + filename); 
     } 
    }); 
} 

var link = 'http://localhost/test.json'; 

casper.start(link); 

casper.on("resource.received", function(resource) { 
    var results = this.evaluate(function(url) { 
     return __utils__.sendAJAX(url, "GET"); 
    }, resource.url); 
    var x = JSON.parse(results); 
    //this.echo(x.length); 
    for (var i = 0; i < x.length; ++i) { 
     var reddit = x[i].post_url; 
     var filename = x[i].id; 
     getReddit(reddit, filename); 
    } 
}); 

casper.run(); 

당신이 waitForSelector (3 인자)에 onTimeout 콜백 함수를 제공하는 경우, 그것은 대신 기본 동작의 실행됩니다

{ 
post_url: "https://www.reddit.com/r/todayilearned/comments/4marhg/til_that_in_the_16th_century_christians_called/", 
bit_id: "l6KE0vzMmgQ", 
id: "t3_4marhg" 
}, 
{ 
post_url: "https://www.reddit.com/r/videos/comments/4mbbab/man_ignores_museum_rules_touches_priceless_clock/", 
bit_id: "2GK22rGYWKx", 
id: "t3_4mbbab" 
}, 
{ 
post_url: "https://www.reddit.com/r/space/comments/4mc1av/an_alien_world_67p_as_seen_by_rosetta_two_days_ago/", 
id: "t3_4mc1av" 
}, 
{ 
post_url: "https://www.reddit.com/r/worldnews/comments/4mc8uv/young_fish_become_hooked_on_eating_plastic_in_the/", 
id: "t3_4mc8uv" 
}, 
{ 
post_url: "https://www.reddit.com/r/todayilearned/comments/4mcda3/til_that_the_giant_tortoise_did_not_receive_a/", 
id: "t3_4mcda3" 
}, 
{ 
post_url: "https://www.reddit.com/r/science/comments/4mcl0y/a_new_study_has_shown_that_mothers_who_are/", 
id: "t3_4mcl0y" 
}, 
{ 
post_url: "https://www.reddit.com/r/news/comments/4mcveg/bp_agrees_to_pay_175_million_to_settle_claims_by/", 
id: "t3_4mcveg" 
}, 
{ 
post_url: "https://www.reddit.com/r/todayilearned/comments/4mdddw/til_that_when_a_british_captive_officer/", 
id: "t3_4mdddw" 
} 

답변

2

JSON (정지 스크립트).

당신은 빈 기능과 일부 로깅 함수에 전달할 수 있습니다 : 당신은 모든 기능이 동작을 원하는 경우

casper.waitForSelector("#thing_" + filename, function _then() { 
    this.captureSelector(randString(10) + '.png', "#thing_" + filename, { 
     quality: 100 
    }); 
}, function _onTimeout(){ 
    this.echo("#thing_" + filename + " not found", "WARNING"); 
}); 

당신은 또한 true에 옵션 casper.options.silentErrors을 변경할 수 있습니다.

+0

좋아, 일부 로깅 기능을 완벽하게 전달했습니다. –