2017-02-05 8 views
0

역사적인 날씨 데이터를 가져 오려고합니다. 원래는 표준 HTML 요소 등을 사용하여 기본 웹 페이지에서 웹 데이터를 긁어 내려고했으나, URL에 "? format = 1"을 추가하면 브라우저가 데이터 표로 구문 분석하기가 훨씬 쉬운 CSV를 표시합니다 ...XMLHTTP가 상위 웹 페이지에서 HTML을 가져 오는 중

그러나 아직 IE 브라우저를 사용하고 있는데, 많은 데이터를 가져 오기 위해 XMLHTTP 개체를 사용하여 데이터를 빠르게 가져 오는 것을 살펴보기 시작했습니다.이 문제는 URL의 끝에 "? format = 1"을 추가하면 좋은 날씬한 CSV,하지만 XMLHTTP를 사용하면 원래 페이지의 HTML을 가져 오지 CSV가 아닙니다!

XMLHTTP가 요청을 보낼 때 내가 좋아하는 것처럼 보입니다. 내가 지정한 csv가 아니라면 'parent'사이트에서 응답이 돌아옵니다. URL에서 HTML을 가져 오는 것으로 나타났습니다. .html로 끝나는 것처럼 .html에서 자르면 응답은 .html 페이지가 아닌 CSV 페이지가 아닌 이유입니다. 그래서 URL 프로토콜을 조사하여 XMLHTTP가 요청하도록하는 방법이 있는지 알아 보았습니다. 나는 꽤 멀리 내 요소 중 오전 아무것도 찾을 수있는 CSV의 URL하지만 ..

코드 당신이 나에게 줄 수있는 모든 도움을 주셔서 감사합니다 below- :

Public Sub downloadWebDataToCSV(URL As String) 

    Dim ADOStream As ADODB.Stream 
    Dim XMLHTTP As MSXML2.XMLHTTP60 

    Set XMLHTTP = New MSXML2.XMLHTTP60 
    XMLHTTP.Open "GET", URL, False 
    XMLHTTP.send 

    If XMLHTTP.Status = 200 Then 
     Set ADOStream = New ADODB.Stream 
     With ADOStream 
      .Open 
      .Type = adTypeBinary 
      .Write XMLHTTP.responseBody 
      .SaveToFile "C:\datafile.csv", 2 
      .Close 
     End With 
    End If 

End Sub 

을 여기에 부모와 CSV URL을뿐만 아니라 경우 그 helps-

Mainpage은 다음과 같습니다 https://www.wunderground.com/history/airport/KDAL/2003/10/15/DailyHistory.html CSV : 사전에 https://www.wunderground.com/history/airport/KDAL/2003/10/15/DailyHistory.html?format=1

감사합니다, TheSilkCode

답변

-1

당신이 웹의 반응을 살펴 경우 브라우저를 사용하면 "CSV"가 실제로 HTML임을 알게 될 것입니다. 브라우저에서 렌더링 할 때 CSV처럼 보입니다.

그것은

<body>TimeCDT,TemperatureF,Dew PointF,Humidity,Sea Level PressureIn,VisibilityMPH,Wind Direction,Wind SpeedMPH,Gust SpeedMPH,PrecipitationIn,Events,Conditions,WindDirDegrees,DateUTC<br> 
 
12:53 AM,54.0,50.0,86,30.12,10.0,ENE,3.5,-,N/A,,Clear,60,2003-10-15 05:53:00<br> 
 
1:53 AM,53.1,48.9,86,30.12,10.0,Calm,Calm,-,N/A,,Clear,0,2003-10-15 06:53:00<br> 
 
2:53 AM,52.0,48.9,89,30.11,10.0,Calm,Calm,-,N/A,,Clear,0,2003-10-15 07:53:00<br> 
 
3:53 AM,54.0,50.0,86,30.10,10.0,Calm,Calm,-,N/A,,Clear,0,2003-10-15 08:53:00<br> 
 
4:53 AM,51.1,48.0,89,30.10,10.0,Calm,Calm,-,N/A,,Clear,0,2003-10-15 09:53:00<br> 
 
5:53 AM,52.0,48.0,86,30.11,10.0,Calm,Calm,-,N/A,,Clear,0,2003-10-15 10:53:00<br> 
 
6:53 AM,51.1,48.0,89,30.13,10.0,Calm,Calm,-,N/A,,Clear,0,2003-10-15 11:53:00<br> 
 
7:53 AM,52.0,48.9,89,30.14,10.0,Calm,Calm,-,N/A,,Clear,0,2003-10-15 12:53:00<br> 
 
8:53 AM,57.9,53.1,84,30.15,10.0,Calm,Calm,-,N/A,,Clear,0,2003-10-15 13:53:00<br> 
 
9:53 AM,63.0,48.0,58,30.17,10.0,SSE,8.1,-,N/A,,Clear,150,2003-10-15 14:53:00<br> 
 
10:53 AM,66.9,46.9,49,30.16,10.0,SE,11.5,-,N/A,,Clear,140,2003-10-15 15:53:00<br> 
 
11:53 AM,70.0,46.0,42,30.14,10.0,SSE,13.8,-,N/A,,Clear,150,2003-10-15 16:53:00<br> 
 
