본문 바로가기

컴퓨터 활용/구글스프레드시트 응용

인베스팅(investing) 주가정보 수집하기 / 구글 스프레드 시트에서 사용자 정의 함수로 구현

해외 주식포털 인베스팅이 제공하는 페이지로 부터 주가, 등락률, 전일비, 25일간의 데이타를 가져와서 활용합니다. 구글 스프레드시트에서 주가 정보를 가져오기 위해서 주로 쓰는 함수가 GoogleFinance 함수 입니다. 지원하지 않는 주가나 지수는 아후파이낸스 혹은 인베스팅에서 참고합니다.

투자하고 있는 지수 및 펀드가 구글파이낸스에 없어서 인베스팅에서 수집을 할 수 밖에 없네요. 주가 수익률 관리 구글 시트에서 실시간으로 주가를 수집하는 것이 필요해서 만들어 보았습니다.

필요하신 분이 있을 것 같아 내어 드리겠습니다.

삼성전자를 선택하면 https://www.investing.com/equities/samsung-electronics-co-ltd 가 나오는데 여기서 필요한 데이터가 equities / samsung-electronics-co-ltd 입니다.
각각 종목유형, 종목문자열이라고 하겠습니다.

주식 equities , 인덱스 지수: indices, 펀드 : funds 가 있는 것 같습니다.

https://www.investing.com/equities/samsung-electronics-co-ltd

https://www.investing.com/funds/schroder-brics-feeder-equity-e-1

https://www.investing.com/indices/us-spx-500-futures

이 URL 주소에 -historical-data 만 붙이면 해당 페이지를 볼 수 있습니다. 이 페이지에서는 정적 텍스트로 되어 있어 데이터를 가져올 수 있더라고요.

사용자 정의 함수인 InvestingData 함수를 이용

InvestingData 란 함수는 구글파이낸스 함수 처럼 제가 만든 것입니다. 페이지를 읽어 필요한 정보를 얻는 웹크롤링을 하는 것입니다. Google Apps Script 를 이용하였고 UrlFetch 함수로 데이터를 가져오고 JavaScript 를 이용하여 필요한 데이타를 구글 스프레드 시트에 표시 합니다.

Investing예제 시트에 보면 셀(Cell)에 함수를 지정합니다.

 

사용법은

=investingData("종목문자열","종목유형","price")
주가
=investingData("종목문자열","종목유형","changepct")
등락률
=investingData("종목문자열","종목유형","change")
전일비
=investingData("종목문자열","종목유형","last25days")
인베스팅이 제공하는 historical data 를 그대로 표시. importhtml 로 가져오는 데이타와 동일
=investingData("종목문자열","종목유형","sparkline") 
구글의 SPARKLINE 을 그리기위한 데이터

구글 앱스 스크립트 소스는?

메뉴에 확장 프로그램에 Apps Script 메뉴에 들어가면 보입니다.

Investing.gs 라는 파일에 있습니다 코드.gs 에는 네이버 증권에서 수집하는 getNaverStock() 함수도 있습니다.

 

 

소스에 대한 설명은 주석을 달아 놓았으니 참고 하시면 됩니다

 

/*
<div class="float_lang_base_1 bold">
<span class="arial_22">DJ BRIC 50</span>
<span id="fl_header_pair_lst" class="arial_16 midNum pid-943741-last" dir="ltr">555.45</span>
<span id="fl_header_pair_chg" class="arial_14 pid-943741-pc greenFont" dir="ltr">+8.82</span>
<span id="fl_header_pair_pch" class="arial_14 pid-943741-pcp greenFont parentheses" dir="ltr">
  +1.61%</span>
</div>
*/



