google app脚本超出内存限制

时间:2018-07-21 11:43:43

标签: google-apps-script web-scraping google-sheets xml-parsing

也许这个问题已经问过了,但这不能解决我的问题。

我尝试使用google spreadsheet将数据保存到google app script中。但是它显示了超出内存限制错误。

遵循我的代码:

//new
function getNewTitle() {
    var url = "https://www.reddit.com/r/DigitalMarketing.rss?limit=100&after=0";
    var fromText = '</updated><title>';
    var toText = '</title>';
    var content = UrlFetchApp.fetch(url).getContentText();

    var scraped = Parser.data(content).from(fromText).to(toText).iterate();
    return scraped;
}

function getNewContent() {
    var url = "https://www.reddit.com/r/DigitalMarketing.rss?limit=10&after=0";
    var content = UrlFetchApp.fetch(url).getContentText();

    var document = XmlService.parse(content);
    var root = document.getRootElement();
    var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');
    Logger.log(atom);

    var fromText = '<content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;';
    var toText = '</div>';


    var scraped = Parser.data(content).from(fromText).to(toText).iterate();

    return scraped;
}

function getNewLink() {
    var url = "https://www.reddit.com/r/DigitalMarketing.rss?limit=10&after=0";
    var fromText = '<link href="';
    var toText = '" /><updated>';
    var content = UrlFetchApp.fetch(url).getContentText();

    var scraped = Parser.data(content).from(fromText).to(toText).iterate();

    return scraped;
}

function SAVE_DATA() {
  var sheet  = SpreadsheetApp.openById('1No3m_FnhyxIaxj2zSlbHrg8HLBJULGQ2bda65hpKlyY').getSheetByName('sample'); 
 var content   = getNewContent();
  var title   = getNewTitle();
  var link   = getNewLink();
  Logger.log(title[1]);
  for(var i =0; i < title.length; i++) { 
    sheet.appendRow([ 'Reddit','wordpress', title[i], link[i], content[i]]);
  }
}
//new

在我上面的代码中,试图保存url中的数据。

  

但是我遇到Exceeded memory limit错误。

在我的日志中,我收到了此消息

  

[18-07-21 05:33:29:719 PDT] [命名空间:前缀“”映射到URI“ http://www.w3.org/2005/Atom”]

请帮助我解决此错误...!

谢谢。

1 个答案:

答案 0 :(得分:2)

我认为错误的原因是从</div>检索到的var toText = '</div>';中不包含content的{​​{1}}。那修改呢?

修改点:

    https://www.reddit.com/r/DigitalMarketing.rss?limit=10&after=0中的
  • </div>未包含在var toText = '</div>';中。因此,在此修改中,我使用了content。因为您将</content>用于'<content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;'
  • fromText代替setValues()用于放置值。
    • 您可以在here看到appendRow()setValues()之间的成本差异。

修改后的脚本:

1。对于appendRow()

请从以下位置修改

来自:
getNewContent()
至 :
var toText = '</div>';

2。对于var toText = '</content>';

请进行如下修改。

SAVE_DATA()

注意:

  • 在此修改中,我将function SAVE_DATA() { var sheet = SpreadsheetApp.openById('1No3m_FnhyxIaxj2zSlbHrg8HLBJULGQ2bda65hpKlyY').getSheetByName('sample'); var content = getNewContent(); var title = getNewTitle(); var link = getNewLink(); var values = title.map(function(e, i){return [e, link[i], content[i]]}); sheet.getRange(sheet.getLastRow() + 1, 1, values.length, values[0].length).setValues(values); } 用于var toText = '</content>';。如果要检索网站的其他范围,请对此进行修改。
  • 关于URL,已设置标题的getNewContent()。但是为链接和内容设置了limit=100。因此,当检索值并将其放入电子表格时,链接和内容在11行中变得不确定。
    • 如果您已经知道这一点,请忽略此。

参考:

如果我误解了你的问题,对不起。