오늘은 크롤링을 통해서 주식 종목을 가져오겠다.

크롤링을 위해 네이버 증권의 시가총액 탭을 이용할 것이다.

 

구글colab을 이용해서 파이썬을 설치하지 않은 사람도

따라할 수 있는 크롤링을 진행해보겠다.

 

import urllib.request #웹에 접근하기 위한 모듈
from bs4 import BeautifulSoup as bs #웹 크롤링을 위한 모듈

 

먼저, 크롤링을 위한 모듈을 import 합니다.

네이버 증권은 BeautifulSoup을 통해서도

쉽게 접근이 가능하기 때문에 BeautifulSoup으로

간단하게 웹 정보를 긁어 오고자 합니다.

 

STOCKLIST_URL = "https://finance.naver.com/sise/sise_market_sum.nhn?sosok=0&page=1" #주소설정

 

접속할 네이버 증권의 주식정보가 있는 페이지이다.

finance.naver.com/sise/sise_market_sum.nhn?여기까지는 사이트의 주소이며,

?뒤는 쿼리문이다.

sosok은 코스닥과 코스피를 구분해주며, 1과 0으로 구분한다.

page는 페이지를 의미하며, 페이지가 리스트를 넘어가면

페이지를 표시할 수 없다는 페이지가 나온다.

 

본격적인 전체 종목 크롤링에 앞서

한페이지가 잘 읽히는지 진행해보겠다.

response = urllib.request.urlopen(STOCKLIST_URL)
STOCKLIST_HTML = response.read()
soup = bs(STOCKLIST_HTML)
soup

BeautifulSoup을 이용해 네이버 증권의 html 소스를 읽었다.

이런식으로 HTML 코드가 출력된다.

이제 여기서 크롤링 하고자 하는 부분의 HTML코드를 확인하고

가져와보자

all_tr = soup.findAll('tr')
all_tr

주식정보는 tr태그 안에 있으므로 모든 tr태그를 가져와봤다.

그 중에서도 우리는 td태그 안에 있는 a태그 중 class가 title인 것들을

종목명으로 가져올 것이다.

all_tr[7].findAll('a', attrs={'class', 'tltle'})[0]

한번 확인해보니 종목명이 잘 나오는걸 볼 수 있다.

하지만 종목명의 앞 뒤로 있는 a태그를 없애주고

 

1페이지 안에 있는 모든 종목명을 가져와봤다.

STOCK_NAME_LIST = []

for tr in soup.findAll('tr'):
    stockName = tr.findAll('a', attrs={'class', 'tltle'})
    if stockName is None or stockName == []:
        pass
    else:
        print(stockName[0].contents[-1])
        STOCK_NAME_LIST.append(stockName)
    
STOCK_NAME_LIST

이런식으로 원하는 내용이 잘 나오는 것으로 보인다.

 

다음으로 현재가를 가져와 보겠다.

현재가는 매일 변하기 때문에 주식을 분석할 때

유용하게 사용될 수 있는 정보이다.

 

위에서 종목명을 가져온 방식으로

현재가를 가져올 것이다.

이 방식으로 현재가 뿐만 아니라, 시가총액, 등락률, 외국인 비율 등

네이버 증권에서 제공하는 정보를 가져올 수 있다.

 

일단 이번에는 간단하게 현재가에 대한 정보만 가져와보겠다.

STOCK_PRICE_LIST = []

for tr in soup.findAll('tr'):
    stockPrice = tr.findAll('td', attrs={'class', 'number'})
    if stockPrice is None or stockPrice == []:
        pass
    else:
        print(stockPrice[0].contents[-1])
        stockPrice = stockPrice[0].contents[-1]
        STOCK_PRICE_LIST.append(stockPrice)
STOCK_PRICE_LIST

종목명을 가져온 방식이랑 똑같다.

가격이 원해는대로 잘 출력된다.

이제 함수를 만들어서

크롤링한 데이터로 테이블을 만들어보겠다.

 

def one_page_list(sosok, page):
    STOCKLIST_URL = "https://finance.naver.com/sise/sise_market_sum.nhn?sosok={}&page={}".format(sosok, page) #주소설정
    
    response = urllib.request.urlopen(STOCKLIST_URL)
    STOCKLIST_HTML = response.read()
    
    soup = bs(STOCKLIST_HTML)

    STOCK_NAME_LIST = []
    STOCK_PRICE_LIST = []

    for tr in soup.findAll('tr'):
        stockName = tr.findAll('a', attrs={'class', 'tltle'})
        if stockName is None or stockName == []:
            pass
        else:
            stockName = stockName[0].contents[-1]
            STOCK_NAME_LIST.append(stockName)

        stockPrice = tr.findAll('td', attrs={'class', 'number'})
        if stockPrice is None or stockPrice == []:
            pass
        else:
            stockPrice = stockPrice[0].contents[-1]
            stockPrice = stockPrice.replace(",","")
            STOCK_PRICE_LIST.append(stockPrice)

    STOCK_LIST = []

    for i in range(len(STOCK_NAME_LIST)):
        stockInfo = [STOCK_NAME_LIST[i], int(STOCK_PRICE_LIST[i])]
        STOCK_LIST.append(stockInfo)

    return pd.DataFrame(STOCK_LIST, columns=('종목명','현재가'))

one_page_list(1, 1)

예전에 버거지수에서

맥도날드 데이터를 크롤링 할때와 유사한 방식이다.

 

그런데 주식 가격을 가져올 때,

단위를 구분하는 ","가 포함되어 있어서

가격을 정수화 하는데 문제가 있었다.

 

그래서 파이썬 내장함수를 이용해

가격에 있는 ","를 없애주었다.

 

그리고 데이터프레임으로 저장한 뒤,

코스닥의 1페이지를 크롤링 해봤다.

 

깔끔하게 잘 나오는 듯 하다.

 

이제 한페이지를 크롤링하는 함수를 활용해

전체 페이지를 크롤링 해보겠다.

 

import time
from itertools import count

def all_page_list():

    FINAL_LIST = []

    for sosok in range(2):
        for page in range(33):
            one_page_data = one_page_list(sosok, page+1)
            print("{}소속 {}페이지 진행 중 입니다.".format(sosok, page+1))
            
            if one_page_data is None:
                break
            
            FINAL_LIST.append(one_page_data)
            time.sleep(3)
    
    return pd.concat(FINAL_LIST)

ALL_STOCK_LIST = all_page_list()

ALL_STOCK_LIST

너무 빠르게 크롤링을 하면, 사이트에 영향을 줄 수 있기 때문에

3초의 딜레이를 주었다.

 

2974개의 종목이 가격과 함께 저장이 되었다.

 

현재가를 기준으로 가격순으로 바꾸어 봐보자.

ALL_STOCK_LIST.sort_values("현재가", axis=0, ascending=False, inplace=True)
ALL_STOCK_LIST

가격이 내림차순으로 정렬이 잘 되는 것을 볼 수 있다.

이제 파일을 저장하고 마무리하자.

 

colab을 사용했기 때문에 일반적인 방법으로 다운이 안되고

구글 drive에 파일을 한번 저장하고

그 파일을 다운받는 방식으로 최종 파일을 저장한다.

!mkdir -p '/content/drive/My Drive/stocklist_data'
ALL_STOCK_LIST.to_excel("/content/drive/My Drive/stocklist_data/STOCK_LIST_0724.xlsx")

from google.colab import files
files.download("/content/drive/My Drive/stocklist_data/STOCK_LIST_0724.xlsx")

엑셀파일로 잘 저장이 된 것을 확인할 수 있다.

+ Recent posts