Googleサービス PR

【ヤフオクユーザー必見】GASを利用したスクレイピング術

せどりでヤフオクを利用している方は便利な管理方法
記事内に商品プロモーションを含む場合があります

みなさんはヤフオクを利用してますか?


私は、財布だったり、バッグだったり買い替えるときに入札したり、まだまだ使えるアイテムについては出品したりして頻繁に利用しています。欲しいアイテムをヤフオクアプリで確認してますが、ヒットする件数が多いと一つ一つ見るの大変だぁと感じるときありませんか?




入札情報(入札状況、価格など)をリスト化して気になったアイテムだけ拾えたほうが個人的にはラクだとおもってます。そこで、GASを利用してヤフオクのスクレイピングをする方法と利用にあたっての注意点についてまとめました。



\この記事読んだらできること/

  • GAS×ヤフオクスクレイピング
    1. 欲しいアイテムをピックアップ
    2. リスト化して一覧でアイテム確認
    3. 【副業】にも活用可能!!
  • 利用にあたっての注意点

スクレイピングって?

スクレイピングは便利なツールです。

あまり聞きなれない言葉ですが、スクレイピングとはウェブページの情報(今回は出品されているアイテム情報)を自動で取得する作業のことをいいます。



ヤフオクのアプリであれば都度更新をかけて常に新しい情報もみれますし、実際の商品の画像も確認できたりします。



ただ、件数が多いとどことなく見づらく感じるときがあります。そんな風に感じたことがある方はぜひ、GASをつかったスクレイピングを使ってみてください。

スクレイピングにあたっての注意点

  • ヤフオクの利用規約に違反しないよう注意する。
  • アクセス頻度を抑えるなど、迷惑をかけないようにする。
  • スクレイピングしたデータの取り扱い

未使用品設定されているアイテムは
条件付き書式でセルの色が変わるようにしてます。


スクレイピングするにあたっていくつか注意点があります。便利なツールではありますが、利用するにあたってルールは守って使いましょう、ということになります。



GASを利用したヤフオクスクレイピングは、効率性と利便性を向上させるための有効な手段です。ただ、利用規約に違反したり、ヤフオク側に迷惑をかけたりすることのないように注意が必要です。

GAS×ヤフオクスクレイピングの利点



ヤフオクのスクレイピングの利用するにあたって、Google Apps Scriptを利用するとさまざまなことに応用することが可能です。

  • 欲しいアイテムの価格の変動
  • 人気商品のリサーチ
  • 競合の出品状況もリスト化
  • 商品の売れ行きを分析

スクレイピングシートを作成しよう

sheetsのロゴ

GASでスクレイピングする専用のスプレッドシートを準備します。こちらの記事でご紹介するスクリプトについては、セルの位置、項目の順番は以下のとおりです。

  1. B1セル:検索キーワード①を入力
  2. B2セル:検索キーワード②を入力
        (必要であれば)
  3. A列(6行目以降):アイテムNo
  4. B列(6行目以降):アイテム件名
  5. C列(6行目以降):URL
  6. D列(6行目以降):現在の価格
  7. E列(6行目以降):即決価格
  8. F列(6行目以降):送料(概算)
  9. G列(6行目以降):入札件数
  10. H列(6行目以降):落札までの残り時間
  11. I列(6行目以降):USED品かどうか

使用するセル、項目順など
同じであればそのままスクリプトを
貼り付けて利用可能です。

カスタマイズしたい方は
各自で編集をお願いします。

スクリプトの貼り付け

使用するスプレッドシートに以下のコードを貼り付け

  1. 【拡張機能】タブ
  2. 【Apps Script】へすすむ
  3. コード入力
//以下をコピペしてつかえます

