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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:55:30