Chỉ vừa học JS hơn 1 tuần để làm cái crawler tin tức, code trên Google Apps Script, có vài vấn đề mong mọi người giải đáp:
Vấn đề mô tả ngắn gọn như sau:
- 1 mảng Rss link, 1 file Google Sheet với số Spreadsheet bằng số link
- Với mỗi link, chạy hàm async để await UrlFetch nội dung bài báo (1 rss link có các item, mỗi item có 1 link bài báo) rồi append vô Google Sheet
- Để nhanh chóng, cần chạy các async này song song, kì vọng là các async sẽ update vô Spreadsheet tương ứng cùng lúc hoặc chậm hơn nhau 1-3s chẳng hạn
Kết quả sau khi tham khảo các bài viết khác nhau:
- Dùng for loop, với mỗi i thì
promise = async ()
promises.push(promise);
out of loop
all = promise.all(promises);
- Tốc độ rõ là có cải thiện so với ném async vô for loop tuần tự, nhưng về thời gian thì:
Với mỗi link, nhận thấy cần khoảng 10s để append hết SpreadSheet, tuy nhiên thời gian ghi lại của việc append trên mỗi Spread dường như vẫn theo kiểu tuần tự dù toàn bộ async task được ignite cùng lúc
Logger có dạng như sau
FIle
Code
Hay là do Google Sheet nó vậy, hay thực sự cần sửa code chỗ nào đó ?
Thanks
Vấn đề mô tả ngắn gọn như sau:
- 1 mảng Rss link, 1 file Google Sheet với số Spreadsheet bằng số link
- Với mỗi link, chạy hàm async để await UrlFetch nội dung bài báo (1 rss link có các item, mỗi item có 1 link bài báo) rồi append vô Google Sheet
- Để nhanh chóng, cần chạy các async này song song, kì vọng là các async sẽ update vô Spreadsheet tương ứng cùng lúc hoặc chậm hơn nhau 1-3s chẳng hạn
Kết quả sau khi tham khảo các bài viết khác nhau:
- Dùng for loop, với mỗi i thì
promise = async ()
promises.push(promise);
out of loop
all = promise.all(promises);
- Tốc độ rõ là có cải thiện so với ném async vô for loop tuần tự, nhưng về thời gian thì:
Với mỗi link, nhận thấy cần khoảng 10s để append hết SpreadSheet, tuy nhiên thời gian ghi lại của việc append trên mỗi Spread dường như vẫn theo kiểu tuần tự dù toàn bộ async task được ignite cùng lúc
Logger có dạng như sau
FIle
Code
JavaScript:
var start = new Date().getTime();
function mainTuoiTre() {
mainTuoitre();
}
async function mainTuoitre() {
var urlRss = [
"https://tuoitre.vn/rss/tin-moi-nhat.rss",
"https://tuoitre.vn/rss/thoi-su.rss",
"https://tuoitre.vn/rss/the-gioi.rss"
];
var spreadsheetName = [
"Tuoitre-Trangchu",
"Tuoitre-Thoisu",
"Tuoitre-Thegioi"
];
var spreadsheetIdTuoitre = "";
var singlePromises = [];
for (let i = 0; i < urlRss.length; i++) {
let promise = getHtmlContentTuoitre(urlRss[i], spreadsheetName[i], spreadsheetIdTuoitre);
t = new Date().getTime()-start;
Logger.log(
"Created Promise for API call of at " + t
);
singlePromises.push(promise);
}
//singlePromises.push(getHtmlContentTuoitre(urlRss[0], spreadsheetName[0], spreadsheetIdTuoitre));
//singlePromises.push(getHtmlContentTuoitre(urlRss[1], spreadsheetName[1], spreadsheetIdTuoitre));
//singlePromises.push(getHtmlContentTuoitre(urlRss[2], spreadsheetName[2], spreadsheetIdTuoitre));
t = new Date().getTime()-start;
Logger.log("Finished adding all promises at " + t);
let allPromises = await Promise.all(singlePromises);
t = new Date().getTime()-start;
Logger.log("Got the results for all promises at " + t);
Logger.log('Done');
}
async function getHtmlContentTuoitre(url, spreadsheetNamex, spreadsheetIdx) {
t = new Date().getTime()-start;
Logger.log("This task created at " + t);
let xml = await UrlFetchApp.fetch(url).getContentText();
let document = await XmlService.parse(xml);
var root = document.getRootElement();
var channel = root.getChild('channel');
var items = channel.getChildren("item");
var d = new Date();
var t = d.toLocaleTimeString();
var spreadsheet = SpreadsheetApp.openById(spreadsheetIdx);
var sheet = spreadsheet.getSheetByName(spreadsheetNamex);
var range = sheet.getRange("A2:K200");
range.clearContent();
var cell = sheet.getRange('A2');
sheet.setCurrentCell(cell);
var contentx = "";
for (i=0; i<items.length; i++) {
//Logger.log(items[i].getChildText('title'));
var link = items[i].getChildText('link');
var description = items[i].getChildText('description').replace(/<[^>]+>/g,"");
//linkList.push(link);
//let xmlDescription = await UrlFetchApp.fetch(link).getContentText();
//let documentDescription = await XmlService.parse(xmlDescription);
//var rootDescription = documentDescription.getRootElement();
//var elements = rootDescription.getDescendants();
//Logger.log(rootDescription);
//Logger.log(elements);
//Logger.log(xmlDescription);
if (description.startsWith("TTO - ") == true) {
description = description.substr(6);
}
//contentx = await getContentTuoitre(link);
sheet.appendRow([items[i].getChildText('title'), link, description, items[i].getChildText('pubDate'), t]);
//Logger.log(contentx);
}
//t = new Date().getTime()-start;
Logger.log(
"Finished Promise for API call of at " + t
);
}
Hay là do Google Sheet nó vậy, hay thực sự cần sửa code chỗ nào đó ?
Thanks