본문 바로가기
DB 공부하기

230221_DB복습

by 보랏 2023. 2. 21.

안녕하세요. 보랏입니다. 

 

오늘은 어제에 이어서 Linux, DB적재를 배우고

python을 통해 크롤링한 데이터를 얻었습니다.

 

바로 복습 시작하겠습니다. 

 

1. Linux - PuTTY

sudo systemctl status mariadb #active running 표시
  • Host Name : centOS에 ip addr을 입력하여 나온 가상  ip주소를 입력하여 open을 하면 리눅스서버와 연결됩니다.
  • Saved Sessions : 지속해서 연결하는 ip주소를 사용하기 위해서는 Saved Sessions에 추가하여 Save를 해주시면 됩니다. 

2. MySQL한글  설정

리눅스 서버에서 DB를 실행할 때 처음에 아무 설정도 안하면 한글은 깨져서 보일 수 있습니다. 

그렇기 때문에 PuTTY를 통해 리눅스에 'utf-8'을 설정해야합니다.

 

그 방법에 대해서 알아보도록 하겠습니다. 

cd /etc/my.cnf.d/ # my.cnf.d 폴더 이동

vim mysql-clients.cnf # mysql-.clients.cnf 파일 vim으로 열기

[mysql]
default-character-set = utf-8
[mysql_upgrade]
[mysqladmin]
[mysqlbinlog]
[mysqlcheck]
[mysqldump]
default-character-set = utf-8  #저장 후 닫기

vim server.cnf # server.cnf파일 vim으로 열기

[server]
character-set-server = utf8
collation-server = utf8_general_ci
init_connect = set names utf8:

vim client.cnf # client.cnf 파일 vim으로 열기

[client]
default-character-set=utf8

#재가동 및 상태 확인
systemctl restart mariadb
systemctl status mariadb
  • 한글을 설정하기 위해서는 Mysql, server, client에 모두 utf-8을 설정해주셔야 합니다. 
  • Mysql폴더에 접속하여 vim으로 mysql-clients.cnf를 열어서 위에 있는 괄호에 문구를 추가해주시면 됩니다. 
  • server파일과 client파일에 접속하여 똑같이 위의 문구를 추가해주시고 저장한 다음 재가동 해주시고 상태를 확인하시면 초록색으로 running(active)표시가 나타납니다. 

 

3. 리눅스 권한 확인

  • 리눅스는 파일별로 권한에 따라 읽기(r), 쓰기(w), 실행(x)을 가지고 있습니다. 그리고 이러한 상태에 따라 숫자로 불러서 부르게 됩니다. 
  • ls -al 명령을 사용하여 파일, 디렉토리 명령을 확인할 수 있으며 권한은 총 4부분으로 나눌 수 있습니다.

     - ex ) d rwx rw_ rw_

     - (-) : 파일, (d) : 디렉토리

     - rwx : 사용자 권한

     - rw_ : 그룹 권한

     - rw_ : 다른  사용자(others) 권한

  • r = 2^2, w = 2^1, x = 2^0 으로 만약 rwxrw_rw_ = 766, r__r__r__ = 444입니다. 
  • 그리고 이에 대한 권한변경을 시행하려면 chmod [번호][파일명]을 적어주시면 해당 번호에 맞는 권한으로 변경되게 됩니다. 

4. 크롤링 데이터 DB적재

  • 한국거래소(KRX) 홈페이지에 정보데이터시스템을 크롤링하여 DB에 적재하는 작업을 하였습니다. KRX홈페이지는 post구조의 홈페이지로 request구문을 활용하여 크롤링을 진행하였습니다.
  • 데이터 적재 전에 미리 SQL에 테이블(KRX)을 생성하였고, 파이썬에서 데이터 적재 시 컬럼 수 만큼 %s를 써주고서 r.json의 value 값을 찾아 데이터를 적재합니다. 이 때 con.commit이 반드시 필요합니다. 
import requests
import pymysql

#DB연결 
try:
    con = pymysql.connect(host='192.168.56.101', 
                          user='test', password='123', 
                          charset='utf8', db='test')
    cur = con.cursor()
except Exception as e:
    print ("error ->", e)

