系上CCSP課程寫到有關使用node.js去scrape appledaily的即時新聞的作業,
其中遇到 cheerio 程式庫裡面的request function,出現了下列的問題:
能把資料抓下來並用console.log顯示(同時push到Array裡面),但在寫檔的時候卻是寫入空的Array。
問了公司的Uncle後發現是 request() 其實是Asynchronous function (AJAX)
console.log印出來的時間和request()被trigger的時間並沒有一定先後順序
所以才會產生這樣的問題
所以解決方法是不能抓資料和存檔分開來作,要達到Synchronous的方法,必須要把存檔(後做的事情)寫在抓資料(前面要做的事情)的function裡的後面,並自己call自己,到臨界值後再存檔。
var requestPages = function(pageNum){
request(url+pageNum, function( error, response, html){
做一些事...
//判斷狀況並且自己呼叫自己
if(pageNum>=1 && pageNum<5){
requestPages(pageNum+1);
}
else if(pageNum>=5){
//存檔;
//now the json metadata are saved in json[], save the result to file
fs.open('appledaily.json', 'w+', function(err, fd){
if(err)
console.log(err);
fs.writeFile('appledaily.json', JSON.stringify(json), function(err){
if(err)
throw err;
else
console.log("write success!");
});
});
return;
}
});
};
//呼叫自己
requestPages(1);
request(url+pageNum, function( error, response, html){
做一些事...
//判斷狀況並且自己呼叫自己
if(pageNum>=1 && pageNum<5){
requestPages(pageNum+1);
}
else if(pageNum>=5){
//存檔;
//now the json metadata are saved in json[], save the result to file
fs.open('appledaily.json', 'w+', function(err, fd){
if(err)
console.log(err);
fs.writeFile('appledaily.json', JSON.stringify(json), function(err){
if(err)
throw err;
else
console.log("write success!");
});
});
return;
}
});
};
//呼叫自己
requestPages(1);
就是這樣喵~
沒有留言:
張貼留言