Google Apps Script 時短ツール

【簡単自動化】GASでWebスクレイピングをする方法

お仕事おつにゃッス🐈

文系未経験から社内SEになった、あっきょ(@daily_code_JP)です!

インターネット上で公開されているデータを自動で収集できると便利ですよね?

また、いちいちデータをコピペする作業は面倒くさいですよね。この記事ではそのお悩みを、スプレッドシートとGASで解決します。

あっきょ
この記事は以下で悩んでいる人におすすめ!

  • データ収集を自動化したい
  • コピペする時間を減らして作業を楽にしたい
  • JavaScriptを学んだけど何をつくればいいかわからない

誰でも無料で簡単にできますので、お気軽に学んでいきましょう!

GASでWEBスクレイピングするイメージ

GASでYahoo!ニュースの経済項目をスクレイピングします。

コピペの繰り返すことなく、1クリックですべての作業が終わります。

今回は記事のタイトルのみを抽出し、ログ出力するようにします。

スクレイピングとは?

サンプルコードを紹介する前に、スクレイピングとは何かを解説していきます。

Web上のデータを自動で取得する技術

スクレイピングとは、WEB上に存在するデータを自動的に取り出して保存する技術です

競合調査や分析など、大規模にデータを処理するときに使用します。

データ収集から保存までの一連の作業を自動化すると手間と作業時間を大いに減らせます。

なので、1クリックで必要な情報をすべて手に入るのがスクレイピングといえます。

スクレイピングで気を付けること

スクレイピングを行うには運営サイトが許可しているかを確かめる必要があります。

サーバーへの過度な負荷や抽出したデータの著作権侵害の可能性があるためです

スクレイピングの許可は公開されているYahoo!のrobot.txtを確認します。

記事タイトルを得ること自体は問題なさそうですが、過度にスクレイピングするのは厳禁です。

Yahoo!のrobot.txt
引用 : Yahoo!

スクレイピングが原因の事件

岡崎市立中央図書館
引用 : 岡崎市立中央図書館

過度なスクレイピングで刑事事件になったことがあります。

2010年の岡崎市立中央図書館事件です。

利用者からサイトに接続できないと苦情が相次いでいましたが、とある男性が図書館の蔵書検索システムに自作のクローラを実行して図書情報を取得していたのが原因でした。

男性はサーバコンピューターの機能を停止させたとして業務妨害で逮捕されてしまいました。

GASの利用者は過度なスクレイピングをしないと信じていますが、便利だからといって使いすぎるのはご法度です。

他社サービスに迷惑をかけず、robot.txtをしっかりと確認してからスクレイピングしましょう。

GASでWebスクレイピングをする準備

Google Apps Script で日本の株価を取得する準備をします。ファイルは1つ必要です。

必要なファイル

  • Google スプレッドシート ・・・ 株式データの保存と株価のリアルタイム更新

サンプルコードを貼り付ける方法

サンプルコードはGoogle スプレッドシートにコピペします。

上バーの「拡張機能」の中にある「Apps Script」をクリック。ここにコードを書きます。

GASをスプレッドシートに記入する際の「Apps Script」の表示

Parserライブラリの導入

GASでスクレイピングを行うには「Parserライブラリ」をダウンロードする必要があります。

コードを貼り付けるApps Scriptの左側にある「ライブラリ」をクリックします。

ライブラリの選択

スクリプトIDに1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw」と記入して検索ボタンをクリック。

Parserライブラリの選択

Parserのバージョン8を導入します。確認できたら、追加ボタンを押すと準備は完了です。

Parserライブラリを導入

GASでWebスクレイピングするサンプルコード

GASでWebスクレイピングするサンプルコードを紹介していきます。

解説の項目

  • サンプルコード
  • buildメソッド と iterateメソッドの違い
  • 【質問】コード内のdivやulは何?

サンプルコード

サンプルコードの全体です。右上にあるマークを押すとコードのコピペが一瞬でできます。

この短いコードでスクレイピングができます。

function getNewsTitle(){
  const url = "https://news.yahoo.co.jp/categories/business"; //スクレイピング先URL
  const html = UrlFetchApp.fetch(url).getContentText(); //fetch通信でサイト内の文章を取得
  const topicsDiv = Parser.data(html).from('<div class="sc-fhiYOA lmAaIt">') .to("</div>").build(); //ul要素を抽出
  const topicsUl = Parser.data(topicsDiv).from('<ul>').to("</ul>").build(); //li要素を抽出
  const topicsA = Parser.data(topicsUl).from('class="sc-btzYZH kitJFB"').to('>').iterate(); //記事タイトルを抽出

   //取得した記事数ぶん、タイトルをログ出力
   for(let i = 0; i < topicsA.length; i++){
    //不必要な文字列を取り除いて記事タイトルを出力
    Logger.log(topicsA[i].replace(/<span class="sc-bYSBpT kVZVlG"|>/g,"").replace('</a',"")); 
  }
}

buildメソッド と iterateメソッドの違い

サンプルコードでは記事タイトルを抽出するのに2つのメソッドを使いましたが、違いは何でしょうか?

