loader image

【GAS】楽天証券でスクレイピングした時にめんどくさかった事

概要

スプシにウォッチしてる銘柄をまとめたので必要な情報をGASでスクレイピングして取ってこようと色々したけどGASだとめんどくさい事が多くて最終的に詰んだので供養。

googleファイナンスからだとうまくいきました。

今後スクレイピングやる事になったら迷わずpythonでやるつもりだけどGASの仕様にちょっと詳しくなったのでコードにまとめる。

めんどくさかった事まとめ

・8192文字以上のログを出そうとすると省略される
→セル分割して出すか、ファイルに出すかしないといけない

・セルの文字制限50000文字
→セルを分割する必要がある

・Logger.log とconsole.logで出力が大きく異なる
→値を参照したい場合はLogger.logを使う

コード

function myFunction() {
  // #行の変数
  i = 2

  // #スプシ,シートを取得
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName('2023年(投資家が勧めてた銘柄)');
  // const log_sheet = spreadsheet.getSheetByName('log');

  // #空白までループ
  while (sheet.getRange(i, 3).getValue() != ""){
    const value = sheet.getRange(i, 4).getValue()
    const response = UrlFetchApp.fetch(value);
    // const searchTarget = /\"\"JPY\"\",\[\.*?r/g;
    // const searchTarget = /""JPY""*?,/g;
    const text = response.getContentText()
    
    // 8192文字を出力すると省略されるので8000文字ずつ分割してA列のセルに上から順番に入れる
    // const LENGTH = 8000;
    // let insertValues = [];
    // for (let j = 0;  j < text.length; j += LENGTH) {
    //   const fromIndex = j;
    //   const toIndex   = j + LENGTH;
    //   const subString = text.substring(fromIndex, toIndex);
    //   insertValues.push([subString]);
    // }
    // log_sheet.getRange(1, 1, insertValues.length, insertValues[0].length).setValues(insertValues);

   // 50000文字ずつ分割してA列のセルに上から順番に入れる
  //  const LENGTH = 50000;
  //  let insertValues = [];
  //  for (let j = 0;  j < text.length; j += LENGTH) {
  //     const fromIndex = j;
  //     const toIndex   = j + LENGTH;
  //     const subString = text.substring(fromIndex, toIndex);
  //     insertValues.push([subString]);
  //   }
  //  log_sheet.getRange(1, 1, insertValues.length, insertValues[0].length).setValues(insertValues);

  // ファイル作成のためのフォルダ
  // const folder = DriveApp.getFolderById('1hg8h9UjbWX8nJz8282VbaFGPaeSdUsKA'); //フォルダIDを指定

    // // 8192文字を出力すると省略されるのでファイルに出す
    // folder.createFile('log.txt',text,MimeType.PLAIN_TEXT);
    // const contents = DriveApp.getFolderById('1hg8h9UjbWX8nJz8282VbaFGPaeSdUsKA').getFilesByName('log.txt').next().getBlob().getDataAsString("sjis")
    // let stock_price = Parser.data(contents).from('<td class="cell-02" style="background-color:#FFFFFF" width="27%" align="right"><em>').to('</em></td>').build()

    // reg = /[\s\S]*(?='<td class="cell-02" style="background-color:#FFFFFF" width="27%" align="right"><em>')/;
    // var contents = contents.replace(reg,"");

    // reg = '<td class="cell-02" style="background-color:#FFFFFF" width="27%" align="right"><em>'
    // const contents = contents.substr(contents.indexOf(reg))

    // Logger.log(contents)

    const stock_price_all = Parser.data(text).from('<div class="YMlKec fxKbKc">').to("</div>").build()
    const stock_price = stock_price_all.replace("¥","")
    Logger.log(stock_price)
    sheet.getRange(i, 8).setValue(stock_price)
    i = i + 1
  }
}

余談

今回詰んだ原因は楽天証券ではJavaScriptを作っててGASでhtmlダウンロードする方式では欲しいデータが取れないので無理という結論になった。出来る人いたら連絡ください。
pythonだとgoogle chromeでJavaScript実行してほしいデータを出すことが出来るのでいけそう。

参考:https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7a

コメント

タイトルとURLをコピーしました