본문으로 바로가기
반응형

요즘 주식 얘기가 많이 들려 삼성전자 주가 및 투자자별 매매동향 데이터를 수집하는 프로그램을 만들어봤다.

Go로 작성하기 전 Python으로 먼저 작성한 소스를 살펴보겠다.


Python Source

# -*- coding: utf-8 -*-

import requests
from bs4 import BeautifulSoup
import time
from datetime import datetime

todayOld = datetime.today()
todayNew = todayOld.strftime('%Y%m%d')

URL  = "https://finance.naver.com/item/main.nhn?code=005930" # 삼성전자
URL1 = "https://finance.naver.com/sise/investorDealTrendDay.nhn?bizdate={}".format(todayNew) # 동향

now_price = 0
prev_price = now_price

while True:
    # price
    if now_price == prev_price:
        time.sleep(1)

        response = requests.get(URL)
        html = BeautifulSoup(response.text, "html.parser")

        now_price = html.select_one("#chart_area > div.rate_info > div > p.no_today > em span.blind").get_text()
    else:
        print(u"가격 : {} 원".format(now_price))
        prev_price = now_price

        # diff
        response = requests.get(URL1)
        html = BeautifulSoup(response.text, "html.parser")

        td = html.select("td")
        personal  = td[2].get_text()
        personal_class = td[2]['class'][0]
        foreigner = td[3].get_text()
        foreigner_class = td[3]['class'][0]
        company   = td[4].get_text()
        company_class = td[4]['class'][0]

        print(u'개인 : {} / 외국인 : {} / 기관 : {}'.format(personal, foreigner, company))

http 통신requests를 이용했고 html 데이터 접근은 BeautifulSoup을 사용했다.
현재주가와 이전에 수집된 주가가 같은 경우 주가를 재수집하며 그렇지 않은 경우는 투자자별 매매동향을 끌고오는 소스이다.


Go Source

위의 소스를 Go로 바꾸어보았다. 배운거는 빨리빨리 써먹어봐야 안까먹으니 ㅎㅎ

package main

import (
    "fmt"
    "log"
    "net/http"
    "strconv"
    "time"

    "github.com/PuerkitoBio/goquery"
)

// URL samsung
var URL string = "https://finance.naver.com/item/main.nhn?code=005930" // 삼성전자
// URL1 investorDealTrendDay
var URL1 string = "https://finance.naver.com/sise/investorDealTrendDay.nhn?bizdate=" // 동향

var (
    now_price  string
    prev_price string
)

func main() {

    for {
        if now_price == prev_price {
            time.Sleep(time.Second)

            doc := getResponse(URL, 0)

            now_price = doc.Find("#chart_area > div.rate_info > div > p.no_today > em span.blind").Text()
        } else {
            fmt.Printf("가격 : %s\n", now_price)
            prev_price = now_price

            doc := getResponse(URL1, 1)

            idtd := doc.Find("tr:nth-child(4)")
            personal := idtd.Find("td:nth-child(2)")
            foreigner := idtd.Find("td:nth-child(3)")
            company := idtd.Find("td:nth-child(4)")

            fmt.Printf("개인 : %s / 외국인 : %s / 기관 : %s\n", personal.Text(), foreigner.Text(), company.Text())
        }
    }
}

func getResponse(url string, kind int) *goquery.Document {
    t := time.Now()
    year, month, day := t.Date()
    var todayFmt = strconv.Itoa(year) + strconv.Itoa(int(month)) + strconv.Itoa(day)
    if int(month) < 10 {
        todayFmt = strconv.Itoa(year) + "0" + strconv.Itoa(int(month)) + strconv.Itoa(day)
    }

    if kind == 1 {
        url += todayFmt
    }
    res, err := http.Get(url)
    if err != nil {
        log.Fatal(err)
    }

    defer res.Body.Close()

    if res.StatusCode != 200 {
        log.Fatalf("status code error : %d %s", res.StatusCode, res.Status)
    }

    doc, err := goquery.NewDocumentFromReader(res.Body)
    if err != nil {
        log.Fatal(err)
    }

    return doc
}

기존 Python 소스보다 양이 더 많은 이유는 Error Check 부분들이 추가되어서 그렇지 그리 차이나지 않는다.
Go에서는 Python의 BeautifulSoup 처럼 Crawling 하는데 필요한 패키지가 있었는데 goquery 였다.

해당 소스는 다음처럼 설치하면 사용이 가능하다.

go get github.com/PuerkitoBio/goquery

참고로 IDE는 VSC를 사용

반응형