0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GASでスクレイピングを基本動作やってみる。解説付き。

Last updated at Posted at 2020-03-15

スプレッドシートに項目を追加します。
左上から【ファイル】、【編集】、、という感じで、【スクリプト実行】という項目が現れます。onOpen関数は、スプレッドシートを開いた時に実行されるイベントハンドラですね。

コード.gs
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [
    {
      name : "タイトルを取得する",
      functionName : "update"
    }
  ];
  sheet.addMenu("スクリプト実行", entries);
}

そして、基本的な流れですね。シートのセル情報を2次元配列に格納します。
スプレッドシートのAPI操作はかなり遅いです。
なので、
①【セル情報をシートでまとめて取得する】
②【GAS側でまとめて配列処理する】
③【配列をシートにまとめて格納する】
としています。

コード.gs
function update(){
  var urls = [];
  var titles =[];

  var sheet = SpreadsheetApp.getActive().getSheetByName('シート1');
  var sheet_data = sheet.getDataRange().getValues();    // シート全体のデータを取得する。dataにはシートのデータが2次元配列で入る

  Logger.log("data.length:", sheet_data.length);

  urls = getUrls(sheet_data);
  sheet_data = getTitles(sheet_data, urls);
  setSheet(sheet_data, sheet);
}

配列からURLのデータを抜き出すところです。

コード.gs
function getUrls(sheet_data){

  var urls = [];                                  // URL列のURLを格納する
  const urlColumnIndex = 0;                         // URL列を指定する
  Logger.log("sheet_data.length:" + sheet_data.length);
  
  for (var i = 0; i < sheet_data.length; i++) {
    urls.push(sheet_data[i][urlColumnIndex]);
    Logger.log("url:", urls[i]);
  }
  return urls;
}

ここが今回のキモですね。
スクレイピングします。
抜き出したいところを【beginning_tag】と【ending_tag】で挟まれるように指定します。下の例は、【ほにゃらら】を抜き出します。

コード.gs
function getTitles(sheet_data, urls) {

  // <title> ほにゃらら</title>;

  var beginning_tag = "<title>";
  var beginning_index;

  var ending_tag = "</title>";
  var ending_index;

  var html;
  var url;
  var titles = [];
  const titleColumnIndex = 1;     // タイトル列を指定する
  
  for (var i = 0; i < urls.length; i++) {
    url = urls[i];
    
    if (i==0 && url == "URL"){
      titles[i] = "タイトル";
    }
    if (url !== "URL"){
      html = UrlFetchApp.fetch(url).getContentText('UTF-8');
      beginning_index = html.indexOf(beginning_tag);
      ending_index = html.indexOf(ending_tag);        
      if (beginning_index !== -1 && ending_index !== -1) {
        titles[i] = html.substring(beginning_index + beginning_tag.length, ending_index);
      }
    }
    Logger.log("title:", titles[i]);
  }
  
  for(i=0; i<titles.length; i++){
    sheet_data[i][titleColumnIndex] = titles[i];
  }
  
  return sheet_data;
}

最後にシートにスクレイピングした文字列を格納する作業です。
ここも時間短縮するために、配列をまとめてスプレッドシートに格納してます。
コードも見易くなりますね。

コード.gs
function setSheet(sheet_data,sheet){
  
  const LastRow = sheet.getDataRange().getLastRow();  
  const LastCol = sheet.getDataRange().getLastColumn();  
  
  sheet.getRange(1,1,LastRow,LastCol).setValues(sheet_data);
}

URLがA列、タイトルがB列ですね。
image.png

0
1
0

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
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?