【问题标题】:Web Scraping using VBA and MSXML2.XMLHTTP library使用 VBA 和 MSXML2.XMLHTTP 库进行网页抓取
【发布时间】:2018-10-23 13:35:53
【问题描述】:

我正在尝试在 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 方法中使用的 strURL“.../retornooooveiculos.asp”是谷歌开发者工具之一,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 请求来执行此操作!

【问题讨论】:

  • 我的响应信息与您的代码在手动访问网站时收到的响应信息相同。它基本上告诉我访问“www.detran.ms.gov.br”,但是当我单击该链接时,需要一些时间通知我“无法访问该站点 www.detran.ms.gov.br响应时间过长。”

标签: vba web-scraping xmlhttprequest msxml


【解决方案1】:

试试下面的方法。它应该为您获取您想要的内容。问题是您需要提供从您的 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 

【讨论】:

  • 感谢您的回复!我试图以编程方式获取 cookie,但我无法弄清楚为什么它不起作用。您的解决方案对我帮助很大!
  • 嘿,问题是如果有strCookie = .getRequestHeader("Cookie") 之类的选项,您可能会以编程方式获取cookie,但不幸的是我找不到这样的选项。但是,您可以使用strCookie = .getResponseHeader("Set-Cookie"),但它不会满足您的目的。这就是我手动执行此操作的原因。谢谢。
猜你喜欢
  • 2021-12-20
  • 2020-11-09
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 2020-11-30
相关资源
最近更新 更多