1

Я только начал использовать pjscrape и попробуйте запустить образец скребок, предусмотренный на http://nrabinowitz.github.io/pjscrape/#overview и назвал следующую команду в терминале, но он дал мне ошибки:Использование PhantomJS с pjscrape скрести динамически веб-контента

$ phantomjs /Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js my_config.js 

TypeError: undefined is not an object (evaluating 'phantom.args.length')

/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:834 in global code ^Z

[6]+ Stopped phantomjs /Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js my_config.js

Но потом я понял, что это, вероятно, потому, что в файле pjscrape.js он использует phantom.args.length, который уже был заменен на system.args в новых phantomJS. Таким образом, я изменил оригинальный pjscrape.js:

var system = require('system'); 
// make sure we have a config file 
if (!system.args.length) { 
// die 
console.log('Usage: pjscrape.js <configfile.js> ...'); 
phantom.exit(); 
} else { 

// load the config file(s) 
system.args.forEach(function(configFile) { 
    if (!phantom.injectJs(configFile)) { 
     fail('Config file not found: ' + configFile); 
    } 
    }); 
} 

Тогда я побежал ту же команду, но он дал мне следующие ошибки:

RangeError: Maximum call stack size exceeded.

undefined:0 in injectJs RangeError: Maximum call stack size exceeded.

undefined:0 in injectJs
/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:844 :0 in forEach RangeError: Maximum call stack size exceeded.

undefined:0 in injectJs
/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:844 :0 in forEach RangeError: Maximum call stack size exceeded.

/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:850 in global code :0 in injectJs
/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:844 :0 in forEach RangeError: Maximum call stack size exceeded.

undefined:0 in injectJs
/Applications/nrabinowitz-pjscrape-600e20a/pjscrape.js:844 :0 in forEach FATAL ERROR: No suites configured

Теперь я действительно не знаю, что это неправильно. Мой my_config.js (где я определил мой скребок с помощью pjscrape) выглядит следующим образом:

pjs.addSuite({ 
// url to scrape 
url: 'http://en.wikipedia.org/wiki/List_of_towns_in_Vermont', 
// selector to look for 
scraper: '#sortable_table_id_0 tr td:nth-child(2)' 
}); 

Может кто-то помочь мне понять, как исправить проблему? В конце концов, я хочу, чтобы иметь возможность очистить веб-сайт, где содержимое, которое мне нужно, генерируется калькулятором javascript, который принимает только один набор входов и генерирует по одному результату за раз. Но я также хочу ввести тысячи различных входов в калькулятор и получить огромную таблицу результатов.

ответ

2

system.args возвращает все аргументы командной строки команд, в том числе оригинальный сценарий, в то время как phantom.args вернулся только аргументы командной строки, после того, как файл сценария. В принципе, он переходит в бесконечный цикл, потому что он продолжает вводить файл pjscrape.js до достижения максимального размера стека вызовов.

Решение: сцепиться с первого аргумента: system.args.splice(1).forEach...