Сообщите Node.js с Python и получите задержку данных - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь запрограммировать web crawler.

У меня есть server.js / crawling.js / dataCrawler.py

Когда я вызываю crawlData, который определен в crawling.js в server.js, вызывается метод, который я определил в crawling.js, используя spawn для выполнения dataCrawler.py.

Мне нужны данные в server.js, но выполнение dataCrawler.py занимает некоторое время, поэтому я не могу получить правильные данные, но ноль или неопределенные.

У вас есть какое-нибудь решение? или тот, у кого такая же проблема?

Мои коды ниже. (Я не ставлю это идеально. Просто ссылка на структуру)


// server.js

var crawler = require("./crawling")
var resultArr = crawler.crawlData();
console.log('nodeserver:', resultArr)

// crawling.js

exports.crawlData = ()=>{

    var dataArr = [];
    var temp;

    var py = spawn('python', ['dataCrawler.py']);
    var data = [totalUrl, gubun];
    var dataFromPy = null;


    py.stdout.on('data', function(result){
        var dataArr = encoding.convert(result, 'utf-8')
        dataArr = JSON.parse(encoding.convert(result, 'utf-8'));

        py.stdout.on('end', function(){
            temp = dataArr
        });

    });

    py.stdin.write(JSON.stringify(data));

    py.stdin.end();

    return temp;

}

// dataCrawler.py

def crawling(url, gubun, page_count):

    idx = 0
    result = []
    jsonData = {}
    for i in range(1, page_count + 1):
        ....
        crawling code
        ....    
    return result


    def main():

    lines = sys.stdin.readlines()
    paraFromServer = json.loads(lines[0])
    url = paraFromServer[0]
    gubun = paraFromServer[1]

    result = crawling(url, gubun, page_count)

    print(result)


    main()

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

В качестве альтернативы вы можете использовать spawnSync , если параллельная работа не является проблемой

exports.crawlData = () => {
    const result = spawnSync('python', ['dataCrawler.py'], {
      input: JSON.stringify([totalUrl, gubun])
    });

    return JSON.parse(encoding.convert(result, 'utf-8'));
}
0 голосов
/ 15 мая 2018

Вы не учли асинхронную природу javascript.То, что вам нужно сделать, это передать метод обратного вызова методу crawlData, который будет вызван после завершения очистки.

exports.crawlData = (cb)=>{
 ....
 py.stdout.on('data', function(result){
    var dataArr = encoding.convert(result, 'utf-8')
    dataArr = JSON.parse(encoding.convert(result, 'utf-8'));

    py.stdout.on('end', function(){
        cb(dataArr); // ideally the pattern is cb(error, data)
    });

 });

...

Итак, server.js становится:

var crawler = require("./crawling")
crawler.crawlData((data) => { 
    console.log(data); 
    // Do whatever you want to do with the data.
});

Обратные вызовы могут вызвать Обратный вызов ада .Попробуйте исследовать promises или async / await.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...