splunk/ 2. 실시간 주식데이터 분석

Algo rhythm·2022년 7월 11일
0

splunk

목록 보기
3/24

원하는 종목을 검색하여 현 주가 파악

CJ, 삼성 주가 파악

| readstock code="001040" 
| append [ | readstock code="005930" ]
| spath | table *

사전작업

경로 이동

$ cd $SPLUNK_HOME/etc/apps/stock

나의 경로 : $ cd /opt/splunk/etc/apps/stock

파일 생성

  • bin/readstock.py : 실제 명령어 실행되는 코드를 작성
  • default/commands.conf : 스플렁크에서 인식할 수 있도록 명령어를 정의
  • default/searchbnf.conf : 웹에서 명령어를 실행하는 방법을 확인 할 수 있는 설명을 추가
  • metadata/default.meta : 명령어의 활용 범위 정의
  • lib/ : 명령어를 수행하기 위해 필요한 라이브러리 추가 폴더

파일 미리 생성
$ mkdir bin
$ touch bin/readstock.py
파이썬이 읽고 실행할 명령에 대한 코드를 작성할 파일

default/commands.conf

[readstock]
chunked = true
filename = readstock.py
python.version = python3

python3 버전으로 readstock.py 파일을 읽게 하는 파일

default/searchbnf.conf

[readstock-command]
syntax = readstock code
shortdesc = read current stock price in naver financial
usage = public

readstock 명령어에 대한 간단한 설명을 출력하는 것

metadata/default.meta

[searchbnf]
export = system

metadata/default.meta 는 root 가 먼저 만들어둔게 있으므로 일반 사용자가 touch 하는 것 보단 root 로 접속하여 vi 편집하는게 낫다

  • 2022-07-13 추가 : 문제 생겨 readstock 다 사라지고 다시보니까 metadata/default.meta 파일도 사라졌다. 불안하지만 일단 해본다

명령어 설명이 보이지 않을 때

bin/readstock.py

from __future__ import absolute_import, division, print_function, unicode_literals
import os, sys
import time
import json

# 사용자 정의 command를 위해서는 항상 포함되어야 한다. 
splunkhome = os.environ['SPLUNK_HOME']
sys.path.append(os.path.join(splunkhome, 'etc', 'apps', 'stock', 'lib')) # 추가되는 패키지들이 저장된 라이브러리 경로 
from splunklib.searchcommands import dispatch, GeneratingCommand, Configuration, Option, validators
from splunklib import six
from splunklib.six.moves import range

# 그 외에 필요한 패키지들... 
from urllib.request import urlopen
from bs4 import BeautifulSoup

# GeneratingCommand 를 상속받아서 새로운 명령어 생성
@Configuration()
class ReadStockCommand(GeneratingCommand):
    # 명령 파라미터 정의 "code" 를 파라미터로 받을 수 있게 정의함
    code = Option(require=True)

    # naver 에서는 다음페이지를 통해 현재 주식 가격 정보를 확인할 수 있다. 
    url = 'https://finance.naver.com/item/sise.nhn?code={}'

    #  구현해야 하는 함수
    def generate(self):
        # url에 파라미터로 받은 코드를 추가해서 전체 url 생성
        url = self.url.format(self.code)
        self.logger.info("Generating event with code %s" % (self.code))
        # url 호출
        with urlopen(url) as doc:
            content = doc.read()
            # 여기에서 약간의 삽질을... 리눅스에서는 "euc-kr"에 대한 encoding 이 되지 않아서 한글이 깨짐. 
            # 우선 한글이 꼭 필요한게 아니어서 ignore 하고 내용을 utf-8로 decode 하였는데,
            # 제대로 작동하기 위해서는 아래 코드를 사용하는 것이 좋음 (지금 환경에서 해결방법을 더 찾아봐야...)
            # soup = BeautifulSoup(doc, 'lxml', from_encoding="euc-kr")
            content = content.decode('utf-8', 'ignore') 
            soup = BeautifulSoup(content)
            # BeautifulSoup 을 이용하면 html을 파싱해서 원하는 정보를 가져올 수 있다. 
            cur_price = soup.find('strong', id='_nowVal').text.replace(",", "")
            cur_rate = soup.find('strong', id='_rate').text.strip()
            stock_name = self.code
        # 조회 된 내용을 바탕으로 메시지를 만들고 스플렁크 앱으로 전달해 준다.             
        raw = {"price": cur_price, "rate": cur_rate, "code":stock_name }
        yield {'_time': time.time(), '_raw': raw}


dispatch(ReadStockCommand, sys.argv, sys.stdin, sys.stdout, __name__)

os.environ['SPLUNK_HOME'] 대신 /opt/splunk 로 대체
네이버 주가 정보 사이트에서 기업의 코드번호를 입력받아 조회하는 방식 -한글/영어 아님 숫자임

추가된 패키지를 스플렁크가 인식하도록 하기

$ pip3 install beautifulsoup

혹은

$ pip3 install bs4

둘 중에 되는 것을 선택하여 설치

cd /home/sb111/.local/lib/python3.10/site-packages/

설치된 bs4를 복사하기

$ cp -r ./bs4 /opt/splunk/etc/apps/stock/lib/

패키지가 설치된 경로. 파이썬의 버전별로 경로가 다름
찾는 방법 :

$ file / -name 찾을파일의 이름

리눅스 서버 전체에서 해당 이름을 가진 파일의 경로를 탐색

주의점

ERROR ChunkedExternProcessor [9139 ChunkedExternProcessorStderrLogger] - stderr:   File "/opt/splunk/etc/apps/stock/bin/readstock.py", line 9, in <module>

위의 시키는대로 해도 돌아가지 않는다.
이유는 splunklib와 splunk-sdk를 인식 못하기 때문
no module named 'splunklib' 에러를 계속 보게된다

pip3 install splunklib 

로 설치했는데도 인식을 못한다 따라서

cd /opt/splunk/etc/apps/stock/bin/

이 주소로 이동하고 설치를 해야 splunk에서 인식하고 bin/readstock.py 이 작동한다

pip3 install -t . splunklib

pip3 install -t . splunk-sdk

주의점2

[에러상황]
"Unable to locate package splunklib"
'ERROR ChunkedExternProcessor [9139 ChunkedExternProcessorStderrLogger] - stderr: File "/opt/splunk/etc/apps/stock/bin/readstock.py", line 9, in '

이러한 에러가 발생한다면 "splunklib", "splunk_sdk-1.7.0.dist-info" 각각의 디렉토리를 아래의 경로로 복사하면 되기도 한다.
파이썬이 읽는 패키지의 경로와 설치된 패키지의 경로가 달라서 그런거니까

cp -r splunklib /opt/splunk/etc/apps/stock/lib
cp -r splunk_sdk-1.7.0.dist-info /opt/splunk/etc/apps/stock/lib

스플렁크 서버를 재시작하여 작동 확인

| readstock 

결과 : File "/opt/splunk/etc/apps/stock/bin/readstock.py", line 15, in module

에러났다. 모듈을 못 읽은 거 같은데 보러간다.
→ code="001040" 뒤에 종목 안 붙여줘서 에러남. 붙여주자

profile
배운 건 써 먹자

0개의 댓글