728x90
반응형
디스코드에 파이썬으로 네이버 증권에 접근해서 원하는 종목의 주가를 주기적으로 알려주는 봇을 만들어 본다.
단계
1. 디스코드 채널 만들기
2. 웹후크 연결하기
3. 크롤링하는 코드 짜기
4. 주기적으로 코드 실행하기
디스코드 채널 만들기
디스코드 가입하시고 디스코드 채널 만드시면 됩니다.
웹후크 연결하기
우선 채널을 만들고 톱니바퀴를 클릭합시다.
연동 클릭
웹후크 클릭
웹후크는 초강력 인터넷 파워를 사용한다고 하네요..
새 웹후크 만들기를 해줍시다.
그럼 밑에 자연스럽게 생기는데 한번 들어가봅시다.
웹후크에 대한 설정을 할 수 있고, 아래 웹후크 URL 복사가 보입니다.
이 웹후크 URL을 통해 크롤링한 정보를 디스코드로 보낼 수 있습니다.
코드짜기
저는 네이버 증권에서 크롤링 했습니다.
증권 페이지 소스에 변화가 생기면 크롤링이 되지 않을 수 있습니다. (2023.11.03 기준 잘 됩니다.)
# 네이버 증권 기준
# 종목 추가 시 ecobro 함수에 종목번호를 파라미터로 전달
# ex) 삼성전자 추가 시 code=005930
import requests
from bs4 import BeautifulSoup
hook_exchange = "여기가 웹후크 URL 자리"
def ecobro(page):
site = "https://finance.naver.com/item/main.naver?code="
r = requests.session()
response = r.get(site + page)
bs = BeautifulSoup(response.content, "html.parser")
# 종목 이름
name = bs.find_all('div', attrs={'class':'wrap_company'})
subject = name[0].find('h2').text
# 사업 분야
work = bs.find_all('div', attrs={'class':'section trade_compare'})
detail = work[0].find('a').text
# 차트 이미지 url
chart = bs.find_all('img', attrs={'id':'img_chart_area'})
img_url = chart[0]['src']
# 시간 정보
now = bs.find_all('span', attrs={'id':'time'})
ref_time = now[0].text
results = bs.find_all('div', attrs={'class':'today'})
plusminus = '0'
# 전일 대비 상승 or 하락 +, - 기호 붙이기
ex_day = bs.find_all('div', attrs={'class':'rate_info'})
for j in ex_day:
try:
minus = j.find_all('span', attrs={'class':'ico minus'})
plusminus = minus[0].text
except:
plus = j.find_all('span', attrs={'class':'ico plus'})
plusminus = plus[0].text
# +, - 가 아니면 None으로 나오는데, 그걸 그냥 +로 넣음
if plusminus == None:
plusminus = '+'
for i in results:
result = i.find_all('span', attrs={'class':'blind'})
#print(f'현재가 : {result[0].text}')
#print(f'전일 대비 상승가 : {result[1].text}')
#print(f'전일 대비 상승률 : {result[2].text}')
msg = ">" + " " + ref_time + " " + "(" + detail + ")" + "종목 :" + " " + subject + " " + "/" + " " + "현재가 : " + result[0].text + "원" + " " + "/" + " " +"전일 대비 가격변동 :" + " " + plusminus + result[1].text + "원" + " " + "/" + " " + "전일 대비 변동률 :" + " " + plusminus + result[2].text + "%" + " " + img_url
data = {"username": '에코형제 알리미', "content": msg, "embed":"false"}
requests.post(hook_exchange, json=data)
ecobro("247540")
ecobro("086520")
ecobro("047050")
ecobro("352820")
ecobro("005930")
웹후크에는 post방식으로 request 해야하기 때문에
requests.post(hook_exchange, json=data) << 이 코드를 써줬다.
코드 실행 모습
코드가 단발적으로 실행되는데,, 이걸 주기적으로 실행시키기 위한 방법이 2가지가 있다.
1. 윈도우 스케줄러 이용
2. 리눅스 서버에 코드를 올리고 crontab 이용
필자는 2번을 사용해 평일 09시 ~ 15시 30분 사이, 5분 간격으로 알림이 오도록 설정했다.
주기적으로 코드 실행하기
이마저도 서버가 꺼지면 동작을 하지 않는다. aws를 쓰면 될지도..?
728x90
반응형
'IT' 카테고리의 다른 글
리눅스 파일시스템 mount 오류 해결 (0) | 2023.11.29 |
---|---|
mysql 사용자 계정 비밀번호 변경 (0) | 2023.11.27 |
리눅스 서버에서 파일 시스템 mount / unmount 하기 (0) | 2023.11.03 |
문서(document) 데이터베이스 / 대표적인 것은 몽고DB (0) | 2023.10.29 |
NoSQL - 분산모델(복제, 샤딩) (0) | 2023.10.27 |
댓글