CREATE USER 'user_name'@'ip_address' IDENTIFIED BY 'password';
user_name: 유저 이름
ip_address: 접속하는 ip 주소
password: 비밀번호
GRANT ALL PRIVILEGES ON (별).(별) TO 'encore'@'%';
마크다운에서 *을 어떻게 쓰는지 몰라서 별이라고 함
# naver.py
import requests
import pandas as pd
def get_stock(code, page):
naver_url = "https://finance.naver.com/item/sise_day.naver?code={}&page={}"
head = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"}
r= requests.get(naver_url.format(code,page),headers=head)
return pd.read_html(r.text)[0].dropna()
url 주소에서 requests를 통해 긁어온다. 네이버는 치사하게도 파이썬 접근을 제한하고 있으므로 head를 통해 속여서 접근한다.
그리고 이를 판다스를 활용하여 데이터프레임으로 변환 우리는 이 데이터프레임을 가지고 DB에 쿼리를 날릴 것이다.
from naver import get_stock
import numpy as np
import pymysql
samsung = get_stock("005930", 2)
samsung.dtypes
samsung[['종가', '전일비', '시가', '고가', '저가', '거래량']] = \
samsung[['종가', '전일비', '시가', '고가', '저가', '거래량']].astype(np.int64)
samsung['거래금액'] = samsung['종가'] * samsung['거래량']
삼성의 주식 코드는 005930, 그리고 2페이지를 가져오려고 한다.
samsung.columns를 확인해보면 아래와 같은 결과가 나온다.
우리는 int 형 데이터를 다룰 것이기 때문에 이를 전부 int 형으로 바꿔준다.
다시 결과를 확인해보면
# dbconnect.py
import pymysql
def connection(host='127.0.0.1',
user='happyeon', password='123',
charset='utf8', db='play'):
try:
con = pymysql.connect(host=host,
user=user, password=password,
charset=charset, db=db)
cur = con.cursor()
except Exception as e:
print ("error ->", e)
return cur,con
아까 초기에 설정한 username/ip address/ password를 통해 user/host/password로 연결
그리고 커서를 생성하여 반환
cur, con = connection()
samsung['종목'] = '005930'
samsung = samsung[['종목', '날짜', '종가', '전일비', '시가', '고가', '저가', '거래량', '거래금액', ]]
create table stock_day(
symbol varchar(200),
stock_date date,
close bigint,
`before` bigint,
open bigint,
high bigint,
low bigint,
vol bigint,
money bigint,
primary key(symbol,stock_date)
);
pk 값을 주식 코드말고도 날짜도 설정해줬다.
같은 주식코드여도 날짜가 다를 때 유의미한 데이터이기 때문이다.
sql = "INSERT INTO stock_day VALUES (%s , %s , %s , %s , %s , %s , %s , %s , %s)"
for idx, row in samsung.iterrows():
try:
cur.execute(sql,list(row.values))
except:
pass
con.commit()
execute의 2번째 파라미터는 리스트,튜플, 딕셔너리만 가능
마지막에 commit을 꼭 해줘야 한다.