buildメソッドiterateメソッドの違いは要素を抽出する範囲です。

  • buildメソッド   ・・・ 1番最初の要素のみを抽出
  • iterateメソッド ・・・ 該当する要素をすべて抽出

文字だけではわからないので、以下のコードからli要素を抽出して違いを見ていきます。

function test(){
  const html = '<ul class="season"><li>春</li><li>夏</li><li>秋</li><li>冬</li></ul>';
}

buildメソッド

function test(){
  const html = '<ul class="season"><li>春</li><li>夏</li><li>秋</li><li>冬</li></ul>';
  const data = Parser.data(html).from('<li>').to('</li>').build();

  Logger.log(data); //春を出力
}

1番最初のli要素内にあった「春」のみを出力します。

つまり、先頭の要素だけを抽出します。

iterateメソッド

function test(){
  const html = '<ul class="season"><li>春</li><li>夏</li><li>秋</li><li>冬</li></ul>';
  const data = Parser.data(html).from('<li>').to('</li>').iterate();

  Logger.log(data); //[春,夏,秋,冬]を出力
}

ul要素内のli要素をすべて取得し、その中の文字列をすべて抽出します。

抽出後、dataは配列に変換されてli要素内の文字列を格納します。

【質問】コード内のdivやulは何?

HTMLのイメージ

今回紹介したコードの中には「div」や「ul」などの文字が見られ、GASには存在しないコードになります。

これはHTML(HyperText Markup Language)というWebサイトを作成するために開発された言語で、ページ内の情報を構造化したものです。

スクレイピングでは、この構造化したHTMLを読み取ってタイトルを抽出しています。

テックアカデミーでは、無料体験でHTMLを学ぶことができます。

2分で簡単登録できるので、さらにスキルアップするならぜひご活用ください。

2分の簡単登録でHTML&CSSを無料体験!

GASでWebスクレイピングするテスト

実際に、スプレッドシートで文字列を検索します。

Apps Scriptの上バーの文字が「getNewsTitle」になっていたら、「実行」を押します。

getNewsTitleを実行

「このアプリはGoogleで確認されていません」と表示される場合はこちら

【3分で解決】GASの「このアプリはGoogleで確認されていません」を許可する方法

続きを見る

以下のようにログ出力されたら成功です。ニュース記事のタイトルをすべて抽出できました。

getNewsTitleの実行結果

【応用】取得したデータをスプシに記入する方法

応用で取得したデータをスプレッドシートに記入して保存できるようにします。

内容はほとんど変わりません。コメントに「★」がついた2行を追加するだけで実現します。

function getNewsTitle(){
  const sheet = SpreadsheetApp.getActiveSheet(); //★アクティブ状態のシートを指定
  const url = "https://news.yahoo.co.jp/categories/business"; //URL
  const html = UrlFetchApp.fetch(url).getContentText(); //fetch通信でサイト内の文章を取得
  const topicsDiv = Parser.data(html).from('<div class="sc-fhiYOA lmAaIt">') .to("</div>").build(); //ul要素を抽出
  const topicsUl = Parser.data(topicsDiv).from('<ul>').to("</ul>").build(); //li要素を抽出
  const topicsA = Parser.data(topicsUl).from('class="sc-btzYZH kitJFB"').to('>').iterate();

  //取得した記事数ぶん、タイトルをログ出力
   for(let i = 0; i < topicsA.length; i++){
    //不必要な文字列を取り除いて記事タイトルを出力
    const topic = topicsA[i].replace(/<span class="sc-bYSBpT kVZVlG"|>/g,"").replace('</a',"");
    sheet.getRange(i+1, 1).setValue(topic); //★i+1番目に文字列を記入
  }
}

実行結果は以下の通りです。Yahoo!ニュースの記事タイトルをスプレッドシートに保存できているのがわかります。

GASのWebスクレイピングでスプレッドシートに保存した結果

【無料で便利】スクレイピングで日本株の管理を楽に

GASのスクレイピングを利用して、日本株の株価を自動で取得できます。

スプレッドシートで銘柄管理したり、損益を計算したい投資家には最適のツールになります。

どれも無料かつ誰でも利用できるので、ぜひご活用ください。

もちろん、コピペOKです!

【不安解消】GASでLINEに日本株の1日の値動きを通知

続きを見る

【便利】GASで日本の個別株の株価を取得する方法

続きを見る

おわりに | スクレイピングで業務を自動化しよう

以上がGoogle Apps ScriptでWebスクレイピングをする方法でした。

そのままコピペして日常業務で使いやすいように改修したり、プログラミングの練習や動作確認用に使ってみましょう。

GASでさらに業務効率化したい場合、参考書やプログラミングスクールを使うとあなた自身でアプリを作るスキルが身に付きます

プログラミング未経験者にもわかりやすく解説しています。

GASユーザーのあっきょがおすすめの勉強方法はこちら↓

次回の記事もご期待ください!

-Google Apps Script, 時短ツール
-, , , , , , , , , , , , , , , ,