사용하던 OpenAPI가 법인지정 없이 전체검색을 했을때 send에서 시간이 너무 많이 걸려서 다른 OpenAPI가 없나 찾아보니 조금더 최신의 OpenAPI가 있어서 그걸로 교체했습니다.
데이터 이름은 '전국 도매시장 일별 실시간 경락가격 상세정보(법인사용코드포함)' 입니다.
근데 이게 검색을 하면 등록일이 2018년 1월 8일 등록으로 나오고, 원래 사용하던 OpenAPI는 2015년 11월 17일이 등록일로 나오는데 상세페이지로 들어가보면 등록일이 2014년 10월 24일과 2015년 11월 10일로 다르게 나옵니다.이부분은 어떤게 정확한건지 사실 모르겠습니다.
아무튼 테스트해본 결과 send를 했을때 걸리는 시간이 월등히 이쪽이 빨라서 교체를 결정했습니다.
서론이 길었네요. 교체할 OpenAPI의 상세 페이지 주소는 아래와 같습니다.
data.mafra.go.kr/opendata/data/indexOpenDataDetail.do?data_id=20180118000000000933&service_ty=O
원래 사용하던 OpenAPI와 요청변수와 Column의 위치만 조금 변경이 되므로
코드는 지난번에 사용하던 코드를 약간만 수정하면 되겠습니다.
Sub CallOpenAPI(mydate As String, instt As String, pn As String)
Dim strURL As String
Dim strResult As String
Dim objHttp As New XMLHTTP60
Dim apiKey$, sNumber$, eNumber$, searchName$, searchDate$, coName$, productName$
'한글 url 인코딩
Static objHtmlfile As Object
If objHtmlfile Is Nothing Then
Set objHtmlfile = CreateObject("htmlfile")
With objHtmlfile.parentWindow
.execScript "function encode(s) {return encodeURIComponent(s)}", "jscript"
End With
End If
apiKey = 인증키
sNumber = "1"
eNumber = "50"
searchName = "부산반여도매"
searchDate = Replace(mydate, "-", "") '날짜의 -(하이픈)을 제거
coName = instt
productName = pn
strURL = "http://211.237.50.150:7080/openapi/" & apiKey & "/xml/Grid_20180118000000000580_1/" & sNumber & "/" & eNumber
strURL = strURL + "?DELNG_DE=" & searchDate
strURL = strURL + "&PBLMNG_WHSAL_MRKT_NM=" & objHtmlfile.parentWindow.encode(searchName)
strURL = strURL + "&PRDLST_NM=" & objHtmlfile.parentWindow.encode(productName)
If instt <> "법인전체" Then
strURL = strURL + "&CPR_NM=" & objHtmlfile.parentWindow.encode(coName)
End If
objHttp.Open "GET", strURL, False
objHttp.Send
If objHttp.Status = 200 Then '성공했을 경우
strResult = objHttp.ResponseText
'XML로 연결
Dim objXml As MSXML2.DOMDocument60
Set objXml = New DOMDocument60
objXml.LoadXML (strResult)
'노드 연결
Dim nodeList As IXMLDOMNodeList
Dim nodeRow As IXMLDOMNode
Dim nodeCell As IXMLDOMNode
Dim nRowCount As Integer
Dim nCellCount As Integer
Dim xItem() As String
Dim aDate$, aTime$
Set nodeList = objXml.SelectNodes("/Grid_20180118000000000580_1/row")
Application.ScreenUpdating = False '화면 업데이트 (일시)정지
nRowCount = 2
For Each nodeRow In nodeList
nRowCount = nRowCount + 1
nCellCount = 0
ReDim xItem(1 To nodeRow.ChildNodes.Length)
For Each nodeCell In nodeRow.ChildNodes
nCellCount = nCellCount + 1
xItem(nCellCount) = nodeCell.Text
Next nodeCell
aDate = Left(xItem(8), 4) & "-" & Mid(xItem(8), 5, 2) & "-" & Mid(xItem(8), 7, 2)
aTime = Mid(xItem(8), 9, 2) & ":" & Mid(xItem(8), 11, 2)
'경매시간
Cells(nRowCount, 2).Value = aDate & " " & aTime
'경매구분
Cells(nRowCount, 3).Value = xItem(9)
'도매시장
Cells(nRowCount, 4).Value = xItem(3)
'도매법인
Cells(nRowCount, 5).Value = xItem(5)
'품목(품종)
Cells(nRowCount, 6).Value = xItem(12) + "(" + xItem(14) + ")"
'거래단량+규격
Cells(nRowCount, 7).Value = xItem(19) + xItem(20)
'등급
Cells(nRowCount, 8).Value = xItem(22)
'가격
Cells(nRowCount, 9).Value = xItem(18)
'거래량
Cells(nRowCount, 10).Value = xItem(30)
'산치
Cells(nRowCount, 11).Value = xItem(29)
Next nodeRow
Application.ScreenUpdating = True
Else
MsgBox "접속에 에러가 발생했습니다"
End If
End Sub
현재 코드는 1~50까지의 리스트만 출력하게 만들었습니다.
50이 넘어갈 경우의 처리를 사실 어떻게 해야할까 판단이 안서서 고민중에 있습니다.
이부분은 생각이 정리되서 방법이 떠오르면 다시 포스팅 하도록 하겠습니다.
마지막으로 테스트용 파일 올려두겠습니다.
XLtoEXE라는 프로그램을 사용해서 exe파일을 만들었는데 이녀석을 사용하면 바이러스로 인식을 합니다.
해서 사용해 보시라고 권장해 드리지는 않겠습니다. 꼭 테스트 해보고 싶다라고 하시는 분들만 받아서 사용해 보시기 바랍니다.
'엑셀 vba > 실시간 경락 정보' 카테고리의 다른 글
실시간 경락 정보 #5 데이터 표 만들기 (0) | 2021.02.23 |
---|---|
실시간 경락 정보 #3 데이터 가공 & 표시 (0) | 2021.02.13 |
실시간 경락 정보 #2 OpenAPI를 이용한 경락 정보 불러오기 (0) | 2021.02.12 |
실시간 경락 정보 #1 오픈 API 신청하기 (0) | 2021.02.12 |