function investing(code,type,item)
{
  if(arguments.length ==0) return "파라미터 필요";
  if(!type) return "두번째 파라미터 필요";
  if(!code) return "첫번째 파라미터 필요";
 

  var url = "https://www.investing.com/"+type+"/"+ code+"-historical-data";
  var html = UrlFetchApp.fetch(url).getContentText("euckr"); // euckr 문자셋 글자가 깨어진다면 euckr 제거나 다른 문자셋으로
   

  var searchstring = ''; // 자르기 시작점
  var lastPart =""; // 자르기 종료점
  var reg; // 정규식 
  var r; // 정규식 실행 결과 
  var value = []; // 최종 리턴 배열변수
  var days= []; // 25일간 데이터 
  var sparkline = []; // 구글 스파크라인 데이터 

  switch(item)
  {

    default:

    case "price":
    case "changepct" :
    case "change":  

      value[0] = new Array();

      searchstring = '<div class="float_lang_base_1 bold">';
      lastPart = '<div class="js-inject-add-to-portfolio"></div>';
      var str = cutText(html,searchstring,lastPart)
      // 문자열 기준으로 잘라냅니다. 
      
      // 정규식
      reg = /dir=\"ltr\">(.+|.*)<\/span>/g;
      r = reg.exec(str); value[0].push(r[1]); 
      r = reg.exec(str); value[0].push(r[1]); 
      r = reg.exec(str); value[0].push(r[1]); 
   
    break;

    case "last25days":
    case "sparkline":

      // 한 달 주가 테이블 
      searchstring ='<table class="genTbl closedTbl historicalTbl" id="curr_table" tablesorter>';
      lastPart = '<table class="genTbl closedTbl historicalTblFooter" id="placehereresult2">';
      var html = cutText(html,searchstring,lastPart)

      // table 부분 수집 
      
      sparkline[0] = ["Date","Close"];

      html = html.split('</tr>'); // TR 태그를 기준으로 배열로 분리함 
      for(var i = 1; i <= 24;i++)
      {
        var str = html[i];
        days[i-1] = new Array();
        sparkline[i] = new Array();
        
        var r = null;
        
        // date  & timestamp
        var reg1 = /<td data-real-value=\"([0-9]{10})\" class=\".+\">([a-zA-Z]{3} [0-9]{2}, [0-9]{4})<\/td>/g; // 날짜 
        r = reg1.exec(str); days[i-1].push(r[2]); // 1date 2timestamp

        var d = new Date((parseInt(r[1])+25200)*1000);
        sparkline[i].push(d); 

        // Price, Open , High, Low, Volume
        var reg2 = /<td data-real-value=\"([0-9,\.]+|0)\"/g;
        r = reg2.exec(str);
        r = reg2.exec(str); days[i-1].push(r[1]); // 3Price
        sparkline[i].push( parseInt(r[1].replace(",","")) );

        r = reg2.exec(str); days[i-1].push(r[1]); // 4Open
        r = reg2.exec(str); days[i-1].push(r[1]); // 5High
        r = reg2.exec(str); days[i-1].push(r[1]); // 6Low
        r = reg2.exec(str); days[i-1].push(r[1]);//	7Vol.

        // Change
        var reg3 = /<td class=\".+\">(.+%)<\/td>/g;
        r = reg3.exec(str); days[i-1].push(r[1]); // 8  Change %
      }     


    break;

  }


  switch(item)
  {


    case "price":

      return value[0][0];
    
    break;
    case "change":  

      return value[0][1];

    break;
    case "changepct" :

      return value[0][2];
    break;  				

    case "last25days":

      return days;

    break;

    case "sparkline":

    return sparkline;

    break;

    default:
      return value;
    break;


    
  }
}







function cutText(html,firstString,lastString){
  var index = html.search(firstString);
  if (index >= 0)
  {
    var pos = index + firstString.length;
    var t = html.substring(pos);
    var pos2 = t.search(lastString);
    var v = html.substring(pos, pos+pos2);
  }
  return v;
}

 

구글 스프레드 시트로 가기

https://docs.google.com/spreadsheets/d/10xaMfpriT6G1d4hw94L6q_ozT0fogilVYb-S2dtw8-8/edit#gid=154516714

 

주가 정보 가져오기

네이버_예제 종목코드,종목명,현재가,전일비,등락률,전일종가,거래량,시장,가져온시간 005930,67400,300,-0.44%,67,700,23,430,836,코스피,2022-05-31 16:11:00 102110,35490,125,0.35%,35,365,418,267,코스피,2022-05-31 16:11:00

docs.google.com

 

네이버 증권 페이지 참조하여 실시간 주가 정보 가져오기

 

 

구글스프레드시트에서 단일 주식 정보 가져오기 / 구글 스프레드 시트함수로 구현

구글스프레드시트에서 단일 주식 종목의 주식 정보를 가져오는 함수 입니다. 네이버증권의 일별 종목페이지에서 가져왔습니다. ​googlefinance함수 같이 직접 만든 것입니다. 함수의 이름은 getNave

richardshin.tistory.com