如何在新窗口循环加载多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
相关产品推荐
相关产品推荐

