【问题标题】:XMLHttpRequest from VBA returns error 406 "Not Accepted"来自 VBA 的 XMLHttpRequest 返回错误 406“不接受”
【发布时间】:2020-09-19 03:48:32
【问题描述】:

我正在尝试使用 Excel VBA 进行一些抓取,特别是从服务器获取 JSON。 我使用 exactly 与浏览器开发工具上显示的请求标头相同,但是当我从 Excel 执行此请求时,我总是得到 406(“不接受”)来自服务器的回答。 我错过了什么?

Sub getJSON()

   Dim XHR As New MSXML2.ServerXMLHTTP60

   XHR.Open "GET", "https://www.magazineluiza.com.br/produto/calculo-frete/08226021/615254900/frigelar.json", False

   XHR.setRequestHeader "Host", "www.magazineluiza.com.br"
   XHR.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0"
   XHR.setRequestHeader "Accept", "application/json, text/javascript, */*; q=0.01"
   XHR.setRequestHeader "Accept-Language", "pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3"
   XHR.setRequestHeader "Accept-Encoding", "gzip, deflate, br"
   XHR.setRequestHeader "X-Requested-With", "XMLHttpRequest"
   XHR.setRequestHeader "Connection", "keep-alive"
   XHR.setRequestHeader "Referer", "https://www.magazineluiza.com.br/refrigerador-expositor-para-bebidas-metalfrio-com-controlador-eletronico-497-litros-vb52r-220v/p/6152549/pi/expb/"
   XHR.setRequestHeader "TE", "Trailers"

   XHR.send

   Debug.Print XHR.responseText

End Sub

这是我在浏览器上得到的答案:

{"address":{"address":"18 DE ABRIL","area":"CIDADE ANTONIO ESTEVAO DE CARVALHO","city":"SAO PAULO","state":"SP","zip_code":"08226021"},"delivery":[{"description":"Entrega padrão","distribution_center":0,"is_deadline":true,"price":"263.91","time":13,"zip_code_restriction":false}],"is_delivery_unavailable":false,"zip_code":"08226021"}

编辑:当我在this page 右侧添加邮政编码“08226021”并单击“确定”时,浏览器会检索到此 JSON。

【问题讨论】:

  • 如何使用开发工具访问文件?我在尝试打开页面时遇到 406 错误
  • @NickSlash 你是对的,当你试图通过浏览器上的 url 直接打开这个 JSON 时,会得到 406。但是如果你去 Firefox 开发工具,网络选项卡,选择请求,单击“编辑并重新发送”并将显示的标题放在问题上(与网页检索 JSON 时使用的标题相同),它可以工作。我用正确的标题检索此 JSON 的网站链接编辑了问题

标签: excel vba web-scraping https xmlhttprequest


【解决方案1】:

试试这个以获得所需的响应:

Sub FetchJsonResponse()
    Const Url$ = "https://www.magazineluiza.com.br/produto/calculo-frete/08226021/615254900/frigelar.json"

    With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "GET", Url, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
        .setRequestHeader "Referer", "https://www.magazineluiza.com.br/refrigerador-expositor-para-bebidas-metalfrio-com-controlador-eletronico-497-litros-vb52r-220v/p/6152549/pi/expb/"
        .setRequestHeader "x-requested-with", "XMLHttpRequest"
        .send
        Debug.Print .responseText
    End With
End Sub

这是它产生的输出:

{"address": {"address": "18 DE ABRIL", "area": "CIDADE ANTONIO ESTEVAO DE CARVALHO", "city": "SAO PAULO", "state": "SP", "zip_code": "08226021"}, "delivery": [{"description": "Entrega padr\u00e3o", "distribution_center": 0, "is_deadline": true, "price": "263.91", "time": 13, "zip_code_restriction": false}], "is_delivery_unavailable": false, "zip_code": "08226021"}

【讨论】:

  • 工作就像一个魅力!非常感谢。
猜你喜欢
  • 2012-01-29
  • 2012-06-17
  • 2015-07-10
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 2017-11-01
相关资源
最近更新 更多