vba 크롤링, 버튼 누를때 리퀘스트 따기
안녕하세요,
아래와같이 이전에 질문을 올렸었는데
https://www.oppadu.com/community/question/?mod=document&pageid=1&uid=72208&execute_uid=72208
셀레니움이 데이터 가져오는게 너무 느려서
다른 방식이 없는지 궁금합니다.
https://finance.yahoo.com/quote/CROX/financials/ 사이트에서
Annual / Quarterly 버튼을 누를때
발생하는 리퀘스트를 분석해서 winhttp로 던지고, 리턴을 받고싶은데요
리퀘스트를 어떻게 코드에 적용해야하는지 모르겠습니다..
https://finance.yahoo.com/quote/CROX/financials/
해당 사이트에서 income statement의 Annual 탭에서
row svelte-1ezv2n5라는 클래스를 불러와서
테이블에 있는 데이터 break down / ttm / 12/31/2023 / 12/31/2022 ...쭉쭉 뽑아낼 수 있는 상황인데요
Annual 이 아닌 Quarterly탭을 클릭했을때의 바뀌는 데이터를 접근해보고 싶은데
문제가.. 클래스 네임이 Annual과 Quarterly 양쪽 모두 row svelte-1ezv2n5로 같습니다.
Annual 과 Quarterly버튼을 누를 때
table index의 값이 바뀌면서. table에서 나오는 데이터가 바뀌고 있는데요
클래스 네임은 동일해서 vba에서 추출할때 어떻게 접근해야하는지 모르겠습니다..
셀레니움으로 버튼을 클릭했을 때 접근가능해보이긴하는데
셀레니움 속도가 느려서 winhttp로 구현해보고 싶습니다.
Quarterly에 어떻게 접근하는게 좋을지 고견 부탁드리겠습니다.
Quarterly버튼을 클릭하고 나서의 http를 어떻게 접근할 수 있을까요?
미리 감사합니다
박
조
김
댓글 1
특정 element에서 click하고 조회되는 내용을 스크랩하는 예입니다.
With WD If vUser(3) = "AA" Then .Get "https://www.someserver.co.kr/ca_title.php" Else GoTo EXIT_RUN On Error GoTo 0 .FindElementById("s_class").AsSelect.SelectByText (IIf(vUser(6) = "전체", vUser(5), vUser(6))) .FindElementByName("special").AsSelect.SelectByText (vUser(7)) .FindElementByName("scale").AsSelect.SelectByText ("100") Set oNODEs = .FindElementsByClass("btn_box_s") For Each oNODE In oNODEs If oNODE.TagName = "input" Then oNODE.Click Next oNODE On Error Resume Next Set oNODE = .FindElementByClass("no_print") Set oNODE = .FindElementByClass("f13") iCnt = oNODE.Text iCnt = Replace(Mid(iCnt, InStr(1, iCnt, ":") + 1), "건)", "") iCnt = CLng(iCnt) ReDim vD(1 To iCnt + 1, 1 To 14) If iCnt > 100 Then Set oNODE = .FindElementByClass("pagn") sHref = oNODE.FindElementByTag("a").Attribute("href") End If Do While p < iCnt ChangeProgress Int(p * 100 / iCnt) ChangeProgressDescription p & "/" & iCnt & " " & vUser(3) & "자료를 조회중입니다." Set trs = .FindElementsById("list_body")(1).FindElementsByTag("tr") R = 0 For Each tr In trs R = R + 1 c = 0 ChangeProgress Int((p + R) * 100 / iCnt) ChangeProgressDescription p + R & "/" & iCnt & " " & vUser(3) & "자료를 조회중입니다." ReDim vT(1 To 8) For Each td In tr.FindElementsByTag("td") c = c + 1 vT(c) = td.Text Next td On Error Resume Next vD(p + R, 1) = vUser(3) vD(p + R, 2) = Split(vT(3), Chr(10))(1) vD(p + R, 3) = Split(vT(3), Chr(10))(0) vD(p + R, 4) = Split(vT(4), Chr(10))(0) vD(p + R, 5) = Trim(Split(REGEXEXTRACT(vT(4), "\d*,*\d*.\d*㎡"), "㎡")(0)) '"\s\d*.\d*㎡" vD(p + R, 6) = Split(vT(5), Chr(10))(0) vD(p + R, 7) = Split(vT(5), Chr(10))(1) vD(p + R, 8) = Replace(vT(6), Chr(10), "") On Error GoTo 0 Next tr p = p + 100 If p < iCnt Then sHref = Left(sHref, InStr(1, sHref, "start=", vbTextCompare) + 5) & p If p < iCnt Then .Get sHref Range("A10").Resize(UBound(vD, 1), UBound(vD, 2)) = vD Loop End With