Play Data 2주차 화요일

이정연·2023년 2월 21일
0

Machine Learning

목록 보기
4/8

MySQL 접속 (M1)

  • brew services start mysql
  • sudo mysql -u root

MySQL 계정 생성

CREATE USER 'user_name'@'ip_address' IDENTIFIED BY 'password';

user_name: 유저 이름
ip_address: 접속하는 ip 주소
password: 비밀번호

계정 생성후 권한 부여

GRANT ALL PRIVILEGES ON (별).(별) TO 'encore'@'%';

마크다운에서 *을 어떻게 쓰는지 몰라서 별이라고 함

네이버 주식 정보 DB에 때려박기

웹 크롤링

# 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 형으로 바꿔준다.

다시 결과를 확인해보면

Python과 DB 연결

# 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로 연결
그리고 커서를 생성하여 반환

종목 column 추가

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을 꼭 해줘야 한다.

profile
0x68656C6C6F21

0개의 댓글