Исключение: служба вызывается слишком много раз за один день: urlfetch - PullRequest
0 голосов
/ 09 июля 2020

Я создал сценарий в Google Таблицах, который работает хорошо, но через некоторое время я получаю следующую ошибку: Исключение: Служба вызывается слишком много раз в течение одного дня: urlfetch

Кажется, я вызвал работает как 200-300 раз в день, для того, что я проверил, он должен быть ниже предела.

Я читал, что мы можем использовать кеш, чтобы избежать этой проблемы, но не знаю, как использовать его в моем коде.

function scrapercache(url) {
    var result = [];
    var description;
    var options = {
        'muteHttpExceptions': true,
        'followRedirects': false,
    };
  
var cache = CacheService.getScriptCache();
var properties = PropertiesService.getScriptProperties();

try {  
  let res = cache.get(url);

  if (!res) {
    // trim url to prevent (rare) errors
    url.toString().trim();
    var r = UrlFetchApp.fetch(url, options);
    var c = r.getResponseCode();

    // check for meta refresh if 200 ok
    if (c == 200) {
      var html = r.getContentText();
      cache.put(url, "cached", 21600);
      properties.setProperty(url, html);

      var $ = Cheerio.load(html); // make sure this lib is added to your project!

      // meta description
      if ($('meta[name=description]').attr("content")) {
        description = $('meta[name=description]').attr("content").trim();
      }
    }
  
    result.push([description]);    
  }
} 
catch (error) {
  result.push(error.toString());
} 
finally {
  return result;
}
 
}

как я могу использовать такой кеш для улучшения моего скрипта, пожалуйста?

var cache = CacheService.getScriptCache();
  var result = cache.get(url);
  if(!result) {
    var response = UrlFetchApp.fetch(url);
    result = response.getContentText();
    cache.put(url, result, 21600);

Заранее спасибо

1 Ответ

0 голосов
/ 09 июля 2020

Ответ:

Вы можете реализовать CacheService и PropertiesService вместе и получить URL-адрес снова только через указанное время.

Изменение кода:

Имейте в виду, что дополнительные вызовы для получения кеша и свойств замедлят вашу функцию, особенно , если вы делаете это несколько сотен раз.

Как значения размер кэша может составлять максимум 100 КБ , мы будем использовать CacheService, чтобы отслеживать, какие URL-адреса должны быть получены, но PropertiesService для хранения данных.

Вы можете отредактируйте блок try следующим образом:

var cache = CacheService.getScriptCache();
var properties = PropertiesService.getScriptProperties();

try {  
  let res = cache.get(url);

  if (!res) {
    // trim url to prevent (rare) errors
    url.toString().trim();
    var r = UrlFetchApp.fetch(url, options);
    var c = r.getResponseCode();

    // check for meta refresh if 200 ok
    if (c == 200) {
      var html = r.getContentText();
      cache.put(url, "cached", 21600);
      properties.setProperty(url, html);

      var $ = Cheerio.load(html); // make sure this lib is added to your project!

      // meta description
      if ($('meta[name=description]').attr("content")) {
        description = $('meta[name=description]').attr("content").trim();
      }
    }
  
    result.push([description]);    
  }
} 
catch (error) {
  result.push(error.toString());
} 
finally {
  return result;
}

Надеюсь, это будет вам полезно!

Ссылки:

Связанные вопросы:

...