search
LoginSignup
4
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

GASでgoogleトレンドのRSSを取得しスプレッドシートに保存

この記事でやること

googleトレンドの情報を長期にわたって保存したいなあと思っていたんですがapiないしなあと困っていたところRSSはあったのでこれで毎日取得して保存していくことに。1年間とかの長期で検索のトレンドを追えるようにする

仕様

  • RSSを毎日取得
    • 定期実行はスケジュールで
  • googleスプレッドシートに保存

googleの例文解読

// Log the title and labels for the first page of blog posts on the G Suite Developers blog.
function parseXml() {
  var url = 'https://gsuite-developers.googleblog.com/atom.xml';
  var xml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');

  var entries = root.getChildren('entry', atom);
  for (var i = 0; i < entries.length; i++) {
    var title = entries[i].getChild('title', atom).getText();
    var categoryElements = entries[i].getChildren('category', atom);
    var labels = [];
    for (var j = 0; j < categoryElements.length; j++) {
      labels.push(categoryElements[j].getAttribute('term').getValue());
    }
    Logger.log('%s (%s)', title, labels.join(', '));
  }
}

  • UrlFetchApp.fetch()これでurlの中身を取りにいっている。
  • getContentTextはUrlFetchApp.fetch()で帰ってきたもののstring(ここではxml)を取得する
  • getRootElementで全体のnodeを指定し、getChildrenでその中のentrynodeを指定している
  • namespaceで指定されている場合はnamespaceを設定しないといけない。( https://www.terakoya.work/gas-spreadsheet-get-xml-part1/

RSSの取得

googletrendRSSの仕様

実際に取得するコードを書いてみた

  // url設定

  var url = 'https://trends.google.co.jp/trends/trendingsearches/daily/rss?geo=JP';

  // namespace設定

  var namespace = XmlService.getNamespace("ht",'https://trends.google.co.jp/trends/trendingsearches/daily');

  // rss取得

  var xml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var channel = root.getChild("channel");
  var items = channel.getChildren("item");
  • urlからUrlFetchApp.fetch(url).getContentText()でxmlを取得
  • XmlService.parseでparseする
  • document.getRootElement();でrootからごっそり取ってくる
  • root.getChild("channel");今回channelは一つなのでchildで複数ならchildren
  • var items = channel.getChildren("item")は複数なので配列

titleなどの取得

上記でitemごとに配列で取得できている状態なので各itemの配列からtitleなどを取っていく

    var title = items[i].getChildText("title");
    var traffic = items[i].getChildText("approx_traffic",namespace);

googleスプレッドシートへの保存

  // sheetに記入

  var sheet = SpreadsheetApp.getActiveSheet();
  var length = items.length;
  var today = new Date();
  var Month = today.getMonth() + 1;

  for(var i = 0; i < length; i++) {

    var lastRow = sheet.getLastRow();  
    var title = items[i].getChildText("title");
    var traffic = items[i].getChildText("approx_traffic",namespace);

    // 1記事のみ取得なのでgetChild

    var news_title = items[i].getChild("news_item",namespace).getChildText("news_item_title",namespace);
    var news_link = items[i].getChild("news_item",namespace).getChildText("news_item_url",namespace);

    sheet.getRange(lastRow+1, 1).setValue(today.getFullYear() + "/" +  Month + "/"+ today.getDate()+ "/" + today.getHours() + ":00");
    sheet.getRange(lastRow+1, 2).setValue(title);
    sheet.getRange(lastRow+1, 3).setValue(traffic);
    sheet.getRange(lastRow+1, 4).setValue(news_title);
    sheet.getRange(lastRow+1, 5).setValue(news_link);
  }
  • sheetを定義する
  • lastRowを取得し、for文で回すたびに一番下のrowを取ってきてその一つ下に追記していく

全体図

function getgoogletrend() {

  // url設定

  var url = 'https://trends.google.co.jp/trends/trendingsearches/daily/rss?geo=JP';

  // namespace設定

  var namespace = XmlService.getNamespace("ht",'https://trends.google.co.jp/trends/trendingsearches/daily');

  // rss取得

  var xml = UrlFetchApp.fetch(url).getContentText();
  var document = XmlService.parse(xml);
  var root = document.getRootElement();
  var channel = root.getChild("channel");
  var items = channel.getChildren("item");

  // sheetに記入

  var sheet = SpreadsheetApp.getActiveSheet();
  var length = items.length;
  var today = new Date();
  var Month = today.getMonth() + 1;

  for(var i = 0; i < length; i++) {

    var lastRow = sheet.getLastRow();  
    var title = items[i].getChildText("title");
    var traffic = items[i].getChildText("approx_traffic",namespace);

    // 1記事のみ取得なのでgetChild

    var news_title = items[i].getChild("news_item",namespace).getChildText("news_item_title",namespace);
    var news_link = items[i].getChild("news_item",namespace).getChildText("news_item_url",namespace);

    sheet.getRange(lastRow+1, 1).setValue(today.getFullYear() + "/" +  Month + "/"+ today.getDate()+ "/" + today.getHours() + ":00");
    sheet.getRange(lastRow+1, 2).setValue(title);
    sheet.getRange(lastRow+1, 3).setValue(traffic);
    sheet.getRange(lastRow+1, 4).setValue(news_title);
    sheet.getRange(lastRow+1, 5).setValue(news_link);
  }
}


Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4
Help us understand the problem. What are the problem?