2017-08-12 108 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