본문 바로가기
심심풀이/기타

[파이썬] 분 단위 주가 정보 크롤링하기

by 돌멩이와 쥐 2021. 7. 4.

1. 사용되는 플러그인

import time
import requests as req
import pandas as pd
from bs4 import BeautifulSoup as bs

time: 크롤링 과정에서 time.sleep(sec)을 활용해 대상 웹서버에 단기간에 과도한 데이터를 요구하지 않도록 한다.

requests: 파이썬에서 주로 사용되는 크롤링용 플러그인 중 하나.

pandas: 이번 코드에서는 데이터를 DataFrame의 형태로 정리하기 위해 사용한다.

BeautifulSoup: 크롤링한 html 코드를 파싱하기 위한 용도

 

2. 대상 데이터: 펄어비스(263750)의 네이버 금융-시간별 시세 데이터

 네이버 금융에서는 각 종목의 개장부터 폐장까지의 기간을 1분 단위로 쪼개어 체결가, 전일비 등의 데이터를 제공하고 있다. 웹페이지는 url을 통한 GET방식으로 데이터를 전달하고 있는 모습이다.

 

3. 코드

[[[<span class="tah p11">80,900</span>, #체결가
   <span class="tah p11 nv01">
   				700 #전일비
   				</span>,
   <span class="tah p11">81,000</span>, #매도
   <span class="tah p11">80,900</span>, #매수
   <span class="tah p11">22,766</span>, #거래량
   <span class="tah p11">22,766</span>], #변동량
  [<span class="tah p11">80,800</span>,
   <span class="tah p11 nv01">
   				800
   				</span>,
   <span class="tah p11">80,800</span>,
   <span class="tah p11">80,700</span>,
   <span class="tah p11">32,696</span>,
   <span class="tah p11">9,930</span>]],
 [[<span class="tah p11">80,300</span>,
   <span class="tah p11 nv01">
   				1,300
   				</span>,
                ...

 requests 플러그인을 통해 크롤링을 진행한 후 BeautifulSoup을 통해 파싱, select를 하면 'span.tah.p11'에 들어간 위와 같은 데이터를 추출할 수 있다. 데이터는 삼중 리스트로 1차 리스트=전체 데이터, 2차 리스트=한 페이지의 데이터, 3차 리스트=하나의 행 데이터로 이루어져있는 모습이다. 3차 리스트 내부의 요소들은 체결가부터 변동량까지의 6개의 데이터를 포함하고 있다.

 한 페이지 내부에서 행과 행 사이, 전체 데이터에서 페이지와 페이지 사이에서 크롤링 순서와 시간의 순서가 역관계에 있는 경우인 관계로 reverse() 함수를 1차 리스트와 2차 리스트의 아이템에 적용하여 시계열에 맞도록 순서를 맞춰주었다.

def SE(html,num):
    string = html[num].text
    string = string.replace(',','')
    return int(string)

price = []
volume = []

l = len(html)

for i in range(0,l):
    htmla = html[i]
    L = len(htmla)
    for n in range(0,L):
        htmlb = htmla[n]
        LL = len(htmlb)
        for m in range(0,LL):
            if m == 0:
                price.append(SE(htmlb,m))
            elif m == 4:
                volume.append(SE(htmlb,m))
            else:
                pass

.text를 이용하여 파싱-selection을 거친 데이터에서 문자열을 추출한 뒤 이를 pandas 데이터프레임으로 만들기 위해 다음과 같은 전처리 과정을 해준다. 불필요한 데이터를 제외하고 체결가(인덱스 0)와 거래량(4)만을 정리하였다.

결과적으로 2021년 7월 2일의 거래 데이터가 392개의 행에 정리되었다.

 

'심심풀이 > 기타' 카테고리의 다른 글

그래스호퍼로 점묘화 만들기  (0) 2021.04.03
Canon CT-40 공부 타이머  (1) 2021.01.19