概要
スプシにウォッチしてる銘柄をまとめたので必要な情報を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
コメント