본문 바로가기
파이썬/주식

Python,BS4 Naver Finance 국내 증시 기초 Data 수집 - 2

by 행복론자 2019. 12. 16.

이전 이야기

2019/12/15 - [파이썬/주식] - Python,BS4 Naver Finance 국내 증시 기초 Data 수집 - 1

 

Python,BS4 Naver Finance 국내 증시 기초 Data 수집 - 1

이번 포스팅에서는 Python으로 Naver Finance 국내 증시 기초 Data를 수집해보겠습니다. 코드나 내용은 이전에 포스팅 했던 글과 유사한 부분이 많습니다. 오늘 크롤링해볼 페이지는, 이렇게 생긴 페이

jsp-dev.tistory.com

 

Python,BS4 Naver Finance 국내 증시 기초 Data 수집 2탄입니다.

 

1탄에서는 타겟 html를 가져와 필요한 정보를 파싱해 엑셀 형태로 만드는 것을 해보았습니다.

하지만 이 많은 정보들을 한꺼번에 가져오려면 어떻게 해야할까요?

 

 

 

 

먼저 적용하기 버튼을 눌렀을 때의 어떤 request/response를 주고 받는지를 확인해보겠습니다. 

 

 

Chrome 개발자 도구에서 network를 확인해보면 https://finance.naver.com/sise/field_submit.nhn 로 위의 이미지와 같은 data를 담아 post 요청을 보냅니다.

저기서 fieldIds 영역에 선택한 항목들을 담아 보내는 것을 알 수 있습니다.

 

그렇다면 선택할 수 있는 모든 항목을 전부 fieldIds에 담아 post 요청을 보내면 어떨까요?

> Naver Finanance 국내증시 탭에서 제공하는 모든 정보를 한꺼번에 얻을 수 있습니다. 

  

 

그럼 한 번 해보겠습니다. 이 과정을 담은 코드를 첨부합니다. 1탄에서 첨부한 코드와 다른 점은 

1.https://finance.naver.com/sise/field_submit.nhnmenu, fieldIds, returnUrl를 담은 json 형태의 데이터를 준비합니다. 

2.post 요청을 보낸다.

import requests
from bs4 import BeautifulSoup
import numpy as np
import pandas as pd

BASE_URL='https://finance.naver.com/sise/sise_market_sum.nhn?sosok='

KOSPI_CODE = 0
KOSDAK_CODE = 1
START_PAGE = 1
fields = []

def main(code):
    # total_page을 가져오기 위한 requests
    res = requests.get(BASE_URL + str(code) + "&page=" + str(START_PAGE))
    page_soup = BeautifulSoup(res.text, 'lxml')

    # total_page 가져오기
    total_page_num = page_soup.select_one('td.pgRR > a')
    total_page_num = int(total_page_num.get('href').split('=')[-1])

    #가져올 수 있는 항목명들을 추출
    ipt_html = page_soup.select_one('div.subcnt_sise_item_top')
    global fields
    fields = [item.get('value') for item in ipt_html.select('input')]
    
    # page마다 정보를 긁어오게끔 하여 result에 저장
    result = [crawl(code,str(page)) for page in range(1,total_page_num+1)]

    # page마다 가져온 정보를 df에 하나로 합침
    df = pd.concat(result, axis=0,ignore_index=True)

    # 엑셀로 내보내기
    df.to_excel('NaverFinance.xlsx')

def crawl(code, page):
    global fields
    data = {'menu': 'market_sum',
            'fieldIds':  fields,
            'returnUrl': BASE_URL + str(code) + "&page=" + str(page)}
    # requests.get 요청대신 post 요청     
    res = requests.post('https://finance.naver.com/sise/field_submit.nhn', data=data)

    page_soup = BeautifulSoup(res.text, 'lxml')
    # 크롤링할 table html 가져오기
    table_html = page_soup.select_one('div.box_type_l')

    # Column명
    header_data  = [item.get_text().strip() for item in table_html.select('thead th')][1:-1]

    # 종목명 + 수치 추출 (a.title = 종목명, td.number = 기타 수치)
    inner_data = [item.get_text().strip() for item in table_html.find_all(lambda x:
                                                                           (x.name == 'a' and
                                                                            'tltle' in x.get('class', [])) or
                                                                           (x.name == 'td' and
                                                                            'number' in x.get('class', []))
                                                                           )]

    # page마다 있는 종목의 순번 가져오기
    no_data = [item.get_text().strip() for item in table_html.select('td.no')]
    number_data = np.array(inner_data)

    # 가로 x 세로 크기에 맞게 행렬화
    number_data.resize(len(no_data), len(header_data ))

    # 한 페이지에서 얻은 정보를 모아 DataFrame로 만들어 리턴
    df = pd.DataFrame(data=number_data, columns=header_data )
    return df

main(KOSPI_CODE)

 

 

위의 코드를 실행하면,

 

 

Naver Finance 국내증시 탭에서 제공하는 모든 항목을 얻어올 수 있습니다!

다음 포스팅은 이렇게 얻어온 데이터를 활용하여 우수(?) 종목을 추출하는 과정을 다뤄보겠습니다.

 

제 블로그에 방문해주셔서 감사합니다.
좋아요, 댓글은 제가 글을 쓰는데 큰 힘이 됩니다.
아래는 쿠팡 링크이고 쿠팡 파트너스 활동을 통해 일정 수익이 발생할 수 있음을 알려 드립니다.

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글