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

使用VBA&MSXML2.XMLHTTP获取公共网站分页房产链接失败求助

问题:指定分页URL仍仅获取第1页房产链接的解决方法

我在抓取zvg.com的房产数据时遇到问题:选择联邦州后页面显示30条房产信息,超过30条则分页展示。但用VBA代码指定page=3的URL时,还是只能拿到第1页的30条数据。怎么才能获取第2、3、4等页的房产链接?

附上我的代码:

Sub GetDataFromPublicSite()

Dim html As New HTMLDocument
Dim GetHref As String
Dim CountItems As Object
Dim x As Long, y As Long
            
With CreateObject("MSXML2.XMLHTTP.6.0")
    .Open "GET", "https://zvg.com/brandenburg?page=3", False
    .send
     html.body.innerHTML = .responseText
End With
        
Set CountItems = html.querySelectorAll("a")
    
For y = 0 To CountItems.length - 1

    If InStr(html.querySelectorAll("a").Item(y), "brandenburg") Then
    
       GetHref = html.querySelectorAll("a").Item(y).href

    End If

Next

End Sub

可能的原因及解决办法

1. 网站依赖Cookie会话验证

很多网站会用Cookie跟踪用户会话状态,直接请求分页URL时,因为没有携带初始页面的Cookie,服务器会默认返回第1页数据。

解决方法:
先请求目标州的首页获取Cookie,后续分页请求时携带这个Cookie:

Sub GetPagedData()
    Dim html As New HTMLDocument
    Dim http As Object
    Dim cookieStr As String
    Dim GetHref As String
    Dim CountItems As Object
    Dim y As Long
    
    Set http = CreateObject("MSXML2.XMLHTTP.6.0")
    
    ' 第一步:请求首页获取Cookie
    With http
        .Open "GET", "https://zvg.com/brandenburg", False
        .send
        cookieStr = .getResponseHeader("Set-Cookie") ' 提取Cookie
        html.body.innerHTML = .responseText
    End With
    
    ' 第二步:携带Cookie请求第3页
    With http
        .Open "GET", "https://zvg.com/brandenburg?page=3", False
        .setRequestHeader "Cookie", cookieStr ' 添加Cookie请求头
        .send
        html.body.innerHTML = .responseText
    End With
    
    ' 解析链接
    Set CountItems = html.querySelectorAll("a")
    For y = 0 To CountItems.length - 1
        If InStr(CountItems.Item(y).href, "brandenburg") > 0 Then
            GetHref = CountItems.Item(y).href
            Debug.Print GetHref ' 输出到立即窗口查看结果
        End If
    Next y
End Sub

2. 分页参数格式不正确

有些网站的分页参数不是page=3,可能是p=3、pageNumber=3,或者需要搭配perPage=30这类参数。可以通过浏览器开发者工具(F12)查看真实分页请求:

  • 打开「网络」标签
  • 点击分页按钮,观察请求的URL参数,确认正确的参数名和格式

3. 网站使用JavaScript动态渲染数据

如果分页数据是通过JS动态加载的,XMLHTTP获取的只是初始静态HTML,不会包含动态加载的内容。这种情况需要模拟浏览器加载页面:

Sub GetDynamicPagedData()
    Dim ie As Object
    Dim html As HTMLDocument
    Dim CountItems As Object
    Dim y As Long
    Dim GetHref As String
    
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = False ' 设为True可查看加载过程
    
    ' 加载第3页
    ie.Navigate "https://zvg.com/brandenburg?page=3"
    ' 等待页面完全加载(包括JS执行)
    Do While ie.Busy Or ie.ReadyState <> 4
        DoEvents
    Loop
    
    Set html = ie.Document
    ' 解析链接
    Set CountItems = html.querySelectorAll("a")
    For y = 0 To CountItems.length - 1
        If InStr(CountItems.Item(y).href, "brandenburg") > 0 Then
            GetHref = CountItems.Item(y).href
            Debug.Print GetHref
        End If
    Next y
    
    ie.Quit
    Set ie = Nothing
End Sub

4. 代码解析逻辑存在问题

原代码每次循环都重复调用html.querySelectorAll("a"),效率低,且判断逻辑有误——应该检查元素的href属性,而非元素本身。优化后的解析逻辑:

Set CountItems = html.querySelectorAll("a")
For y = 0 To CountItems.length - 1
    If InStr(CountItems.Item(y).href, "brandenburg") > 0 Then
        GetHref = CountItems.Item(y).href
        ' 这里可添加代码将链接写入工作表或保存
    End If
Next y

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:56:05