#크롤링 및 DB적재
krx_url = "http://data.krx.co.kr/comm/bldAttendant/getJsonData.cmd"
payload = {"bld"  : "dbms/MDC/STAT/standard/MDCSTAT01901",
            "locale"  : "ko_KR",
            "mktId"  : "ALL",
            "share"  : "1",
            "csvxls_isNo"  : "false",}
r = requests.post(krx_url, data=payload)

rt = r.json()

sql = "INSERT INTO KRX VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"

for data in rt['OutBlock_1']:
    try:
        cur.execute(sql, list(data.values()))
    except:
        pass
        
con.commit()

 

  • 이렇게 적재된 DB를 활용하여 SQL에서 코스피와 코스닥을 검색하는 쿼리를 작성 후에 이를 다시 파이썬으로 가져와 실행하고 padnas를 통해 표로 만들었습니다. 
import pandas as pd

krx = pd.read_sql_query("""SELECT *
FROM KRX
WHERE MKT_TP_NM IN ('KOSPI', 'KOSDAQ')""",con)

krx

 

5. loc, iloc,set_index

  • .loc : 데이터프레임의 행이나 컬럼에 컬럼명으로 접근하는 방법
  • .iloc : 데이터프레임의 행이나 컬럼에 인덱스값으로 접근하는 방법
  • .set_index(컬럼명) : 해당 컬럼명으로 인덱스 변경

6. 네이버 증권 크롤링 및 DB적재

  • 네이버증권 홈페이지에 데이터를 크롤링하여 DB에 넣는 작업을 하였습니다. 네이버 증권 홈페이지는 get방식의 홈페이지입니다. 
  • 시작하기 전에 똑같이 SQL에서 미리 테이블을 생성하였고, 이번에는 파생변수, 컬럼순서를 변경하여 데이터를 적재하였습니다. 
import requests
import pymysql
import numpy as np

# DB서버 연결
try:
    con = pymysql.connect(host='192.168.56.101', 
                          user='test', password='123', 
                          charset='utf8', db='test')
    cur = con.cursor()
except Exception as e:
    print ("error ->", e)
    
# 크롤링 함수 생성
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()
    
#변수생성, 컬럼 순서 변경, 1~20페이지 데이터 적재
sql = "INSERT INTO samsung VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)"

for i in range(1,20) : 
    data =  get_stock("005930", i)
    data[['종가', '전일비', '시가', '고가', '저가', '거래량']] = \
    data[['종가', '전일비', '시가', '고가', '저가', '거래량']].astype(int)
    data['거래금액'] = samsung['종가'] * samsung['거래량']
    data['종목'] = "005930"
    data = data[['종목','날짜', '종가', '전일비', '시가', '고가', '저가', '거래량', '거래금액']]
    # 파생변수
    # 컬럼순서 
    for idx, row in data.iterrows():
        try:
            cur.execute(sql, list(row.values))
        except Exception as e:            
            print(e)
            break
            
 con.commit()

 

8 . 기타용어

    1) POC(Proof of Concept) : 개념 실증

  • 새로운 프로젝트가 실제로 실현 가능성이 있는지 효과와 효용, 기술적인 관점에서 검증하는 과정
  • 프로토 타입 및 배포 : 시제품 만들기 
  • 검증 : 관계자, 피험자 등으로부터 사용 및 피드백 수렴
  • 실현 여부판단 : 실현가능성 판단

    2) HASH테이블

  • key, value로 데이터를 저장하는 자료구조로 빠르게 데이터를 검색할 수 있는 자료구조
  • 각각의 key값에 해시함수를 적용해 고유한 index생성, 이를 활용하여 값을 저장 검색 

 

이렇게 오늘 복습도 끝났습니다.

이제 이틀 뒤면 던파 신캐릭터인 뮤즈가 출시되는데, 

공부하느라 시간이 없어 제대로 즐길 시간도 없을 거 같네요..ㅠ(신캐 키우기 힘든...)

뮤즈 출시기념으로 일러스트 하나 남기고 들어가보도록 하겠습니다.

 

감사합니다.

 

'DB 공부하기' 카테고리의 다른 글

230224_DB 복습  (0) 2023.02.24
230222_DB복습  (0) 2023.02.22
230220_DB복습  (0) 2023.02.20
230217_DB복습  (0) 2023.02.17
230216_DB 복습  (0) 2023.02.16