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"
}
좋아, 일부 로깅 기능을 완벽하게 전달했습니다. –