[일상] naver 주식 페이지에서 전 종목 시세 가져오기

지난 번에 올린 상승 종목에 이어 전략을 적용하려면 증시에 상장된 모든 종목의 일봉 정보도 필요합니다. 이 정보 역시 naver에서 가져올 수 있습니다.

코스피와 코스닥 정보를 얻을 수 있는 url은 다음과 같습니다.

  • 코스피 : https://finance.naver.com/sise/sise_market_sum.nhnsosok=0
  • 코스닥 : https://finance.naver.com/sise/sise_market_sum.nhn?sosok=1

한 화면에 보이는 종목의 수는 최대 50개이므로 페이지를 계속 변경해가면서 정보를 크롤링해야합니다.

url에 페이지 정보를 추가할 수 있습니다. page 번호를 증가시키면서 검색을 계속하면 됩니다.

https://finance.naver.com/sise/sise_market_sum.nhn?sosok=1&page=2

이러한 정보를 바탕으로 코스피, 코스닥 전 종목 일봉을 받아오는 크롤링 프로그램을 만들어보겠습니다.

우선 코스피, 코스닥 기본 url을 지정을 합니다. 현재 네이버에서 검색이 가능한 코스피,코스닥 각각의 최대 page 수를 지정합니다. 이후에는 loop를 돌면서 page 수를 증가시키면서 해당 page의 시세 정보를 가져오는 get_stock_list()를 부릅니다.

def day_bong_list(name) :
    # 코스피
    url1 = 'https://finance.naver.com/sise/sise_market_sum.nhn?sosok=0'
    # 코스닥
    url2 = 'https://finance.naver.com/sise/sise_market_sum.nhn?sosok=1'
    close_price_list = {'kospi':url1, 'kosdaq':url2}

    close_list = {'kospi':url1, 'kosdaq':url2}
    # 총 페이지수, 상장 종목이 늘어나면 증가할 수 있음
    close_page_list = {'kospi':32, 'kosdaq':29}

    cnt = 1
    prices = []
    for i in range(0, close_page_list[name]) :
        print('page ', i+1)
        # 페이지 수를 포함하는 url을 만든다.
        url = close_price_list['kosdaq'] + '&page='+str(i+1)
        ret, cnt = get_stock_list(url, cnt) 
        prices += ret

특정 url에 있는 주식 시세 정보를 뽑아내는 함수입니다. 네이버에서는 최대 6개까지 검색할 항목을 지정할 수 있는데요. 꼭 필요한 정보만 설정을 했습니다. 만약 다른 정보가 추가로 필요하다면 설정을 바꾼 후 한번 더 호출하면 될 것 같습니다.

해당 페이지에서 주식 시세를 뽑는 방법은 이전 글에서 설명한 상승종목 뽑는 방식과 동일합니다. 다만 첫 컬럼에 있는 no 값이 1부터 시작하는 것이 아니라 페이지 별로 50씩 증가하는 값을 입력을 받아서 사용하는 부분만 차이가 납니다.

# 특정 url에 있는 정보를 뽑아냄 
def get_stock_list(url, cnt) :
    title_list = ['no', 'name', 'close', 'diff', 'per', 'base_p', 'qty', 'open', 'high', 'low', 'per', 'pbr', 'talk']
    with urllib.request.urlopen(url) as fs :
        soup = BeautifulSoup(fs.read().decode(fs.headers.get_content_charset()), 'html.parser')

    prices =[]
    # 각 데이터는 tr로 시작
    for tr in soup.find_all('tr') :
        # 각 항목은 td로 시작
        td_list = tr.find_all('td')
        try : 
            no = td_list[0].text.strip()
            if no[0] == '\n' :
                no = no.replace('\n','')
            # 빈줄, 라인 등 데이터가 아닌 경우도 있다.
            # 다행히 n 값에 1부터 증가하는 값이 기록되어 있으므로, 이 값이 맞으면 정상적인 데이터로 판단
            if int(no) == cnt :
                info = {}
                for i in range(0,len(td_list)) :
                    data = td_list[i].text.strip()
                    info[title_list[i]] = data
                if info['name'] == '2' : # 아래에 있는 페이지 정보이므로 무시
                    continue
                prices.append(info)
                cnt+=1
        except :
            continue
    return prices, cnt

이렇게 뽑혀진 주식 시세는 별도 파일에 저장하여 향후에 다시 사용합니다. 저장하는 방법은 json 형태로 해도 되고, cvs 형태로 할 수도 있습니다.

    # 저장
    fname = TODAY+'_'+name+'_day_bong_list.txt'
    save_to_file_json(fname, prices)
    print('done ', name)

소스코드는 git hub에 올려 놓았습니다. 어제 쓴 상승 종목을 뽑는 파이썬 프로그램도 함께 올려놓았습니다.

https://github.com/multizone-quant/system-trading/blob/master/day-bong-list.py


Comments
Steemie currently dosen't allow you to make comments. If you want to write something, write it using another frontend (like Steemit)
Click there to view this post on Steemit.com