【GAS】sitemap.xmlをスクレイピングしてスプレッドシートにURLリストとして書き出す


sitemap.xmlをスクレイピングして、スプレッドシートに書き出しておけば、そこからBotでTwitterとかにコンテンツ投稿できたりするので、何となく便利かなーと思い作りました。

Google Apps ScriptでXMLをパースする際は、XmlServiceクラスが用意されているので、このクラスを使用して取得処理を実装します。

XmlServiceクラスに関する詳しい事はこちらの公式リファレンスで。

実装手順

スクリプトエディタを開きます。

以下のコードを書いて実行します。

function getxml() {
  var sitemapUrl = "ここにsitemap.xmlのUrl";
  var xmlString = "http://www.sitemaps.org/schemas/sitemap/0.9";

  var xmlText = UrlFetchApp.fetch(sitemapUrl).getContentText();
  var document = XmlService.parse(xmlText);
  var xmlProtocol = XmlService.getNamespace(xmlString);
  var urlEntries = document.getRootElement().getChildren('url', xmlProtocol);

  var sheet = SpreadsheetApp.getActive().getSheetByName('シート1');
  var urlArray = [];

  for (var urlIndex= 0; urlIndex < urlEntries.length; urlIndex++) {
    if(urlIndex == 0 || urlIndex == 1){
      urlIndex = urlIndex + 1;
    }
    // シートに書き込む
    var rIndex = "A" + urlIndex;
    sheet.getRange(rIndex).setValue(urlEntries[urlIndex].getChild('loc', xmlProtocol).getText());
  }
}

細かく見ていきましょう。

var xmlText = UrlFetchApp.fetch(sitemapUrl).getContentText();
var document = XmlService.parse(xmlText);

UrlFetchAppクラスのparseメソッドでXMLを取得して、XmlServiceのparseメソッドでXMLをパースします。

var xmlProtocol = XmlService.getNamespace(xmlString);
var urlEntries = document.getRootElement().getChildren('url', xmlProtocol);

でドキュメント全体の構造を取得し、getChildren()で目的のurl要素を抽出します。

  var sheet = SpreadsheetApp.getActive().getSheetByName('シート1');
  var urlArray = [];

  for (var urlIndex= 0; urlIndex < urlEntries.length; urlIndex++) {
    if(urlIndex == 0 || urlIndex == 1){
      urlIndex = urlIndex + 1;
    }
    // シートに書き込む
    var rIndex = "A" + urlIndex;
    sheet.getRange(rIndex).setValue(urlEntries[urlIndex].getChild('loc', xmlProtocol).getText());
  }

あとは取得したURLリストをシートのA列に書き出すだけです。
以下がシートに出力した結果です。

あとは、このURLリストを煮るなる焼くなり。
BotでSNSに定期投稿しても良いでしょう。

まとめ

いかがでしたでしょうか?

Google Apps ScriptでのXMLのパースは、便利で簡単なので、やり方を覚えておくと色々な場面で応用がきくと思います。ぜひ試してみませんか。