이전 이야기
2019/12/15 - [파이썬/주식] - Python,BS4 Naver Finance 국내 증시 기초 Data 수집 - 1
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.nhn에 menu, 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 국내증시 탭에서 제공하는 모든 항목을 얻어올 수 있습니다!
다음 포스팅은 이렇게 얻어온 데이터를 활용하여 우수(?) 종목을 추출하는 과정을 다뤄보겠습니다.
제 블로그에 방문해주셔서 감사합니다.
좋아요, 댓글은 제가 글을 쓰는데 큰 힘이 됩니다.
아래는 쿠팡 링크이고 쿠팡 파트너스 활동을 통해 일정 수익이 발생할 수 있음을 알려 드립니다.
'파이썬 > 주식' 카테고리의 다른 글
Python으로 추세추종(모멘텀) 전략 백테스팅 (3) | 2020.01.02 |
---|---|
Python으로 모멘텀/가치 평가 주식 선정 , 종목 선정하기, Momentum Value Strategy by Python (13) | 2019.12.22 |
Python,BS4 Naver Finance 국내 증시 기초 Data 수집 - 1 (16) | 2019.12.15 |
Python, Backtrader로 전략검증, RSI 이용한 매매 전략 백테스팅(BackTesting) (2) | 2019.12.08 |
Python으로 ETF목록 추출하기 / Naver ETF 목록 가져오기 (0) | 2019.12.08 |
댓글