該賞金過期2天。回答這個問題有資格獲得 50聲望獎勵。 MITHU想引起更多人對這個問題的關注。
我創建了一個腳本來使用谷歌應用程式腳本從網頁中抓取兩個欄位。該腳本似乎作業正常,但它以每行為基礎將結果寫入電子表格。
我所做的是從登陸頁面獲取所有商店的鏈接,然后在另一個函式中重用這些鏈接來決議shop name和website link來自內頁。雖然這兩個欄位在登陸頁面中也可用,但我希望從它們的內頁決議它們。
但是,我希望將結果寫入電子表格中進行批量更新。我怎樣才能做到這一點?
目前的做法:
function parseYellowpages() {
var options = {
"method" : "GET",
"headers" : {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36"
}
};
var ss = SpreadsheetApp.getActiveSpreadsheet();
var activeSheet = ss.getSheetByName('Sheet1');
var base = "https://www.yellowpages.com"
var webURL = "https://www.yellowpages.com/search?search_terms=pizza&geo_location_terms=New York, NY";
var row = 1;
var response = UrlFetchApp.fetch(webURL,options);
var $ = Cheerio.load(response.getContentText());
const items = $("[class='result'] [class='info']");
for (i=0;i<items.length;i ){
var shopLink = base $(items[i]).find('h2[] > a.business-name').attr('href');
var resultContainer;
resultContainer = getInnerpageInfo(shopLink,options);
activeSheet.getRange(row,1).setValue(resultContainer[0]);
activeSheet.getRange(row,2).setValue(resultContainer[1]);
console.log(resultContainer[0],resultContainer[1]);
row ;
};
}
function getInnerpageInfo(innerLink,options) {
var response = UrlFetchApp.fetch(innerLink,options);
var $ = Cheerio.load(response.getContentText());
var shopName = $('.sales-info > h1').first().text();
var website = $('a.website-link').first().attr('href');
return [shopName,website];
}
如何將結果寫入電子表格進行批量更新?
uj5u.com熱心網友回復:
您可以通過將所有結果.setValue()一次性.setValues()寫入電子表格的呼叫替換重復呼叫,從而顯著提高性能。
要收集結果,請在回圈中將它們一一推送到陣列中,或者用Element.map()替換回圈,如下所示:
const result = items.map((index, item) => {
const path = $(item).find('h2[] > a.business-name').attr('href');
const shopLink = base path;
return [getInnerpageInfo(shopLink, options)];
}).get();
要撰寫結果,請獲取一個大小與結果尺寸匹配的范圍并使用.setValues(),如下所示:
activeSheet.getRange('A1')
.offset(0, 0, result.length, result[0].length)
.setValues(result);
問題中的代碼在一段時間內似乎沒有執行任何操作的原因是 Google Apps Script 快取寫入電子表格。在許多情況下,所有寫入僅在腳本終止時執行。
如果您需要立即應用掛起的寫入,請使用SpreadsheetApp.flush()。
另請參閱Apps 腳本最佳實踐和UrlFetchApp.fetchAll()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/395422.html
