Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@you8

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);
  }
}


2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
you8
普段はSNSのプロダクトマネージャーをしています。広告とかチーム運営とかについてはここ( http://you88.space/ )。日曜大工的に個人開発しています。( https://twitter.com/you8802 )
nana-music
音楽SNSサービス「nana」の開発・運営を行っているスタートアップ

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?