2017-08-12 114 views
1

我已經寫了一個宏,在vba中使用POST請求從網站獲取「名稱」。要到達目標頁面,有必要發送POST請求兩次。首先,一個頁面像下面的第一個圖像一樣打開。點擊起始頁面上的「按地址搜索」按鈕後,會導致另一個頁面,其中將顯示下面圖2中顯示的兩個框。一個用於街道號碼,另一個用於街道名稱。當表單完成填充後,點擊搜索按鈕後,它會導向目標頁面,其中包含我之後的信息。我在腳本中使用msgbox測試了它,以確保我在正確的頁面上。我肯定在那個頁面上,我可以看到那個頁面的標題是「HARRIS COUNTY APPRAISAL DISTRICT」。但是,我無法解析該頁面上的任何內容。我在該頁面後名爲「LARA PEDRO A & MARIA G」。無法使用POST請求解析網頁的名稱

這是我與嘗試宏:

Street No: 15535 
Street Name: CAMPDEN HILL RD 

這是兩個頁面下面的哪些目標網頁可以達到映象:

Sub httpPost() 

    Dim http As New XMLHTTP60, html As New HTMLDocument 
    Dim rec As HTMLHtmlElement 
    Dim ArgStr As String, ArgStr_ano As String 

    ArgStr = "search=addr" 
    ArgStr_ano = "TaxYear=2017&stnum=15535&stname=CAMPDEN+HILL+RD" 

    With http 
     .Open "POST", "https://public.hcad.org/records/QuickSearch.asp", False 
     .setRequestHeader "Content-type", "application/x-www-form-urlencoded" 
     .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36" 
     .setRequestHeader "Referer", "https://public.hcad.org/records/quicksearch.asp" 
     .send ArgStr 
    End With 

    With http 
     .Open "POST", "https://public.hcad.org/records/QuickRecord.asp", False 
     .setRequestHeader "Content-type", "application/x-www-form-urlencoded" 
     .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36" 
     .setRequestHeader "Referer", "https://public.hcad.org/records/quicksearch.asp" 
     .send ArgStr_ano 
     html.body.innerHTML = .responseText 
    End With 

    MsgBox http.responseText 
End Sub 

搜索與進行

https://www.dropbox.com/s/e9on9zwqzmcboze/1Untitled.jpg?dl=0」 「https://www.dropbox.com/s/0lchpde8uq63jps/pics.jpg?dl=0

我以某種方式使用Chrome開發人員工具捕獲了該網址,並在我的下面的代碼中使用該網址,我得到了我之後的結果。但是,我的「POST」請求有什麼問題?爲什麼我不能使用上述方法獲得相同的結果?爲您考慮,這裏是另一個代碼位使用從Chrome瀏覽器開發工具收集的網址是什麼,我得到通過發送POST請求的兩倍,我在上面的代碼中沒有得到結果:

Sub Web_Data() 
    Dim http As New XMLHTTP60, html As New HTMLDocument 
    Dim post As Object 

    With http 
     .Open "GET", "https://public.hcad.org/records/details.asp?crypt=%94%9A%B0%94%BFg%85%8D%83%82og%8El%87tXvXQJXJzDTpHjEyr%D4%BE%C2%AF%AE%AA%9Fpk%88%5Do%5B%B8%96%A3%C0q%5E&bld=1&tab=", False 
     .send 
     html.body.innerHTML = .responseText 
    End With 

    For Each post In html.getElementsByClassName("data")(2).getElementsByTagName("th") 
     i = i + 1: Cells(i, 1) = post.innerText 
    Next post 
End Sub 

結果是:

LARA PEDRO A & MARIA G 
15531 CAMPDEN HILL RD 
HOUSTON TX 77053-3302 
+0

這裏是一個類似的問題:來自同一個網站中檢索數據(它使用硒雖然)https://stackoverflow.com/questions/45559835/how-can-i-switch- iframe-using-selenium-vba – jsotola

+0

感謝jsotola的鏈接,但我不想用硒來做它。 – SIM

回答

1

終於自己解決了。這裏是工作代碼:

Sub httpPost() 

    Dim http As New WinHttp.WinHttpRequest, html As New HTMLDocument 
    Dim post As Object 
    Dim ArgStr As String, ArgStr_ano As String 

    ArgStr = "search=addr" 
    ArgStr_ano = "TaxYear=2017&stnum=15535&stname=CAMPDEN+HILL+RD" 

    With http 
     .Option(6) = True 
     .Open "POST", "https://public.hcad.org/records/QuickSearch.asp", False 
     .setRequestHeader "Content-type", "application/x-www-form-urlencoded" 
     .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36" 
     .setRequestHeader "Referer", "https://public.hcad.org/records/quicksearch.asp" 
     .send ArgStr 
    End With 

    With http 
     .Option(6) = True 
     .Open "POST", "https://public.hcad.org/records/QuickRecord.asp", False 
     .setRequestHeader "Content-type", "application/x-www-form-urlencoded" 
     .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36" 
     .setRequestHeader "Referer", "https://public.hcad.org/records/quicksearch.asp" 
     .send ArgStr_ano 
     html.body.innerHTML = .responseText 
    End With 

    For Each post In html.getElementsByClassName("data")(2).getElementsByTagName("th") 
     i = i + 1: Cells(i, 1) = post.innerText 
    Next post 

End Sub