You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用VBA QuerySelector提取指定网站href?原代码失效求助

问题分析与修复方案

你的代码存在几个关键问题,导致无法正确获取目标页面内容:

1. 请求方法错误

目标页面是通过GET请求访问的(原URL带有查询参数),但你误用了POST方法,这会让服务器返回非预期的内容。

2. Referer头设置方式错误

你把Referer的URL当作POST请求体发送了,正确的做法是通过setRequestHeader来设置Referer请求头,而非放在send参数里。

3. 缺少必要请求头

多数网站会验证User-Agent字段判断请求是否来自合法浏览器,你的代码未设置该头,很大概率被服务器拦截,返回空或非目标页面内容。


修正后的代码

Function CheckIfAccess()
    Dim html As MSHTML.HTMLDocument, xhr As Object
    Dim URL As String, RefString As String, CountItems As Long

    Set html = New MSHTML.HTMLDocument
    Set xhr = CreateObject("MSXML2.ServerXMLHTTP.6.0")

    URL = "https://www.zvg-portal.de/index.php?button=showZvg&zvg_id=5972&land_abk=br"
    RefString = "https://www.zvg-portal.de/index.php?button=Suchen"
    
    With xhr
        .Open "GET", URL, False
        ' 模拟浏览器请求头
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
        .setRequestHeader "Referer", RefString
        .send
        
        ' 先判断响应是否有效
        If .responseText <> "" Then
            html.body.innerHTML = .responseText
        Else
            MsgBox "服务器返回空内容,可能被拦截"
            Exit Function
        End If
    End With

    CountItems = html.querySelectorAll("a").length
    MsgBox CountItems
End Function

额外说明

如果修正后仍无法获取内容,说明网站启用了更严格的反爬机制(比如Cookie验证、JS渲染或IP限制),这种情况下ServerXMLHTTP难以绕过,建议改用Selenium这类模拟真实浏览器的工具来获取页面内容。

内容的提问来源于stack exchange,提问作者Jasco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 11:50:14