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)만을 정리하였다.
'심심풀이 > 기타' 카테고리의 다른 글
그래스호퍼로 점묘화 만들기 (0) | 2021.04.03 |
---|---|
Canon CT-40 공부 타이머 (1) | 2021.01.19 |