function Get_yahuoku_Data(){
  let sheetname = 'シート1'; 
  //スプレッドシートのシート名を取得
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetname); 
  //スプレッドシートの設定
  let lastrow = sheet.getLastRow(); 
  //最終行の取得
  sheet.getRange(6,1, lastrow, 9).clearContent(); 
  //6行目以下のデータを削除
  let product_list = []; 
  //product_listという配列を作成
 
  //セルB1の検索キーワードを取得
  let keyword1 = sheet.getRange('B1').getValue();
  let keyword2 = sheet.getRange('B2').getValue();
  let url = 'https://auctions.yahoo.co.jp/search/search?p=' + keyword1 + keyword2 + '&n=100';	
  //YahooオークションのURLを取得(1~100件の商品情報を取得)
  let html = UrlFetchApp.fetch(url).getContentText(); 
  //urlで指定したウェブサイト情報を取得
 
  let items = Parser.data(html)
    .from('<div class="Tab__itemInner">')
    .to('</div>')
    .iterate();  //検索結果の件数を取得
  let item = trimming(items[0]).replace('すべて','').replace('件','');  
  //検索結果の件数の「すべて」と「件」を削除
  let counter = Math.floor(item/100); 
  //検索結果の件数を100で割ったあまりを切り捨てた値を取得
  product_list = Pagecrawling(html, product_list, 0); 
  //プログラムを呼び出す(「html, product_list, 0」の3つを引数とする)
 
  //k=1,2,・・・,counterで繰り返す
    for(let k=1; k <= counter; k++){
	  let pageurl = 'https://auctions.yahoo.co.jp/search/search?p=' + keyword1 + keyword2 + '&b=' + k + '01&n=100';  //pageurlのウェブページを取得(k=1で101~200件の商品情報、k=2で201~300件の商品情報を取得)
	  html = UrlFetchApp.fetch(pageurl).getContentText();  //URLのウェブサイト情報を取得
	  product_list = Pagecrawling(html, product_list,k);  //プログラムを呼び出す(「html, product_list, k」の3つを引数とする)
  }
  sheet.getRange(6,1, product_list.length, product_list[0].length).setValues(product_list);  //product_listに格納された配列の値を6行目以下に貼り付け
  let report1 = '商品件数:' + item ;  //「商品件数」と「item」を文字列で結合
  let report2 = '検索日時:' + Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd hh:mm:ss');   //「検索日時」と「今の日時」を文字列で結合

  sheet.getRange('C1').setValue(report1);  //セルC1にrepot1を貼り付け
  sheet.getRange('C2').setValue(report2);  //セルB4にrepot2を貼り付け
}

