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

如何在新窗口循环加载多URL并等待加载完成抓取数据?

解决新窗口逐页加载并抓取表格数据的问题

我完全懂你用Violentmonkey抓网页表格时遇到的麻烦——想在新窗口挨个打开URL,但直接用newWindows.location.replace(URLs[i])根本等不及页面加载完就开始采集,结果拿不到完整的表格数据。而且你最初尝试的fetch方法,因为只能拿到原始HTML,没法获取页面渲染后的动态表格内容,自然达不到预期效果。

最终可行的解决方案代码

下面是调试后能稳定运行的代码,核心是靠窗口的onload和onunload事件,确保页面完全加载后再执行数据抓取:

// 处理URL协议:把下一页的http替换成https,适配主页面的https环境
newURL = nextPage.href.replace(/http/, "https");
// 打开新窗口,设置固定尺寸和属性
newWindow = window.open(newURL, "FilghtWindow", "directories=no,resizable=no, width=400, height=400");
newWindow.focus();

// 页面加载完成后执行:抓取数据 + 处理下一页逻辑
var winLoaded = function(){
    // 调用自定义的GetData函数,从新窗口DOM中抓取目标表格数据
    finalData = GetData(newWindow.document);
    // 查找下一页的跳转链接
    nextPage = newWindow.document.getElementsByClassName("schedule_down")[0];
    if (nextPage){
        // 存在下一页,更新URL并跳转
        newURL = nextPage.href.replace(/http/, "https");
        newWindow.location.replace(newURL);
    }else{
        // 没有下一页了,输出最终数据并关闭窗口
        console.log(finalData);
        newWindow.close();
    }
}

// 页面卸载时重置事件监听,避免跳转后监听失效
var winUnloaded = function(){
    setTimeout(function(){
        newWindow.onload= winLoaded;
        newWindow.onunload = winUnloaded;
    },0);
}

// 初始化绑定窗口事件
newWindow.onload= winLoaded;
newWindow.onunload = winUnloaded;

关键逻辑说明

  • 协议转换:把下一页链接的http替换为https,避免混合内容或跨域问题,保证新窗口能正常加载页面。
  • 加载完成触发抓取:通过onload事件确保页面完全渲染后,再调用GetData去抓取目标表格(也就是你要的<table class="fltlist_table">下的<tbody id="flt1">数据),这样能拿到完整的渲染后内容。
  • 递归处理分页:每次加载完成后检查是否存在下一页链接,存在就跳转继续抓取,直到没有下一页就输出结果并关闭窗口。
  • setTimeout的作用:在onunload里用延迟绑定事件,是为了确保窗口跳转过程中事件能正确重新绑定,避免出现监听失效的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:05:12