지난 시간에는 네이버 주식 정보의 전체 리스트를 크롤링하는 방법을 살펴보았습니다. 이번 포스팅에서는 네이버 주식 정보에서 일자별로 자동 크롤링하는 방법을 소개하려고 합니다. 이 포스팅을 통해 최근 날짜부터 지정한 일수 만큼 해당 종목의 주식 정보를 크롤링하는 방법을 알아보겠습니다. 이전에 다룬 주식 정보 크롤링은 아래 링크를 확인하세요
1. 웹 페이지 구조 및 URL 확인
▼ 크롤링을 위해 웹 페이지 구조와 URL을 파악해야 원하는 정보를 크롤링 할 수 있는데요. 지난 시간 처럼 원하는 정보가 어디에 있는지 개발자 도구(F12)를 이용하여 웹페이지를 확인해야 합니다. 오늘 크롤링에 사용된 네이버 증권 사이트는 아래 링크에서 확인하세요. 먼저 원하는 주식 종목을 먼저 선택하고 개발자 도구에서 네트워크 초기화를 진행합니다. 그런 다음 일자별 데이터가 집계된 “시세” 탭을 클릭하면 네트워크에서 로드되는 데이터를 확인할 수 있는데요. “Header” 탭을 클릭하면 해당 정보의 URL을 확인할 수 있습니다.
▼ 네이버 증권 사이트 이동 → 주식 종목 선택 → 개발자 도구 실행 → 네트워크 초기화 → 시세 메뉴 선택 → URL 확인 및 응답 값 확인
1) URL 구조 확인
▼ 위에서 확인한 URL을 복사하여 웹에 붙여넣으면 아래와 같은 JSON 형태의 자료를 확인할 수 있는데요. 한 페이지에 10개의 정보가 크롤링 되는 것을 확인할 수 있습니다. 이 10개의 자료는 최근 날짜에서 10일간의 일자별 주식 정보가 담겨있습니다. URL을 분석하면 페이지 번호, 페이지 사이즈(목록수), 종목 코드로 구성된 것을 확인할 수 있습니다.
https://m.stock.naver.com/api/stock/" & 종목코드 & "/price?pageSize=" & 목록수 & "&page=" & 페이지 & "
2. 데이터 구조 파악
선택한 주식 시세의 URL을 통해 긴 리스트의 데이터를 확인했는데요. 이 데이터를 Jsonconverter를 이용하여 원하는 배열의 “키” 값을 호출하면 쉽고 간단하게 크롤링할 수 있습니다. 웹 페이지와 값을 비교하여 날짜, 시가, 고가, 저가, 종가, 전일대비, 등락률, 거래량의 키를 확인합니다. 예를 들어 날짜에 대한 키는 “localTradedAt”이며 10개 중에 첫 번째 날짜 값을 가져오려면 “Json(1)(“localTradedAt”)” 형식으로 해당 값을 크롤링할 수 있습니다. 오늘 크롤링에 사용할 키는 아래와 같습니다.
- localTradedAt : 거래일
- openPrice : 시가
- highPrice : 고가
- lowPrice : 저가
- closePrice : 종가
- compareToPreviousClosePrice : 전일 대비
- fluctuationsRatio : 등락률
- accumulatedTradingVolume : 거래량
3. 동적 URL 생성하기
위에서 URL 구조를 살펴보았는데요. URL을 변경하여 원하는 일자의 데이터를 불러올 수 있도록 변수로 지정해보겠습니다. 주식 정보 일자별 크롤링을 위한 동적 URL 조건은 아래와 같습니다.
① 입력한 일수를 10으로 나누고 소수로 표시되면, 값을 올림 함
– ex) 나눈값이 5.3일 때 6을 반환
② 만약 10으로 나눈 값의 나머지가 발생하면, 마지막 페이지의 pageSize에 사용
– ex) 53을 10으로 나눈 나머지 3은 마지막 페이지의 pageSize에 사용
③ 페이지 수(나눈값)가 1보다 작을 때는 pageSize에 해당 일수를 반영
– ex) 입력 일수가 8일 때 10으로 나눴을 때 1미만으로 pageSize는 8로 지정
4. 전체 코드 살펴보기
전체 코드에 대한 작동은 이전에 다루었던 네이버 주식 크롤링에서 다루었던 내용과 거의 동일합니다. 다만 크롤링하는 URL의 동적변환과 Json 구조에서 배열 안에서 키값을 불러오는 과정이 조금 다릅니다. 자세한 코드 해석은 아래 주석을 참고하세요. 오늘 작업한 주식 크롤링 파일은 맨 아래에 첨부했습니다. 다운로드해서 사용하시기 바랍니다.
Sub 일데이터가져오기()
' 필요한 변수를 선언합니다.
Dim winhttp As New WinHttpRequest ' HTTP 요청을 처리하기 위한 객체
Dim Json As Object ' JSON 데이터를 저장할 객체
Dim totalDays As Long ' 데이터를 가져올 총 일수
Dim divideValue As Long ' 한 페이지에 나눌 데이터 개수
Dim totalPages As Long ' 총 필요한 페이지 수
Dim remainderValue As Long ' 마지막 페이지에 필요한 데이터 개수
Dim currentPage As Long ' 현재 처리 중인 페이지 번호
Dim url As String ' 데이터를 가져올 URL
Dim stockCode As String ' 주식 종목 코드
Dim pageSize As Long ' 현재 페이지에서 가져올 데이터 개수
Dim r As Long ' 데이터를 기록할 시작 행
' 초기 설정
totalDays = Worksheets("Sheet2").Range("G2").Value ' Sheet2의 G2 셀에서 총 일수를 가져옵니다.
divideValue = 10 ' 데이터를 10개씩 나누기로 설정합니다.
stockCode = Worksheets("Sheet2").Range("A2").Value ' Sheet2의 A2 셀에서 주식 종목 코드를 가져옵니다.
r = 6 ' 데이터를 기록할 시작 행은 6행으로 설정합니다.
' 페이지 수 및 나머지 계산
totalPages = Application.WorksheetFunction.RoundUp(totalDays / divideValue, 0)
' 전체 데이터 개수를 10개씩 나눠 필요한 페이지 수를 계산합니다(올림 처리).
remainderValue = totalDays Mod divideValue
' 나머지를 계산해 마지막 페이지에 필요한 데이터 개수를 구합니다.
If remainderValue = 0 Then remainderValue = divideValue
' 나머지가 0일 경우 마지막 페이지에도 10개 데이터를 가져옵니다.
' 각 페이지에서 데이터를 가져오기 위한 반복문
For currentPage = 1 To totalPages
If currentPage = totalPages Then
' 마지막 페이지의 데이터 개수를 나머지 값으로 설정합니다.
pageSize = remainderValue
Else
' 다른 페이지는 10개씩 데이터를 가져옵니다.
pageSize = divideValue
End If
' 동적 URL 생성
url = "https://m.stock.naver.com/api/stock/" & stockCode & "/price?pageSize=" & pageSize & "&page=" & currentPage
' 주식 종목 코드와 페이지 번호, 페이지 크기를 기반으로 URL을 생성합니다.
' HTTP 요청을 보냅니다.
winhttp.Open "GET", url ' GET 요청을 보냅니다.
winhttp.Send ' 서버로 요청을 전송합니다.
result = winhttp.ResponseText ' 서버에서 받은 응답 데이터를 저장합니다.
Set Json = JsonConverter.ParseJson(result)
' 응답 데이터를 JSON 형식으로 변환하여 Json 변수에 저장합니다.
' JSON 데이터를 처리하여 Excel에 기록합니다.
For i = 1 To Json.Count
Cells(r, "A").Value = Json(i)("localTradedAt") ' 날짜
Cells(r, "B").Value = Json(i)("openPrice") ' 시가
Cells(r, "C").Value = Json(i)("highPrice") ' 고가
Cells(r, "D").Value = Json(i)("lowPrice") ' 저가
Cells(r, "E").Value = Json(i)("closePrice") ' 종가
Cells(r, "F").Value = Json(i)("compareToPreviousClosePrice") ' 전일 대비 가격
Cells(r, "G").Value = Json(i)("fluctuationsRatio") ' 변동률
Cells(r, "H").Value = Json(i)("accumulatedTradingVolume") ' 누적 거래량
r = r + 1 ' 데이터를 기록할 행을 다음으로 이동합니다.
Next i
Next currentPage
End Sub
5. 실행하기
Sheet 1에는 이전에 다루었던 네이버 주식 종목 크롤링 데이터가 있습니다. 주식 종목을 더블 클릭하면 해당 종목 코드가 자동으로 sheet 2의 A2 열에 삽입됩니다. Sheet 2의 A2열에 종목 코드가 삽입되면 Vlookup 함수를 이용하여 해당 코드의 정보가 입력됩니다. G2열에 조회일수를 입력하고 실행 버튼을 누르면, 입력한 숫자만큼 일자별 데이터를 최신순으로 크롤링합니다. 초기화버튼을 누르면 크롤링한 데이터는 모두 삭제됩니다.
▼ 주식 코드 입력(Sheet 1에서 선택) → 조회 일수 입력(Sheet 2 G2셀) → 실행