使用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
相关产品推荐
相关产品推荐

