2017-02-10 18 views
0

надеюсь, что у вас будет потрясающий день.Аварии CasperJS - их можно избежать при обновлении или восстановлении?

Я использую КасперСШ в течение нескольких дней (непрерывно) через 100 000 ссылок.

Для каждых 500 или около того, casperJS аварийно падает. Однако при перезагрузке и запуске с последней ссылки он продолжается еще на 500.

Мне было интересно, если кто-нибудь знает об эффективном способе, я мог бы обновить или закрыть & reinstance casperjs, чтобы избежать этого выгорания? Я думал о выходе() в паре с ожиданием, но очень увлечен мыслями!

Сценарий похож:

var casper = require('casper').create({ 
    verbose: true, 
    logLevel: 'error', 
    pageSettings: { 
    loadImages: false, 
    loadPlugins: true, 
    userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11' 
    }, 
    clientScripts: ['vendor/jquery.min.js', 'vendor/lodash.js'], 
viewportSize: { 
    width: 1600, 
    height:1000 
    } 
}); 

var linkArray = [ // Includes 100,000 + links ] 

function inspectUrl(url) { 
    casper.thenOpen(url, function() { 
     title = this.getPageTitle(); 
     bodyText = this.fetchText('body'); 

     // Includes a bunch of other tasks to do. 
} 


casper.start('https://www.google.com.au', function() { 
    console.log('Booting up CasperJS...'); 
}); 

casper.then(function() { 
    for (var i = 0; i < linkArray.length; i++) { 
     inspectUrl(linkArray[i]); 
    }; 
}); 

casper.run() 
+0

есть любой тип ошибки/отладки/журналирования информации, которую вы имеете в наличии, когда он выходит из строя? вам может быть лучше найти корень проблемы – user2079802

+0

Отрицательный, phantomjs просто падает. Я console.log каждый заголовок ресурса, так что, если это конкретный запрос, вызывающий зависание, я смогу работать над этим. Вместо этого, похоже, это проблема памяти. – jakequade

+0

Я нашел вариант, но никогда не тестировал его самостоятельно на github: https://github.com/casperjs/casperjs/pull/826#issuecomment-34950562 – dasmelch

ответ

0

Существует известная проблема PhantomJS памяти. Вы должны разработать «runner», который запускает ваш скрипт CasperJS с 400 ссылками, собирает результат, затем запускает другой экземпляр скрипта с другой частью ссылок и до сих пор.

Возможно, вы можете сделать несколько экземпляров CasperJS параллельно, если вам нужна скорость.

Вы можете разработать такой бегун с помощью PhantomJS, используя spawn. Функция описана кратко в PhantomJS документы: http://phantomjs.org/api/child_process/

ОБНОВЛЕНИЕ:

Вы можете найти ниже рабочего примера такого бегуна. Пример очень прост, просто чтобы продемонстрировать, как можно было порождать экземпляры CasperJS и собирать их результаты. В частности, в примере нет обработки ошибок. Пример был протестирован с помощью PhantomJS 2.1.1.

Бегун использует Q обещания, поэтому сначала вы должны сделать файл package.json со следующим содержанием:

{ 
    "dependencies": { 
     "q": "1.4.1" 
    } 
} 

и запустить установщик:

НПМ установки

Затем вы должны создать runner.js:

var Q = require('q'); 
var childProcess = require('child_process'); 

var parserTasks = [ 
    'http://phantomjs.org/', 
    'http://casperjs.org/', 
    'https://jquery.com/' 
]; 

run(parserTasks).then(function(result) { 
    console.log('Tasks result: ' + JSON.stringify(result)); 
    phantom.exit(); 
}); 

function run(tasks) { 
    if (tasks.length) { 
     var task = tasks.pop(); 
     return runTask(task).then(function(result) { 
      console.log('result: ' + result); 
      return run(tasks).then(function(results) { 
       return([result].concat(results)); 
      }); 
     }); 
    } else { 
     return Q([]); 
    } 
} 

function runTask(task) { 
    var defer = Q.defer(); 

    var spawn = childProcess.spawn; 
    var result = ''; 
    var child = spawn('casperjs', ['parser.js', task]); 
    console.log("spawn run: " + task); 
    child.stdout.on("data", function(data) { 
     result += data; 
    }); 
    child.on("exit", function() { 
     defer.resolve(result); 
    }); 

    return defer.promise; 
} 

и parser.js

var casper = require('casper').create(); 

var url = casper.cli.args[0]; 

var result; 

casper.start(); 

casper.thenOpen(url, function() { 
    result = this.getTitle(); 
}); 

casper.run(function() { 
    this.echo(result).exit(); 
}); 

Вы можете выполнить бегуна следующим образом, а это означает, что phantomjs исполняемым находится где-то на PATH.

phantomjs runner.JS

Результат должен быть следующим:

spawn run: https://jquery.com/ 
result: jQuery 

spawn run: http://casperjs.org/ 
result: CasperJS, a navigation scripting and testing utility for PhantomJS and SlimerJS 

spawn run: http://phantomjs.org/ 
result: PhantomJS | PhantomJS 

Tasks result: ["jQuery\n","CasperJS, a navigation scripting and testing utility for PhantomJS and SlimerJS\n","PhantomJS | PhantomJS\n"] 
+0

Хотелось бы узнать больше об этом, если у вас есть информация/примеры - звучит как что-то, что я определенно должен делать, был бы очень благодарен за любую информацию, которую у вас есть :) – jakequade

+0

Эй, @ a-bobkov, мог бы я поговорить с вами напрямую о том, как я могу это настроить? :) – jakequade

+0

Я попробую сделать вам пример, возможно, в выходные :-) –