Google Apps Scriptでスクレイピング !
Google スプレッドシートのスクリプトであるGoogle Apps Script(GAS)を使ってスプレッドシートを連携、操作、表示させて見ます。以下のサイトがわかりやすく説明してありますので参考にさせていただきました。
まず、Google スプレッドシートのスクリプトであるGoogle Apps Script(GAS)の使い方については
GASを使ってのスクレイピング をやってみます。
GASは基本的なところはJavaScriptなので使いやすいです。Gasの新しエディタを使って書いていきます。
今回はスクリピングというものをやっていきます。これはあるホームページの一部分を取り出してきて、何かしら処理をすること。今回は動画でも紹介されているYahooニュースの一覧のデータを取り出してスプレッドシートに書き出します。
GASのコードを書いていくのですが、基本的にはGoogleのGAS専用のエディタでの操作となります。
上部にある保存、実行と左側にあるライブラリを使っていきます。
GASでまず必要なのが"function"です。
function getText(){}
今回はgetText()という関数を作ります。まず保存してスタートします。
function getText(){
const url = "https://news.yahoo.co.jp/";
const content = UrlFetchApp.fetch(url).getContentText();
これで"yahooニュース"のサイトを定数 contentとして取得します。
スクリピングをしたいのですがここで便利なライブラリ"Cheerio"を使います。そしてそのライブラリの導入の方法でですが以下で詳しく説明されています。
導入が終われば後は使っていくだけです。
const $ = Cheerio.load(content)
let getData = []
取得した"content"ですが"Cheerio"で使えるようにします。そしてデータを入れる配列を作ります。
そして肝心なyhooニュースのホームページの一部の取得ですが、これが一番肝心。ホームページを作るときに必要なクラスを指定してデータを取り出します。ホームページの構造などは
手前味噌ですが参考にしてもらえればと思います。
そしてyahooニュースのページをインスペクタで見るとHTMLが出てくるので、このニュースのタグを探します。矢印で示している<ul>,<li>の部分ですそしてclassは"sc-esjQYD"となっています。
これを使います。
$('.sc-esjQYD').each((i,element) => {
getData.push($(element).text())
})
これで変数"getData"にデータが入っていきます。取得したデータをスプレッドシートに反映させます。ここで、大事なのがスプレッドシートのidですが以下の通りになります。
スプレッドシートのURLは次のような形式となり、「スプレッドシートID」「シートID」の箇所がそれぞれのIDとなります。
https://docs.google.com/spreadsheets/d/スプレッドシートID/edit#gid=シートID
スプレッドシートを指定するコードは
const spreadsheet = SpreadsheetApp.openById("自分のgoogleスプレッドシートのid")
となり、そのシート名も指定します。
const sheet = spreadsheet.getSheetByName('シート1')
後はfor文で取得したデータを取り出してスプレッドシートの指定の位置
( i + 1, 1 )
に表示させます。
全体です。
function getText(){
const url = "https://news.yahoo.co.jp/";
const content = UrlFetchApp.fetch(url).getContentText();
const $ = Cheerio.load(content)
let getData = []
$('.sc-esjQYD').each((i,element) => {
getData.push($(element).text())
})
const spreadsheet = SpreadsheetApp.openById("自分のgoogleスプレッドシートのid")
const sheet = spreadsheet.getSheetByName('シート1')
for (let i = 0 ;i <= getData.length;i++){
sheet.getRange(i + 1,1).setValue(getData[i])
}
}