Google Apps Script(GAS)のウェブスクレイピングに関する情報は、ウェブ上で数多く紹介されています。
しかし、ちょっとモノ足りないと感じることがあります。
理由1|基本的な情報が多い
理由2|仕事でどう活用すればいいのかイメージがわかない
理由3|実例を使った内容を知りたい
そこで、この記事ではYahooオークションのデータをGASで取得することにしました。
– Yahooオークションのデータを取得してGoogleスプレッドシート出力する方法
– プログラム解説や仕事での応用方法
Google Apps Scriptでの仕組み作りは無料です。
もしウェブスクレイピングを体験したい人は、GASプログラムをコピペしてそのまま使ってみてください。
目次
GASでYahooオークションのデータをスプレッドシートに出力する方法を解説
使用手順2|スプレッドシートのボタンをクリック
使用手順3|検索結果を出力
以下で一つずつ解説していきます。
使用手順1|Yahooオークションでの検索ワードをセルB1に記入
セルB1にYahooオークションで検索したいキーワードを入力します。
ここでは、試しに「機械学習」と入力しています。
使用手順2|スプレッドシートのボタンをクリック
ボタンをクリックします。
そうすると、ボタンに仕込んでいたプログラムが実行されます。
使用手順3|検索結果を出力
検索条件
セルB3|商品件数
セルB4|検索日時
8行目以下に各商品情報
A列|No
B列|件名(ヤフオクで出品されている商品名)
C列|URL(リンク)
D列|現在の価格
E列|即決価格
F列|入札件数
G列|残り時間
上記の画像のとおり、ヤフオクのデータを取得できます。
取得するデータは操作でファイルをボタン一発で移動させることができます。
ちなみに、情報を取得するまでの時間をいかに示します。
140データで5~10秒
800データで20~30秒
上記は、ボタンを押してから出力されるまでに要する時間です。
それでは以下で、この仕組みの作り方について解説していきます。
GASでヤフオクのデータを取得する仕組みをゼロから作ってみる|ステップごとに解説
作成手順2|スプレッドシートに必要情報を入力
作成手順3|GASプログラムをコピペ
作成手順4|ライブラリ設定
作成手順5|スプレッドシートにボタンを設置
作成手順6|作成手順5で設置したボタンクリックで、作成手順3のプログラムを実行
作成手順7|動作確認
それでは、ゼロから作っていけるように作り方を順を追って説明していきます。
作成手順1|スプレッドシートを準備
まずは、空のスプレッドシートを準備します。
新しいスプレッドシートではなく、既存のスプレッドシートでも問題ありません。
ただし、シート名はシート1としておくことをオススメします。
これから紹介するプログラムをそのまま使う場合、「シート1」でないと動かないので注意が必要です。
作成手順2|スプレッドシートに必要情報を入力
2. セルA7~セルG7に情報を入力
以下に各項目の入力目的を記載します。
ユーザー入力用
セルB1に「ヤフオクでの検索キーワード」入力してもらう
ヘッダー情報
8行目以下に出力されるヤフオク情報を見やすくするために以下を記載
– No
– 件名
– URL
– 現在の価格
– 即決価格
– 入札件数
– 残り時間
作成手順3|GASプログラムをコピペ
2. スクリプトエディタをクリック
3. GASプログラムをデフォルトの記載を削除
4. この記事で紹介しているGASプログラムをコピペ
5. ファイルをクリック
6. 保存をクリック
以下で一つずつ解説していきます。
以下の画像は、別の記事を転用しているものがあります。
操作の内容に違いがないため、画像を修正せずにそのまま使用しています。
ご了承ください。
そうすると、以下のスクリプトエディタを出現します。
ちなみに1と2の作業は以下のショートカットキーでも開くことが可能です。
1. ツールをクリック|[Alt] + [T]
2. スクリプトエディタをクリック|[E]
以下のリンク先のGASプログラムをコピーします。(リンク先は同じページ下部です)
まず、以下のスクリプトエディタを選択して、もともと記載されているプログラムを削除します。
そして、コピーしたGASプログラムソースを貼り付けます。
ここまで作業が進むと以下のようになっているはずです。
ここまで出来たら、以下のとおりファイルを保存します。
5と6の作業は、[Ctrl] + [S]のショートカットキーを使うことをオススメ
プログラミングだけでなく、パソコン仕事においてはショートカットキーを使う方が早いです。
ぜひショートカットキーでの作業をオススメします。
ちなみにプログラムエディタの背景色が黒にする方法や、正確な操作を知りたい人がいるかもしれません。
その場合は、以下の動画をご覧いただくことをオススメします。
上記の動画では、GASを使い始めるまでの操作手順を動画で解説しています。
もし動画よりテキストのほうが得意な人は、以下の記事を参考にしていただくと良いです。
作成手順4|ライブラリ設定
続けて、ライブラリ設定をします。
この記事で紹介するウェブスクレイピングでは、「Parser」というライブラリを使用します。
ライブラリとは簡単に言うと、特定の機能を引用する方法です。
「Parser」というライブラリを使うと、GASでのウェブページ解析がとてもラクになります。
しかし、ライブラリを使えるようにするには設定が必要です。
以下、その設定方法を紹介します。
2. 「ライブラリ」をクリック
3. Parserのライブラリキーをコピぺ
4. 「追加」をクリック
5. バージョンは「7」を選択(8以上があれば、番号が大きいものを選択)
6. 「保存」をクリック
以下のライブラリキーをコピーします。
M1lugvAXKKtUxn_vdAG9JZleS6DrsjUUV
コピーしたライブラリキーを以下のように貼り付けます。
これでParserライブラリを使用できるようになります。
なお、このライブラリ設定を行わないとプログラムが動かないので、注意が必要です。
作成手順5|スプレッドシートにボタンを設置
2. 図形描画をクリックする
3. 図形マークをクリックする
4. 図形をクリックする
5. 四角マークをクリックする
6. マウスドラックで四角図形を作成する
7. 四角の図形の中に「フォルダ内の情報をリスト化」と記入する([Ctrl] + [E]で中央に寄せる)
8. 「保存して終了」をクリックする
以下で一つずつ解説していきます。
以下の画像は、別の記事を転用しているものがあります。
操作の内容に違いがないため、画像を修正せずにそのまま使用しています。
ご了承ください。
上記の操作を行って、スプレッドシートにボタンを設置します。
作成手順6|作成手順5で設置したボタンクリックで、作成手順3のプログラムを実行
2. 「スクリプトを割り当て」をクリックする
3. 「GetYahooAuctionData」と記入する(先ほどコピペしたGASプログラムの名称)
4. 「OK」ボタンをクリックする
上記の操作で、スプレッドシートのボタンをクリックすると、プログラムが起動するようにします。
ここまでで、ヤフオク情報を取得する仕組みができたので、動作確認をします。
作成手順7|動作確認
以下の手順で進めていきます。
使用手順2|スプレッドシートのボタンをクリック
使用手順3|検索結果を出力
まずは検索したいキーワードをセルB1に入力します。
ここでは、試しに「機械学習」と入力しています。
次に「ヤフオクデータ取得」ボタンをクリックします。
そうすると以下のように検索結果が出力されます。
なお検索数に限度はありませんが、注意点が一つあります。
検索結果が大量のとき、時間超過のエラーが発生する可能性があります。
なぜならGASではプログラム実行時間が6分を超えると、プログラムが強制終了されてしまうからです。
たとえば10000を超える検索結果の場合、スクレイピング中に6分経過し、時間超過のエラーが発生するかもしれません。
上記の注意のとおり、検索結果数が多くなりすぎないようにするのが良いです。
ちなみにGSuiteであれば、プログラム実行時間は30分に延長されるので、検索結果が多くなっても問題はないです。
よくある質問1|「承認が必要」と表示されたとき、どうする?
ボタンをクリックすると、上記のように「このドキュメントに添付されたスクリプトを実行するには、あなたの許可必要です。」という画面が表示される場合があります。
その場合は、以下のとおり対応していきます。
以下の画像は、別の記事を転用しているものがあります。
ファイル名やスプレッドシート上の情報が、この記事の内容を一致しない場合があります。
あらかじめご了承ください。
2. 許可を出したいアカウントをクリックする
3. 「詳細」をクリックする
4. 「無題のプロジェクト(安全ではないページ)に移動」をクリックする
5. 「許可」をクリックする
6. 「フォルダ作成」のボタンをクリックする
そうすると、以下のようにボタンをクリックすることで、スクリプトが動きます。
ここまで紹介した内容を実践すれば、動作チェックで上手くいくことが確認できるはずです。
よくある質問2|プログラムのエラー表示されたとき、どうする?
上記のようにエラーが表示されて、プログラムが動かないことがあります。
プログラムエラーが生じた場合は、ステップ1から内容をチェックしてみてください。
とくに以下の内容を間違えていると、上手く動きません。
対処1. セルB1に検索キーワードが入力されているか?
対処2. 作成手順4のライブラリ設定を実施したかどうか?
上記の内容を確認してから、再度ボタンをクリックしてみてください。
もし上記の対処を行っても、プログラムのエラーが止まらない場合亜h、プログラムのエラー内容を確認し、Google検索で調べるなどの追加調査を行ってみてください。
GASウェブスクレイピングはお役立ちツールの1つ
この記事では、GASのプログラムを活用したウェブスクレイピングの事例を紹介しています。
さて、GASとウェブスクレイピングは非常に相性がいいです。
なぜなら時間指定して自動で動かすことができるからです。
たとえば、私はベンチャー企業でウェブ情報の自動通知システムを作っていました。
– 毎週月曜日の朝6時にプログラム実行
– とあるサイトで不定期更新される情報を取得
– 更新された情報があれば、Slackに通知
上記のシステムを作った結果、以下のメリットがありました。
メリット1|時間の節約(サイトにログイン、情報を閲覧する時間を削減)
メリット2|抜け漏れ防止(サイトににログインしなくても情報を自動入手)
メリット3|上司からの評価(評価アップの対象)
このようにウェブスクレイピングは、ルーティン作業や雑務などを自動化することが可能です。
当然、自動化するにはプログラミングを習得する必要がありますし、中には自動化できない作業もあります。
しかし自分だけでなくチームを助けるツールとして、効率化のポテンシャルはとても大きいです。
ぜひ、この事例を活用していただければと思います。
定期実行の事例
この記事で紹介は、ボタンでプログラム実行する事例を紹介していますが、ウェブスクレイピングの真骨頂は時間指定による定期実行です。
以下の動画の中で、定期実行のGAS事例を紹介しています。
ぜひそちらも参考にしてください。
GAS|ヤフオクのデータ取得プログラムの詳細を解説
ヤフオクのデータ取得をするGASプログラムを解説していきます。
さて、GASプログラムについてはコピペで使えるようにしていますので、全てを理解する必要はありません。
しかし、中にはプログラムを理解したい人もいるはずです。
そこで、GASプログラムの詳細も紹介していきます。
まず今回使用しているGASプログラムを以下に記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
//以下をコピペしてご利用ください //コードA|プログラム「GetYahooAuctionData」 function GetYahooAuctionData(){ //コードA1|スプレッドシートのシート名を取得 var sheetname = 'シート1'; //コードA2|スプレッドシートの設定 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetname); //コードA3|最終行の取得 var lastrow = sheet.getLastRow(); //コードA4|8行目以下のデータを削除 sheet.getRange(8,1, lastrow-8, 7).clearContent(); //コードA5|product_listという配列を作成 var product_list = []; //コードA6|セルB1の検索キーワードを取得 var keyword = sheet.getRange('B1').getValue(); //コードA7|YahooオークションのURLを取得(1~100件の商品情報を取得) var url = 'https://auctions.yahoo.co.jp/search/search?p=' + keyword + '&n=100'; //コードA8|url(コードA7)で指定したウェブサイト情報を取得 var html = UrlFetchApp.fetch(url).getContentText(); //コードA9|検索結果の件数を取得 var items = Parser.data(html) .from('<div class="Tab__itemInner">') .to('</div>') .iterate(); //コードA10|検索結果の件数の「すべて」と「件」を削除 var item = trimming(items[0]).replace('すべて','').replace('件',''); //コードA11|検索結果の件数を100で割ったの商(余りを切り捨てた値)を取得 var counter = Math.floor(item/100); //コードA12|コードBのプログラムを呼び出す(「html, product_list, 0」の3つを引数とする) product_list = Pagecrawling(html, product_list, 0); //コードA13|k=1,2,・・・,counter(コードA11)で繰り返す for(var k=1; k <= counter; k++){ //コードA13-1|pageurlのウェブページを取得(k=1で101~200件の商品情報、k=2で201~300件の商品情報を取得) var pageurl = 'https://auctions.yahoo.co.jp/search/search?p=' + keyword + '&b=' + k + '01&n=100'; //コードA13-2|コードA13-1で指定したURLのウェブサイト情報を取得 html = UrlFetchApp.fetch(pageurl).getContentText(); //コードA13-3|コードBのプログラムを呼び出す(「html, product_list, 0」の3つを引数とする) product_list = Pagecrawling(html, product_list,k); } //コードA14|product_listに格納された配列の値を8行目以下に貼り付け sheet.getRange(8,1, product_list.length, product_list[0].length).setValues(product_list); //コードA15|「商品件数」と「item」(コードA11で取得)を文字列で結合 var report1 = '商品件数:' + item; //コードA16|セルB3にrepot1(コードA16)を貼り付け sheet.getRange('B3').setValue(report1); //コードA17|「検索日時」と「今の日時」を文字列で結合 var report2 = '検索日時:' + Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd hh:mm:ss'); //コードA18|セルB4にrepot2(コードA18)を貼り付け sheet.getRange('B4').setValue(report2); } //コードB|プログラム「Pagecrawling」(「html, product_list, k」の3つの引数を受け取る) function Pagecrawling(html, product_list, k){ //コードB1|kに100を掛ける(kensuは商品No取得時に使用) var kensu = k * 100; //コードB2|Yahooオークションサイトのhtml情報から「商品ごとの情報を取得」 var products = Parser.data(html) .from('<li class="Product">') .to('</li>') .iterate(); //コードB3|i=0,1,・・・,「products.length」で繰り返す(Yahooオークションの各商品情報を解析) for(var i=0; i<products.length; i++){ //コードB3-1|各商品の件名情報を取得 var titles = Parser.data(products[i]) .from('<h3 class="Product__title">') .to('</h3>') .iterate(); //コードB3-2|コードCのプログラムを呼び出す(titles[0]が引数)→各商品の件名情報のうち、余計な記述を削除 var title = trimming(titles[0]); //コードB3-3|各商品の商品URLを取得 var urls = Parser.data(products[i]) .from('<a class="Product__titleLink" href="') .to('" target="_blank" rel="noopener noreferrer">') .to('</div>') .iterate(); //コードB3-6|fixedprice(即決価格)の変数を設定し、「-」を格納 var fixedprice = '-'; //コードB3-7|currentprice(現在の価格)の変数を設定し、「-」を格納 var currentprice = '-'; //コードB3-8|コードCのプログラムを呼び出す(prices[0]が引数)→各商品の価格情報のうち、余計な記述を削除 var price = trimming(prices[0]); //コードB3-9|価格情報を「円」で区切り、配列化する var myprice = price.split('円'); //コードB3-10|j=0,1,・・・,「myprices.length - 1」で繰り返す(各商品の価格情報を調査) for(var j=0; j<myprice.length-1; j++){ //コードB3-10-1|「myprice[j]」に「即決」という文字列が含まれているならば(即決価格であれば) if (myprice[j].indexOf('即決') !== -1) { //コードB3-10-2|fixedpriceにmyprice[j]を格納 fixedprice = myprice[j]; //コードB3-10-3|「myprice[j]」に「現在」という文字列が含まれているならば(現在の価格であれば) }else if(myprice[j].indexOf('現在') !== -1){ //コードB3-10-4|currentpriceにmyprice[j]を格納 currentprice = myprice[j]; } } //コードB3-11|各商品の入札情報を取得 var labels = Parser.data(products[i]) .from('<div class="u-displayIB u-marginR15">') .to('</div>') .iterate(); //コードB3-12|コードCのプログラムを呼び出す(labels[0]を引数とする)→各商品の入札情報のうち、余計な記述を削除 var label = trimming(labels[0]); //コードB3-13|各商品の残り時間を取得 var times = Parser.data(products[i]) .from('<div class="u-displayIB">') .to('</div>') .iterate(); //コードB3-14|コードCのプログラムを呼び出す(times[0]を引数とする)→各商品の残り時間情報のうち、余計な記述を削除 var time = trimming(times[0]); //コードB3-15|product_listの配列末尾に、コ-ドB4内で取得した各データを格納 product_list.push([kensu + i+1,title,url, currentprice,fixedprice,label,time]); } //コードB4|product_listの情報をコードAに返す return product_list } //コードC|プログラム「trimming」(「target」の1つの引数を受け取る) function trimming(target){ //コードC1|引数として受け取ったtarget情報からタグ情報を削除 var seikei1 = target.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g, ''); //コードC2|seikei1(コードC1)の情報から余白を削除 var seikei2 = seikei1.replace(/\s+/g,''); //コードC3|seikei2(コードC2)の情報をコードBに返す return seikei2; } |
以下でプログラムについて解説していきます。
プログラムA|メインプログラム
コードAはメインのプログラムです。
おおまかな流れを以下に示します。
– スプレッドシートの8行目以下の記載を削除(前のスクレイピングデータを削除するため)
– Yahooオークションにアクセスし、情報を取得(情報取得のためにプログラムBを呼び出す)
– 検索結果の1~100, 101~200, 201~300,・・・と100単位で情報を取得次ページの情報を取得
– 検索結果をスプレッドシートに書き出す
プログラムB|各製品の情報を取得してプログラムAに返す
おおまかな流れを以下に示します。
– プログラムAから受け取ったウェブページの情報を取得
– 各製品ごとに情報を取得
– 各製品の詳細情報(件名、URL、現在の価格、即決価格、入札件数、残り時間)を取得
– 配列情報(各製品の詳細情報を格納)をプログラムAに返す
プログラムC|不要情報を削除して、プログラムBに返す
おおまかな流れを以下に示します。
– プログラムBから情報を受け取る
– 余計なタグ情報を削除(整形)
– プログラムBに返す
プログラムの説明は以上です。
Google Apps Script(GAS)について詳しく理解したいなら
Google Apps Script(GAS)を活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にGASを活用して効率化してきた作業は以下の動画で解説しています。
動画を見てみると、あなたの仕事にどのようにGASを応用すればいいのかイメージが浮かぶこともあると思います。
ぜひご覧ください。
GASの使い方・始め方を知らない人にはこちらの記事・動画がオススメ
この機会に、「GASを使い方を知りたい」と思った人もいるかもしれません。
そのように感じている人は、ぜひ以下の記事をご覧ください。
10分程度でGoogle Apps Scriptを使うためのスタート地点に立てるように解説をしています。
GASで出来ることを知らない人はこちらの記事・動画がオススメ
GASの始め方を理解する前に、やっておくことがあります。
それは、GASを使って何ができるのかを理解しておくことです。
なぜならGASの使い所を知らないと、仕事で使えないからです。
仕事でどう活用するかをイメージしないまま学んでも、効果的な学習ができません。
そこで、このサイトでもいくつか事例を使って、GASの実践方法を紹介しています。
興味がある人は以下の記事もご覧ください。
オススメの書籍を紹介
書籍に関しては、以下を読んで購入しました。
GASの全体感をつかむには良いと思います。
ただし、実際の勉強は書籍よりもウェブサイトを活用してきました。
はっきり言って、ウェブサイトだけでも十分に勉強できるほど数多くの情報がアップされています。
書籍で全体感をつかんだら、ウェブサイトでの学習に切り替えたほうが良いのが私の考えです。
Googleスプレッドシートを効率的に操作したいなら
この記事ではGASを活用した仕事の効率化の事例を紹介してきました。
しかしGoogleスプレッドシートの仕事を早くすることを目指すなら、GAS以外の方法もあります。
たとえば、以下の方法です。
上記の内容については、以下の動画で紹介しています。
ぜひGoogleスプレッドシートを上手に扱えるようになりたい人はご覧いただきたいです。