12:53 PM,72.0,45.0,38,30.12,10.0,South,11.5,20.7,N/A,,Clear,170,2003-10-15 17:53:00<br> 
 
1:53 PM,75.0,46.0,36,30.08,10.0,South,13.8,18.4,N/A,,Clear,190,2003-10-15 18:53:00<br> 
 
2:53 PM,75.0,44.1,33,30.04,10.0,SSE,13.8,-,N/A,,Clear,160,2003-10-15 19:53:00<br> 
 
3:53 PM,75.9,45.0,33,30.02,10.0,South,16.1,-,N/A,,Clear,180,2003-10-15 20:53:00<br> 
 
4:53 PM,75.9,43.0,31,30.00,10.0,SSW,13.8,-,N/A,,Clear,200,2003-10-15 21:53:00<br> 
 
5:53 PM,75.0,46.0,36,29.99,10.0,South,11.5,-,N/A,,Clear,180,2003-10-15 22:53:00<br> 
 
6:53 PM,73.0,45.0,37,29.99,10.0,South,12.7,-,N/A,,Clear,180,2003-10-15 23:53:00<br> 
 
7:53 PM,69.1,46.9,45,30.01,10.0,South,10.4,-,N/A,,Clear,180,2003-10-16 00:53:00<br> 
 
8:53 PM,68.0,46.9,47,30.03,10.0,South,8.1,-,N/A,,Clear,170,2003-10-16 01:53:00<br> 
 
9:53 PM,68.0,48.0,49,30.02,10.0,South,13.8,-,N/A,,Clear,170,2003-10-16 02:53:00<br> 
 
10:53 PM,66.0,48.9,54,30.03,10.0,South,9.2,-,N/A,,Clear,180,2003-10-16 03:53:00<br> 
 
11:53 PM,64.9,50.0,58,30.03,10.0,South,8.1,-,N/A,,Clear,170,2003-10-16 04:53:00<br> 
 
</body>
당신이 반환되는 것을의 인코딩을 변경할 필요가 있다고 생각

+0

Hey @ Jake- 제 문제는 CSV의 HTML에 액세스 할 수 없다는 것입니다 ... XMLHTTP는 URL과 함께 제공되는 경우에도 CSV 페이지의 HTML을 반환하지 않지만 대신.html 페이지의 HTML은 구문 분석하기가 훨씬 어렵습니다. 나는 진정으로 막 다른 골목에 올랐다면 다시 돌아갈 수있는 IE 브라우저를 사용하여 가져 왔습니다.하지만 XMLHTTP를 훨씬 더 빨리 사용할 수 있기를 바랍니다. ... – TheSilkCode

1

, 당신은 직접 쓸 수있는 줄 바꿈 (<br>)에 의해 분리 된 텍스트의 단지 무리입니다 형식을 약간 정리 한 후 CSV. 형식을 변경하려면 몇 가지 요청 헤더를 설정해야합니다. 아래를 참조하십시오.

Public Sub downloadWebDataToCSV() 
    Dim URL As String: URL = "https://www.wunderground.com/history/airport/KDAL/2003/10/15/DailyHistory.html?format=1" 
    Dim XMLHTTP As New MSXML2.XMLHTTP60 

    With XMLHTTP 
     .Open "GET", URL, False 
     .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" 
     .setRequestHeader "content-type", "text/html; charset=UTF-8" 
     .send 
    End With 

    If XMLHTTP.Status = 200 Then 
     Dim fso As Object: Set fso = CreateObject("Scripting.FileSystemObject") 
     Dim Fileout As Object: Set Fileout = fso.CreateTextFile("C:\users\megatron\desktop\vba.txt") 
     Dim myText As String: myText = Replace(XMLHTTP.responseText, "<br />", vbCrLf) 
     Fileout.Write myText 
     Fileout.Close 
    End If 

End Sub 
+0

내 남자! 도와 주셔서 감사합니다. 그 헤더가 왜 내 문제를 해결했는지 정확히 알려지지 않았다. 헤더 사용에 대한 좋은 문서를 알고 있는가? 나는 개별 솔루션에 대한 설명을 보았지만 귀하의 메일 송부에 대한 개념을 이해하고 싶습니다. 얼마나 효과가 있었는지 ... 많이 받음 – TheSilkCode

+0

Google 크롬 헤더와 Internet Explorer를 비교했습니다. "content-type", "text/html; charset = UTF-8"이 크롬과 다르므로 사용했음을 알았습니다. 그것은 의미가 있습니다, 당신은 텍스트로 반환 될 결과를 요구하고 있습니다. –

+0

다음은 헤더에 대한 링크입니다. https://en.wikipedia.org/wiki/List_of_HTTP_header_fields –

0

당신은 예를 들어, URL에 의해 날씨 API를 통해 데이터를 얻을 수 있습니다

http://api.wunderground.com/api/c991975b7f4186c0/history_20031015/q/airport/KDAL.json

당신이 볼 수 있듯이, URL이 세 가지 변수 부분으로 구성 API 키 c991975b7f4186c0, 날짜 20031015 및 위치를 airport/KDAL. XHR을 만들면 응답이 JSON 형식으로 반환됩니다.

API 키를 구하고 JSON 응답을 구문 분석하는 방법은 this answer에서 볼 수 있습니다.

Weather API에 대해 자세히 알아보십시오.