使用 VBA 和 MSXML2.XMLHTTP 库进行网页抓取
Web Scraping using VBA and MSXML2.XMLHTTP library
我正在尝试在 VBA 环境 (Excel) 上使用 MSXML2.XMLHTTP 对象从网站抓取数据,但我不知道如何解决这个问题!网站如下:
http://www.detran.ms.gov.br/consulta-de-debitos/
大家可以使用下面的测试数据来填表:
- 地点:oon5868
- 雷纳瓦姆:1021783231
我想检索像 "chassi" 这样的数据,上面的数据将是“ 9BD374121F5068077”。
我在解析 html 文档时没有问题,困难的实际上是获取响应信息!代码如下:
Sub SearchVehicle()
Dim strPlaca As String
Dim strRenavam As String
strPlaca = "oon5868"
strRenavam = "01021783231"
Dim oXmlPage As MSXML2.XMLHTTP60
Dim strUrl As String
Dim strPostData As String
Set oXmlPage = New MSXML2.XMLHTTP60
strUrl = "http://www2.detran.ms.gov.br/detranet/nsite/veiculo/veiculos/retornooooveiculos.asp"
strPostData = "placa=" & strPlaca & "&renavam=" & strRenavam
oXmlPage.Open "POST", strUrl, False
oXmlPage.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
oXmlPage.send strPostData
Debug.Print oXmlPage.responseText
End Sub
POST 方法“.../retornooooveiculos.asp”中使用的 strURL 是 google 开发人员工具和 fiddler 向我展示的是该网站发布的正确地址有效负载。
手动访问时,网站会检索到正确的信息,但是 运行 我的代码总是在 .responseText 上得到以下响应:
<html>Acesse: <b><a href='http://www.detran.ms.gov.br target='_parent'>www.detran.ms.gov.br</a></b></html>
请帮助,我正在努力解决这个难题!为什么我会这样重定向?
我需要 "CHASSI" 信息,但找不到正确的 http 请求来执行此操作!
试试下面的方法。它应该为您获取您想要的内容。问题是您需要提供从 Request Headers
字段复制的 Cookie
才能使您的脚本正常工作,您可以使用 devtools 找到它。
Sub SearchVehicle()
Const URL As String = "http://www2.detran.ms.gov.br/detranet/nsite/veiculo/veiculos/retornooooveiculos.asp"
Dim HTTP As New ServerXMLHTTP60, HTML As New HTMLDocument
Dim elem As Object, splaca$, srenavam$, qsp$
splaca = "oon5868"
srenavam = "01021783231"
qsp = "placa=" & splaca & "&renavam=" & srenavam
With HTTP
.Open "POST", URL, False
.setRequestHeader "User-Agent", "Mozilla/5.0"
.setRequestHeader "Cookie", "ISAWPLB{07D08995-E67C-4F44-91A1-F6A16337ECD6}={286E0BB1-C5F9-4439-A2CE-A7BE8C3955E0}; ASPSESSIONIDSCSDSCTB=AGDPOBEAAPJLLMKKIGPLBGMJ; 69137927=967930978"
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.send qsp
HTML.body.innerHTML = .responseText
End With
For Each elem In HTML.getElementsByTagName("b")
If InStr(elem.innerText, "Chassi:") > 0 Then MsgBox elem.ParentNode.NextSibling.innerText: Exit For
Next elem
End Sub
再一次:如果由于某种原因我提供的 Cookie
对您不起作用,请使用您的开发工具(来自 Request Headers
部分)收集它来填写 Cookie
字段.谢谢。
我得到的输出:
9BD374121F5068077
我正在尝试在 VBA 环境 (Excel) 上使用 MSXML2.XMLHTTP 对象从网站抓取数据,但我不知道如何解决这个问题!网站如下:
http://www.detran.ms.gov.br/consulta-de-debitos/
大家可以使用下面的测试数据来填表:
- 地点:oon5868
- 雷纳瓦姆:1021783231
我想检索像 "chassi" 这样的数据,上面的数据将是“ 9BD374121F5068077”。
我在解析 html 文档时没有问题,困难的实际上是获取响应信息!代码如下:
Sub SearchVehicle()
Dim strPlaca As String
Dim strRenavam As String
strPlaca = "oon5868"
strRenavam = "01021783231"
Dim oXmlPage As MSXML2.XMLHTTP60
Dim strUrl As String
Dim strPostData As String
Set oXmlPage = New MSXML2.XMLHTTP60
strUrl = "http://www2.detran.ms.gov.br/detranet/nsite/veiculo/veiculos/retornooooveiculos.asp"
strPostData = "placa=" & strPlaca & "&renavam=" & strRenavam
oXmlPage.Open "POST", strUrl, False
oXmlPage.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
oXmlPage.send strPostData
Debug.Print oXmlPage.responseText
End Sub
POST 方法“.../retornooooveiculos.asp”中使用的 strURL 是 google 开发人员工具和 fiddler 向我展示的是该网站发布的正确地址有效负载。
手动访问时,网站会检索到正确的信息,但是 运行 我的代码总是在 .responseText 上得到以下响应:
<html>Acesse: <b><a href='http://www.detran.ms.gov.br target='_parent'>www.detran.ms.gov.br</a></b></html>
请帮助,我正在努力解决这个难题!为什么我会这样重定向?
我需要 "CHASSI" 信息,但找不到正确的 http 请求来执行此操作!
试试下面的方法。它应该为您获取您想要的内容。问题是您需要提供从 Request Headers
字段复制的 Cookie
才能使您的脚本正常工作,您可以使用 devtools 找到它。
Sub SearchVehicle()
Const URL As String = "http://www2.detran.ms.gov.br/detranet/nsite/veiculo/veiculos/retornooooveiculos.asp"
Dim HTTP As New ServerXMLHTTP60, HTML As New HTMLDocument
Dim elem As Object, splaca$, srenavam$, qsp$
splaca = "oon5868"
srenavam = "01021783231"
qsp = "placa=" & splaca & "&renavam=" & srenavam
With HTTP
.Open "POST", URL, False
.setRequestHeader "User-Agent", "Mozilla/5.0"
.setRequestHeader "Cookie", "ISAWPLB{07D08995-E67C-4F44-91A1-F6A16337ECD6}={286E0BB1-C5F9-4439-A2CE-A7BE8C3955E0}; ASPSESSIONIDSCSDSCTB=AGDPOBEAAPJLLMKKIGPLBGMJ; 69137927=967930978"
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.send qsp
HTML.body.innerHTML = .responseText
End With
For Each elem In HTML.getElementsByTagName("b")
If InStr(elem.innerText, "Chassi:") > 0 Then MsgBox elem.ParentNode.NextSibling.innerText: Exit For
Next elem
End Sub
再一次:如果由于某种原因我提供的 Cookie
对您不起作用,请使用您的开发工具(来自 Request Headers
部分)收集它来填写 Cookie
字段.谢谢。
我得到的输出:
9BD374121F5068077