如何编写Tampermonkey脚本实现多页面加载与内容提取?
解决Tampermonkey跨页面批量抓取数据的方案
你的核心问题在于:直接用window.location跳转后原页面脚本会终止,没法串联后续操作;而手动传URL参数的方式又太繁琐。下面给出基于Tampermonkey内置API的简化实现方案,不用手动处理参数传递。
核心思路
利用Tampermonkey的全局存储API(GM_setValue/GM_getValue)实现跨页面数据共享,配合GM_openInTab控制标签页加载,再用GM_addValueListener监听数据变化触发后续流程,全程不用手动拼接URL参数。
具体实现步骤
1. 脚本注册范围
把脚本匹配范围覆盖页面A和所有目标页面(B/C/D),比如用具体URL或通配符:
// ==UserScript== // @name 批量页面数据抓取工具 // @namespace http://tampermonkey.net/ // @version 0.1 // @description 从概览页批量提取子页面数据并复制到剪贴板 // @match https://your-domain.com/pageA // 替换为页面A的URL // @match https://your-domain.com/pageB // 替换为页面B的URL,同理添加C、D或用通配符如 https://your-domain.com/page* // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_openInTab // @grant GM_addValueListener // @grant GM_setClipboard // ==/UserScript==
2. 完整代码逻辑
(function() { 'use strict'; // 判断当前页面是否是概览页(页面A) if (window.location.href.includes('pageA')) { // 1. 提取目标链接列表(替换成你自己的提取逻辑) const targetLinks = ['https://your-domain.com/pageB', 'https://your-domain.com/pageC', 'https://your-domain.com/pageD']; // 初始化全局存储:存储链接列表、结果数组、当前处理索引 GM_setValue('targetLinks', targetLinks); GM_setValue('resultData', []); GM_setValue('currentIndex', 0); // 监听当前处理索引的变化,自动打开下一个链接 GM_addValueListener('currentIndex', (_, oldVal, newVal) => { const links = GM_getValue('targetLinks', []); // 所有链接处理完成 if (newVal >= links.length) { const finalResult = GM_getValue('resultData', []); // 复制结果到剪贴板 GM_setClipboard(JSON.stringify(finalResult, null, 2)); alert('数据已复制到剪贴板!'); // 清理存储的临时数据 GM_deleteValue('targetLinks'); GM_deleteValue('resultData'); GM_deleteValue('currentIndex'); return; } // 打开下一个目标页面 GM_openInTab(links[newVal], { active: true }); }); // 启动第一个页面的抓取 GM_openInTab(targetLinks[0], { active: true }); } else { // 目标页面(B/C/D)的处理逻辑 // 等待DOM完全就绪后提取数据 document.addEventListener('DOMContentLoaded', () => { // 2. 解析页面信息(替换成你自己的提取逻辑) const pageData = { title: document.title, keyInfo: document.querySelector('.target-element')?.textContent.trim() || '无数据' // 按需添加更多字段 }; // 3. 将数据存入全局结果数组 const currentResults = GM_getValue('resultData', []); currentResults.push(pageData); GM_setValue('resultData', currentResults); // 4. 更新处理索引,触发概览页的下一轮操作 const currentIndex = GM_getValue('currentIndex', 0); GM_setValue('currentIndex', currentIndex + 1); // 自动关闭当前标签页(可选,不关闭也能正常运行,自动关闭更流畅) window.close(); }); } })();
关键细节说明
- 避免脚本终止问题:用
GM_openInTab打开新标签页,原页面A的脚本会保持运行,通过监听存储的currentIndex变化来推进流程,不会因为页面跳转终止。 - DOM就绪处理:目标页面用
DOMContentLoaded事件确保页面完全加载后再提取数据,解决你卡在步骤2-3的问题。 - CSRF兼容:通过浏览器标签页打开目标页面,会自动携带当前会话的Cookie,和手动访问页面完全一致,不会触发CSRF保护。
- 简化数据传递:用Tampermonkey的全局存储代替URL参数,不需要手动拼接和解析参数,代码更简洁。
内容的提问来源于stack exchange,提问作者Christian Wolf
相关产品推荐
相关产品推荐