//プログラム「Pagecrawling」(「html, product_list, k」の3つの引数を受け取る)
function Pagecrawling(html, product_list, k){
      let list_no = k * 100 + 1  ;   //kに100を掛ける(list_noは商品No取得時に使用)
      let products = Parser.data(html)
        .from('<li class="Product">')
        .to('</li>')
        .iterate();  //Yahooオークションサイトのhtml情報から「商品ごとの情報を取得」
 
      //i=0,1,・・・,「products.length」で繰り返す(Yahooオークションの各商品情報を解析)
      for(let i=0; i<products.length; i++){
 
	        let titles = Parser.data(products[i])
            .from('<h3 class="Product__title">')
            .to('</h3>')
	          .iterate();  //各商品の件名情報を取得
	        let title = trimming(titles[0]);  //プログラムを呼び出す(titles[0]が引数)→各商品の件名情報から余計な記述を削除

	        let urls = Parser.data(products[i])
            .from(' href="')
            .to('"')
	          .iterate();  //各商品の商品URLを取得
          let url = trimming(urls[0]);  //各商品のURLから余計な記述を削除
	
          let prices = Parser.data(products[i])
            .from('<div class="Product__priceInfo">')
            .to('</div>')
            .iterate();
          let price = trimming(prices[0]);  //各商品の価格情報のうち、余計な記述を削除
          let myprice = price.split('円');  //価格情報を「円」で区切り、配列化する

	        let fixedprice =  '-';  //fixedprice(即決価格)の変数を設定し、「-」を格納
	        let currentprice = '-';  //currentprice(現在の価格)の変数を設定し、「-」を格納
          let postage = '-';  //postage(送料)の変数を設定し、「-」を格納
	
	        //j=0,1,・・・,「myprices.length-1」で繰り返す(各商品の価格情報を調査)
	        for(let j=0; j<myprice.length-1; j++){
  	
  	       
  	          if (myprice[j].indexOf('現在') !== -1) {    //「myprice[j]」に「現在」という文字列が含まれているならば
                currentprice = myprice[j].replace(/\D/g, '');  //currentpriceにmyprice[j]を格納
  	          }
              else if(myprice[j].indexOf('即決') !== -1){     //「myprice[j]」に「即決」という文字列が含まれているならば
    	          fixedprice = myprice[j].replace(/\D/g, '');;  //fixedpriceにmyprice[j]を格納
  	          } 
              else if(myprice[j].indexOf('送料') !== -1){  //「myprice[j]」に「送料」という文字列が含まれているならば
                postage = myprice[j].replace(/\D/g, '');  //postageにmyprice[j]を格納
              }

              else {
                //文字列が見つからなかった場合の処理
                fixedprice = '-';
                currentprice = '-';
                postage = '-';
	            }
          }
	
	        let labels = Parser.data(products[i])
            .from('<div class="Product__bidWrap">')
            .to('</div>')
	          .iterate();  //各商品の入札情報を取得
	        let label = trimming(labels[0]);  //各商品の入札情報から余計な記述を削除
  
	        let times = Parser.data(products[i])
            .from('<div class="Product__timeWrap">')
            .to("</div>")
            .iterate();  //各商品の残り時間を取得
	        let time = trimming(times[0]);  //各商品の残り時間情報から余計な記述を削除

	        let grades = Parser.data(products[i])
            .from('<div class="Product__icons">')
            .to('</div>')
            .iterate();   //各商品のグレードを取得(未使用品かどうか)
	        let grade = trimming(grades[0]);  //各商品のグレード情報から余計な記述を削除

	        product_list.push([list_no+i,title,url, currentprice,fixedprice,postage,label,time,grade]);//product_listの配列末尾に、取得した各データを格納
      }
 
      //product_listの情報をコードAに返す
      return product_list
    }
 
//プログラム「trimming」(「target」の1つの引数を受け取る)
function trimming(target){
  let seikei1 = target.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g, '');  //引数として受け取ったtarget情報からタグ情報を削除
  let seikei2 = seikei1.replace(/\s+/g,'');  //seikei1の情報から余白を削除
  return seikei2;  //seikei2の情報をコードBに返す
}
 
 

実行メニューの設置

シートのタブ内にスクリプト実行ボタンを設置しておくと、スムーズにアイテムの検索をすることができます。下の記事にて設置方法をまとめております。

【保存版】GASでスプレッドシートのメニューをカスタマイズ!! 仕事もプライベートも効率化 Google Apps Script(GAS)を学びはじめて、仕事にプライベートにいろいろ効...
クリエイトメニュー

本シートでは、以下の設定
 ・タブ:リスト表示
 ・メニュー:スクレイピング

スクリプト実行してみた結果・・・

ヤフオク×スクレイピング実行例
ヒカキンさんプロデュース【みそきん】で実行した結果




試しに、すこし前にあまりにも人気で売り切れとなっていたヒカキンさんプロデュースのカップ麺【みそきん】が再販となりました。ヤフオクに出品されていたので検索してみました。

人気カップ麺でもわざわざヤフオクで買わないですが・・
それぞれの出品情報がリストで確認できます。

未使用品設定されているアイテムは
条件付き書式でセルの色が変わるようにしてます。

使いこなせば便利ツール

  • 欲しいアイテムの相場価格
  • 画像で確認したいときもURLから確認

アプリで欲しいアイテムを探しがちですが、使ってみると意外に便利なツールだと感じる方も多いのではないでしょうか?


入札計画に必要な情報はそろうので、どうしても手に入れたいアイテムについてはリスト表示の方が戦略は練りやすいと思います。


GASを使うと非常に便利です。リスト表示ができれば、これを応用してカレンダーにリマインダー機能としてリンクも可能ですので、別の記事でまとめたいと思います。