我正在编写web crawler的程序。
我有server.js / crawling.js / dataCrawler.py
当我在crawlData上调用在crawling.js中定义的server.js时,我在crawling.js中定义的用于执行dataCrawler.py的方法将被调用。
我需要server.js中的数据,但是执行dataCrawler.py需要一段时间,所以我无法获得正确的数据,但只有null或未定义。
你有什么解决办法吗?还是有同样问题的人?
我的密码在下面。(我没有把这些放得很完美。仅供结构参考)
//server.js
var crawler = require("./crawling")
var resultArr = crawler.crawlData();
console.log('nodeserver:', resultArr)//爬行
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()发布于 2018-05-15 05:14:26
您没有考虑到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。
发布于 2018-05-15 05:26:46
或者,如果不需要并行运行,也可以使用spawnSync。
exports.crawlData = () => {
const result = spawnSync('python', ['dataCrawler.py'], {
input: JSON.stringify([totalUrl, gubun])
});
return JSON.parse(encoding.convert(result, 'utf-8'));
}https://stackoverflow.com/questions/50342603
复制相似问题