주식 정보는 다양한 방법으로 수집할 수 있는데요. 증권사, 포털, 커뮤니티 등 다양한 매체에서 주식에 관련된 정보를 제공하고 있습니다. 오늘은 네이버 증권에서 제공하는 주식 정보를 엑셀의 VBA를 이용하여 크롤링하는 방법을 알아보겠습니다. 이 포스팅에서는 종목 코드, 종목명, 현재가, 시가총액, 거래량을 크롤링하는 기초적인 방법을 다루겠습니다.
1. 네이버 주식 웹 사이트 구조 알아보기
크롤링을 하기 위해서 먼저 알아야하는 것이 웹사이트 구조인데요. 웹사이트에서 원하는 주식 정보가 어디에 있는지, 어떻게 구성되어있는지 확인해야 올바른 정보를 크롤링할 수 있습니다. 먼저 네이버 주식 사이트에 접속하고 개발자 도구(F12)를 이용하여 사이트 구조를 파악해보겠습니다.
1) 비동기 방식
네이버 주식 웹 사이트로 이동하여 개발자 도구를 실행하면 html 코드와 클래스, ID 등을 확인할 수 있습니다. 하지만 해당 html 소스를 보면 원하는 정보를 찾을 수 없는데요. 네이버 주식 사이트는 하단의 “더보기”를 클릭하여 확장되는 비동기 방식으로 사이트가 로드되기 때문인데요. 이러한 사이트는 서버와 비동기적으로 통신하여 필요한 데이터를 받아오고, 페이지 일부만 업데이트하기 때문에 주소(URL)는 변하지 않으면서 페이지 내용만 변경됩니다.
2) URL 확인하기
비동기 방식으로 일부만 업데이트되는 사이트는 추가되는 URL 정보를 기존의 사이트 내용에 이어붙이는 형태인데요. “더보기”를 눌렀을 때 생성되는 url을 확인하고 응답받은 데이터들을 정리하면, 원하는 정보를 쉽게 크롤링할 수 있습니다.
개발자 도구(F12)에서 “Network”를 클릭하고 아래 그림과 같이 초기화 버튼을 클릭합니다. 그럼 기존에 로드되었던 네트워크 기록이 모두 제거되는데요. 이때 네이버 주식 정보 아래 “더보기”를 클릭합니다. 새로운 움직임이 감지되면 개발자 도구 아래에 page 번호와 PagesSize로 구성된 응답을 확인할 수 있습니다.
위에서 찾은 page 번호와 PagesSize로 구성된 응답을 선택하고 개발자 도구에서 “Headers” 메뉴를 선택하면 아래 그림과 같이 url을 확인할 수 있는데요. url 구조는 페이지 번호가 있고, 한 페이지당 20개의 리스트로 구성을 표시하고 있습니다. 이 url 구조에 변수를 추가하면 전체 주식 종목을 크롤링할 수 있습니다. 이 부분은 아래에서 자세히 다루겠습니다.
3) 준비물
자료를 크롤링하기 위해 Json Converter 모듈을 다운받아 설치해야 합니다. 설치과정은 따로 다루지 않겠습니다. Json Converter 모듈이 필요하시면 아래 실습 파일을 다운받아 사용하시기 바랍니다.
Json Converter 모듈은 VBA에서 JSON 데이터를 처리하려면 문자열을 수작업으로 분해하고 키와 값을 찾아야 하지만, JSON 모듈을 사용하면 이를 자동으로 처리하여 크롤링을 쉽게 할 수 있습니다.
4) 네이버 주식 크롤링 VBA 코드 작성
Sub 모든종목추가()
Dim winhttp As New WinHttpRequest
WinHttpRequest 객체를 생성하여 웹 요청을 보내고 응답을 받기 위한 준비를 합니다.
Add = "https://m.stock.naver.com/api/stocks/marketValue/KOSPI?page=1&pageSize=20"
winhttp.Open "Get", Add
winhttp.Send
result = winhttp.ResponseText
Add 변수에 요청할 URL을 저장합니다.
winhttp.Open GET 방식으로 Add(url)에 요청합니다.
winhttp.Send를 통해 요청을 보냅니다.
서버로부터 받은 응답 데이터(텍스트 형식)를 result 변수에 저장합니다.
Set Json = JsonConverter.ParseJson(result)
Set stocks = Json("stocks")
JsonConverter.ParseJson 함수로 result 데이터를 JSON 형식으로 파싱합니다.
JSON 데이터에서 “stocks” 키에 해당하는 부분만 stocks 변수에 저장합니다. stocks 변수에는 주식 종목의 데이터가 배열로 저장됩니다.
Cells(2, "a").Value = Json("stocks")(1)("itemCode") '종목코드
Cells(2, "b").Value = Json("stocks")(1)("stockName") '종목명
Cells(2, "c").Value = Json("stocks")(1)("closePrice") '현재가
Cells(2, "d").Value = Json("stocks")(1)("marketValue") '시가총액
Cells(2, "e").Value = Json("stocks")(1)("accumulatedTradingVolume") '거래량
stocks의 첫 번째 항목에 대한 종목 코드, 종목명, 현재가, 시가총액, 거래량 값을 지정한 위치에 기록합니다.
실행(F5)을 하면 아래 그림과 같이 엑셀 시트에 잘 기록하는 것을 확인할 수 있습니다.
5) 전체 데이터 불러오기 – 반복 실행
이제 네이버 주식에 있는 주식 정보 리스트를 모두 크롤링 하도록 코드를 변경하겠습니다. 전체 리스트 값을 확인해야하는데요. Network → Preview에서 totalCount 값을 확인하면 전체 주식 종목의 수를 확인할 수 있습니다. 여기서 한 페이지에 20개가 로드되고 전체 종목수가 2284개이니 페이지 수 * 종목 수가 totalCount 값을 넘어서지 않도록 반복 실행할 수 있게 코드를 변경하겠습니다. 반복 실행에 필요한 내용은 아래 코드에 주석을 확인하세요.
Sub 모든종목추가()
Dim winhttp As New WinHttpRequest
r = 2 ' 행 번호 지정
Do ' 반복설정
Page = Page + 1 ' 페이지 설정
Add = "https://m.stock.naver.com/api/stocks/marketValue/KOSPI?page=" & Page & "&pageSize=20"
winhttp.Open "Get", Add
winhttp.Send
result = winhttp.ResponseText
Set Json = JsonConverter.ParseJson(result)
For i = 1 To Json("stocks").Count ' stocks 수에 따른 키값 출력
Cells(r, "a").Value = Json("stocks")(i)("itemCode")
Cells(r, "b").Value = Json("stocks")(i)("stockName")
Cells(r, "c").Value = Json("stocks")(i)("closePrice")
Cells(r, "d").Value = Json("stocks")(i)("marketValue")
Cells(r, "e").Value = Json("stocks")(i)("accumulatedTradingVolume")
r = r + 1 ' 다음 행으로 이동
Next
Loop While Page * 20 < Json("totalCount") ' totalCount 값을 기준으로 반복
End Sub
위 코드를 실행하면 네이버 주식에 있는 코스피 종목을 모두 불러오는 것을 확인할 수 있습니다. 코스닥 종목을 불러오려면 Add에 url을 코스닥에 맞춰 변경하면 해당 종목도 크롤링 할 수 있습니다. 아래 파일은 전체 코드 내용이 입력된 파일입니다. 파일을 실행하시고 “실행”버튼을 누르면 크롤링이 시작됩니다.