Google Apps Script(GAS)スクレイピングのブログ

Google Apps Script(GAS)スクレイピングのブログ、クローラー、クロール、VBA、RPA、AI、機械学習、ディープラーニング、人工知能、自動化、業務効率化

値をメール送信する

今回は値をメール送信する方法の説明です。

定期的にスクレイプしたデータや、エラーが発生したときにメールを送信するようにしておくと便利です。

function myFunction() {
  
  MailApp.sendEmail({
    
    //送信先
    to: 'xxxxxxxxxxxxxx@gmail.com',
    
    //メール件名
    subject: 'subject',
    
    //メール本文
    body: 'body',
    
  });
  
}

簡単ですね!

値をテキストファイルに書き出す

今回は値をテキストファイルに書き出したいと思います。

書き出すフォルダのIDは、https://drive.google.com/drive/u/1/folders/から右側の部分です。約40文字ぐらいの文字列です。

f:id:koyai:20190131200845p:plain

文字列をxxxxxxxxxxxxxxxxxxxxxxxxxxxxにコピペします。

function myFunction() {
   
  //書き出すフォルダIDを指定
  var folder = DriveApp.getFolderById('xxxxxxxxxxxxxxxxxxxxxxxxxxxx');
  
  //ファイル書き出し
  folder.createFile('fileName', 'filebody!', MimeType.PLAIN_TEXT);
 
}

なんて簡単!実行しフォルダをみると、ファイルが書き出されています!

f:id:koyai:20190131201203p:plain

ファイルを開けてみると、うまくいってます。

f:id:koyai:20190131201946p:plain

値をスプレッドシートから読み込む

今回はスプレッドシートからセルの値を読み込みたいと思います。

「Sheet1」シートのA1とA2の値を読み込みます。

f:id:koyai:20190131192047p:plain

以下がスクリプトとなります。

function myFunction() {
    
  //対象シートを指定
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  
  //値を読み込む
  var str1 = sheet.getRange(1, 1).getValue();
  var str2 = sheet.getRange(2, 1).getValue();
  
  Logger.log(str1);
  Logger.log(str2);
  
}

ログ見てみ見ると、、うまくいっています!簡単ですね!

f:id:koyai:20190131191823p:plain

複数のページから複数の項目取得

今回は複数のページから複数の項目を取得したいと思います。前回もお世話になったwikipediaさんのページを取得します。

大量のページを取得する場合、どうしても対象のサーバーに負荷をかけることになります。

そのため各個人の常識が求められます。他人に迷惑をかけてはいけません。サーバーにも迷惑をかけてはいけませんよね!

ここでURLを見てましょう。

https://ja.wikipedia.org/wiki/1

「1」のページURLを見ると最後のパスが「1」になっています。ここを「2」にすると「2」のページのURLになります。ブラウザで確認しましょう。

https://ja.wikipedia.org/wiki/2
f:id:koyai:20190130174746p:plain

はい、URLを一部変えることで1と2、3のページを取得できそうです!

function myFunction() {

  //urlを指定
  var url = 'https://ja.wikipedia.org/wiki/';
  
  //3回ループを繰り返し
  for(var i=1; i<=3; i++){
    
    //htmlソースを取得
    var response = UrlFetchApp.fetch(url + i).getContentText();
    
    //配列を初期化
    var array = [];
    
    //取得する目次1のタブを指定
    var Regexp = /<span class=\"tocnumber\">1<\/span> <span class=\"toctext\">([\s\S]*?)<\/span/;
    var mokuji1 = response.match(Regexp)[1];
    array.push(mokuji1);
    
    //取得する目次2のタブを指定
    var Regexp = /<span class=\"tocnumber\">2<\/span> <span class=\"toctext\">([\s\S]*?)<\/span/;
    var mokuji2 = response.match(Regexp)[1];
    array.push(mokuji2);//配列に追加
    
    //取得する目次3のタブを指定
    var Regexp = /<span class=\"tocnumber\">3<\/span> <span class=\"toctext\">([\s\S]*?)<\/span/;
    var mokuji3 = response.match(Regexp)[1];
    array.push(mokuji3);//配列に追加
    
    //取得する目次4のタブを指定
    var Regexp = /<span class=\"tocnumber\">4<\/span> <span class=\"toctext\">([\s\S]*?)<\/span/;
    var mokuji4 = response.match(Regexp)[1];
    array.push(mokuji4);//配列に追加
    
    //取得する目次5のタブを指定
    var Regexp = /<span class=\"tocnumber\">5<\/span> <span class=\"toctext\">([\s\S]*?)<\/span/;
    var mokuji5 = response.match(Regexp)[1];
    array.push(mokuji5);//配列に追加
    
    Logger.log(array);
  }
}

ログとみてみましょう!うまくいっています!

f:id:koyai:20190130152028p:plain

1ページから複数の項目を取得

今回は、1ページから複数の項目を取得する方法を説明します。

Wikipediaさんから「1」を説明したページの目次1,2,3,4,5を出したいと思います。

https://ja.wikipedia.org/wiki/1

f:id:koyai:20190130143328p:plain

前回と同じように右クリックをし、ソースを覗きます。

f:id:koyai:20190130143608p:plain

