この記事でやること
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の仕様
- atom
- xmlns:ht="https://trends.google.co.jp/trends/trendingsearches/dailyとあるのでhtのnamespaceを設定( https://www.terakoya.work/gas-spreadsheet-get-xml-part1/ )
実際に取得するコードを書いてみた
// 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);
}
}