반응형
요즘 주식 얘기가 많이 들려 삼성전자 주가 및 투자자별 매매동향 데이터를 수집하는 프로그램을 만들어봤다.
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를 사용
반응형
'Backend > Go' 카테고리의 다른 글
`쉽고 빠른 Go 시작하기` 노마드코더 강의 정리 (Golang) - 2 (1) | 2021.01.24 |
---|---|
`쉽고 빠른 Go 시작하기` 노마드코더 강의 정리 (Golang) (3) | 2021.01.15 |