沟通节点.js使用Python和获取数据延迟

2024-10-02 10:23:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写web crawler。你知道吗

我有server.js / crawling.js / dataCrawler.py

当我在server.js调用crawling.js中定义的crawlData时,会调用我在crawling.js中定义的使用spawn执行dataCrawler.py的方法。你知道吗

我需要server.js中的数据,但执行dataCrawler.py需要一段时间,因此我无法获得正确的数据,但为null或未定义。你知道吗

你有什么解决办法吗?或者有同样问题的人?你知道吗

我的密码在下面。)我把这些放得不太好。结构参考)


你知道吗//服务器.js你知道吗

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

你知道吗//爬网.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;

}

你知道吗//数据爬虫.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()

Tags: 数据pydataservervarstdinjsresult
2条回答

或者,如果不需要考虑并行运行,可以使用spawnSync

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

    return JSON.parse(encoding.convert(result, 'utf-8'));
}

你没有解释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.
});

回调可能导致Callback hell。尝试探索promisesasync/await。你知道吗

相关问题 更多 >

    热门问题