目次の1で欲しいのは、「数としての1」という文字列部分です。検索すると出てきます。

<span class="tocnumber">1</span> <span class="toctext">数としての1</span

ここのタブ部分をとれば、目次1が取得できそうです。目次の2は、

<span class="tocnumber">2</span> <span class="toctext">数字としての1</span

を取得すれば、うまくいきそうです。同様に3,4,5のタブを取得していきます。

function myFunction() {

  //urlを指定
  var url = 'https://ja.wikipedia.org/wiki/1';
  
  //htmlソースを取得
  var response = UrlFetchApp.fetch(url).getContentText();
  
  //配列を初期化
  var array = [];
  
  //取得する目次1のタブを指定
  var Regexp = /<span class=\"tocnumber\">1<\/span> <span class=\"toctext\">([\s\S]*?)<\/span/;
  var mokuji1 = response.match(Regexp)[1];
  array.push(mokuji1);
  
  //取得する目次2のタブを指定
  var Regexp = /<span class=\"tocnumber\">2<\/span> <span class=\"toctext\">([\s\S]*?)<\/span/;
  var mokuji2 = response.match(Regexp)[1];
  array.push(mokuji2);//配列に追加
  
  //取得する目次3のタブを指定
  var Regexp = /<span class=\"tocnumber\">3<\/span> <span class=\"toctext\">([\s\S]*?)<\/span/;
  var mokuji3 = response.match(Regexp)[1];
  array.push(mokuji3);//配列に追加
  
  //取得する目次4のタブを指定
  var Regexp = /<span class=\"tocnumber\">4<\/span> <span class=\"toctext\">([\s\S]*?)<\/span/;
  var mokuji4 = response.match(Regexp)[1];
  array.push(mokuji4);//配列に追加
  
  //取得する目次5のタブを指定
  var Regexp = /<span class=\"tocnumber\">5<\/span> <span class=\"toctext\">([\s\S]*?)<\/span/;
  var mokuji5 = response.match(Regexp)[1];
  array.push(mokuji5);//配列に追加
  
  Logger.log(array);
  
}

長くなってしまいましたが、うまくいっています!

f:id:koyai:20190130145439p:plain

1ページから複数の値を取得

今回は、1ページから複数の値をWebスクレイピングしたいと思います。

はてなブログのトップページには、複数の記事が並んでいます。そこで、複数あるブログ名を取得したいと思います。

f:id:koyai:20190129151548p:plain

htmlソースを覗く

chromeの場合、右クリックでページのソースを表示することができます。

f:id:koyai:20190129153445p:plain

htmlソースの中身をみると、はてなブログは、

<div class="serviceTop-blog-title">

のタグの後に記事のタイトルが来ていることが分かります。

ブラウザで検索をかけると30個存在するようです。

f:id:koyai:20190129165654p:plain

これをキーにしてスクラッチします。

function myFunction() {

   //urlを指定
   var url = 'https://hatenablog.com/';
   
   //htmlソースを取得
   var response = UrlFetchApp.fetch(url).getContentText();
   
   //取得するタブを指定
   var titleRegexp = /<div class=\"serviceTop-entry-title\">([\s\S]*?)<\/a/gm;
   
   //配列で複数のブログタイトルを取得
   var title = response.match(titleRegexp);
   
   //不要な部分を整形
   for(var i=0; i < title.length; i++){
     
     //切り取る位置を指定
     var from = title[i].lastIndexOf('>');
     var to = title[i].lastIndexOf('<');
     
     //対象部分を取得
     title[i] = title[i].substr(from +1,to -from -1);
   }
   
   Logger.log(title);
  
}

30個あるタイトルが配列で取得できています!

f:id:koyai:20190129172049p:plain

1ページから1つの値を取得

GASは簡単にWebスクレイピングが実現できます。

今回ははてなブログのトップページからタイトルをスクレイピングします。

function myFunction() {

  //urlを指定
  var url = 'https://hatenablog.com/';

  //htmlソースを取得
  var response = UrlFetchApp.fetch(url).getContentText();
  
  //正規表現でtitleタグを指定
  var myRegexp = /<title>([\s\S]*?)<\/title>/;
  
  //タイトルを取得
  var title = response.match(myRegexp)[1];
  
  Logger.log(title);

}

ログを見てみるとページタイトルが取得できています。簡単ですね!

f:id:koyai:20190129144507p:plain




 

値をスプレッドシートに書き出す

今回はGASからスプレッドシートに値を書き出します。

function myFunction() {
  
  //対象シートを指定
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  
  //値を書き出す
  sheet.getRange(1, 1).setValue('A1');
  sheet.getRange(2, 1).setValue('A2');
  
}

実行後、スプレッドシートを見ると書き出されていることが分かります。
f:id:koyai:20190130155352p:plain



 



 

自己紹介

はじめまして!

私のブログへようこそ!

 

趣味でGoogleAppsScript(GAS)を使ったアプリを作成しております。

某通信会社(東証一部上場)でGASの社内研修を受け虜になりました。

GASは開発場所を選ばないところが大変気に入っています。

 

日本一のGASスクレイパーになるため技術を一部公開しております。

お仕事のご依頼はお気軽に!