본문 바로가기
코딩 공부/python

네이버 금융에서 주식 시세 가져오기

by Camel_coding_food 2022. 2. 21.
반응형

저는 처음에 세미콜론 안쓰는게 어색하더라고요.

 

이번에는 네이버 금융에서 -> 내 DB로 주식시세를 가져오겠습니다.

 

def read_naver(self, code, company, pages_to_fetch):
        """네이버에서 주식 시세를 읽어서 데이터프레임으로 반환"""
        try:
            url = f"http://finance.naver.com/item/sise_day.nhn?code={code}"
            with urlopen(url) as doc:
            #url 속 데이터를 doc 변수에 저장해준다.
            
                if doc is None:       
                #아무것도 url 속에 없다면 none 반환.
                
                    return None
            html = BeautifulSoup(doc, "lxml")
            pgrr = html.find("td", class_="pgRR")   
            #html이라고 별명을 지어준 페이지 파싱 뷰티풀 수프를 이용해 페이지의 마지막 수를 구한다.
            
            if pgrr is None:
                return None
            s = str(pgrr.a["href"]).split('=')
            lastpage = s[-1]        
            #네이버 금융 시세 마지막 페이지를 구한다.
            
            df = pd.DataFrame()     
            pages = min(int(lastpage), pages_to_fetch)
            #설정 파일 페이지 수와 네이버 금융 페이지를 비교하여 작은걸 선택한다.
            
            for page in range(1, pages + 1):
                pg_url = '{}&page={}'.format(url, page)
                df = df.append(pd.read_html(pg_url, header=0)[0])   
                #일별 시세를 데이터프레임에 추가한다.
                
                tmnow = datetime.now().strftime('%Y-%m-%d %H:%M')   
                print('[{}] {} ({}) : {:04d}/{:04d} pages are downloading...'.
                    format(tmnow, company, code, page, pages), end="\r")
            df = df.rename(columns={'날짜':'date','종가':'close','전일비':'diff'
                ,'시가':'open','고가':'high','저가':'low','거래량':'volume'})   
                #칼럼명을 영문으로 바꾼다.
                
            df['date'] = df['date'].replace('.', '-')
            df = df.dropna()
            df[['close', 'diff', 'open', 'high', 'low', 'volume']] = df[['close',
                'diff', 'open', 'high', 'low', 'volume']].astype(int)
            df = df[['date', 'open', 'high', 'low', 'close', 'diff', 'volume']] 
            #데이터프레임을 만든다.
            
        except Exception as e:
            print('Exception occured :', str(e))
            return None
        return df

try except문으로 예외처리하여 

HTTP 에러에 대비합니다.

 

결론적으로

판다스의 데이터 프레임이 적용되고,

페이지의 마지막 값이 반영되고

칼럼을 영어로 바꾼

df (데이터프레임)이 반환됩니다.

 

 

 

 

이제 읽어온 시세를 DB에 저장합시다.

  
    def replace_into_db(self, df, num, code, company):
        """네이버에서 읽어온 주식 시세를 DB에 REPLACE"""
        
        with self.conn.cursor() as curs:
            for r in df.itertuples():
            #데이터프레임을 튜플로 순회처리한다.
                sql = f"REPLACE INTO daily_price VALUES ('{code}', "\
                    f"'{r.date}', {r.open}, {r.high}, {r.low}, {r.close}, "\
                    f"{r.diff}, {r.volume})"
                curs.execute(sql)	#sql에 df으로 받은 테이블을 저장하고, 업데이트한다. 
            self.conn.commit()
            print('[{}] #{:04d} {} ({}) : {} rows > REPLACE INTO daily_'\
                'price [OK]'.format(datetime.now().strftime('%Y-%m-%d'\
                ' %H:%M'), num+1, company, code, len(df)))

 

코드 작성 후 엔터를 눌렀을 때 done이 나오면 정상입니다.

반응형

댓글