# table-spider-plugin **Repository Path**: xfc03/table-spider-plugin ## Basic Information - **Project Name**: table-spider-plugin - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-08 - **Last Updated**: 2026-05-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 表格采集扩展 - 功能说明 Chrome 扩展:A页面点击按钮,自动打开新标签跳转到B页面,在B页面采集表格数据后将采集结果返回A页面。支持分页、支持传入日期参数、支持两种采集方式(DOM 解析 / 请求响应)。 --- ## 一、功能概述 - **注入范围**:仅在 **iframe** 内执行采集(`window.top !== window`);顶层页不跑采集逻辑。 - **两种采集模式**(由 `spider.js` 内 `mode` 决定): - **DOM 模式**(`mode !== "request"`):页面 load 后延迟 800ms,解析当前页所有 ``,点击「下一页」后等待 1–3 秒再采下一页,直到无下一页或达到页数上限。逻辑在 `getTableDataByDom.js`(`runCollectByDom`)。 - **请求模式**(`mode === "request"`):A 页传入 `date` 时,B 页在 load 前注入 `fetch-patch.js` 并派发 `spider-set-date` 劫持 listProductInfo 请求;load 后监听接口响应事件,用响应数据累加每页,再点击「下一页」并改写 pageNum 继续,直到无下一页或达到页数上限。逻辑在 `getTableDataByRequest.js`(`runCollectByRequest`)。 - **回传**:**请求模式**下,B 页采集结束时先经 `dataRefactoring` 转成统一结构,再通过 background 把数据发给 A 页;**DOM 模式**下当前实现不会触发回传(`runCollectByDom` 未调用传入的 `onDone`,仅控制台输出)。 --- ## 二、脚本与流程 ### 2.1 脚本职责 | 脚本 | 职责 | |------|------| | `messenger.js` | 监听 A 页 postMessage(`COLLECT_PARAMS`),转发给 background(openTab);接收 background 转发的 `COLLECT_RESULT` 再 postMessage 给 A 页。 | | `background.js` | 接收 openTab:把 params 写入 storage、可选在 URL 加 spider-date、新建标签打开 B 页;接收 collectDone:把 data 转发给 A 页 tab。 | | `spider.js` | 仅在 iframe 内:有 `date` 时在 load 前注入 fetch-patch 并派发 spider-set-date;load 时读 storage 的 collectParams(maxPages、date),按 **mode** 调用 `runCollectByDom` 或 `runCollectByRequest`,请求模式结束时 `notifyCollectDone`(先 dataRefactoring 再发送)。 | | `getTableDataByDom.js` | 提供 `getTableDataByDom()` 与 `runCollectByDom(options)`:按 DOM 解析表格并翻页采集。 | | `getTableDataByRequest.js` | 提供 `getTableDataByRequest(apiResponse)` 与 `runCollectByRequest(options)`:监听 listProductInfo 响应事件分页采集,翻页前派发 spider-set-pagenum(若 fetch-patch 支持)。 | | `fetch-patch.js` | 注入到**页面上下文**:监听 spider-set-date 设 `__SPIDER_PAY_DATE__`;劫持 XHR,对 listProductInfo 的请求改写 body 的 payTimeBegin/payTimeEnd;响应完成后派发 spider-listProductInfo-data 把响应数据传给 content script。 | | `dataRefactoring.js` | 将 accumulated(pages/tables)转为统一输出:platform、version、content.params.date、content.data.{ total, items },并做行级字段映射(如 express_company 根据 express_no 推断)。 | | `collect-overlay.js` | 采集中遮罩与交互抑制(见 **2.4**);由采货侠 / 拍机堂等 content_scripts 最先注入,提供 `showCollectOverlay` / `hideCollectOverlay`。 | ### 2.2 参数传递(A → B) - A 页:`window.postMessage({ type: "COLLECT_PARAMS", targetUrl, params }, "*")`。 - **params**:`maxPages`(数字,0 表示不设上限)、`date`(可选,YYYY-MM-DD;请求模式需传 date 以便注入 fetch-patch 并改写请求)。 - messenger 收到后发 `openTab` 给 background;background 写 storage(collectParams、collectPendingTabId),然后 `chrome.tabs.create({ url: targetUrl })`。 - B 页(iframe):load 时 `chrome.storage.local.get("collectParams")`,用后 `remove("collectParams")`,读取 `maxPages`、`date`,按 mode 执行 runCollectByDom 或 runCollectByRequest。 ### 2.3 回传 A 页(B → background → messenger → A) - B 页:请求模式下采集结束调用 `notifyCollectDone()`,对 `accumulated` 做 `dataRefactoring(accumulated, { date: collectedDate })` 后 `chrome.runtime.sendMessage({ action: "collectDone", data: payload })`。 - background:收到 collectDone,从 storage 取 collectPendingTabId,`chrome.tabs.sendMessage(tabId, { type: "COLLECT_RESULT", data })` 给 A 页的 content script(messenger),再清除 collectPendingTabId。 - A 页:监听 `message`,当 `event.data.type === "COLLECT_RESULT"` 时,`event.data.data` 即为结果(请求模式下为 dataRefactoring 后的结构)。 ### 2.4 采集中遮罩层(`scripts/collect-overlay.js`) 扩展在 **采货侠**、**拍机堂** 等业务页的 `content_scripts` 中**先于各平台 spider** 注入 `collect-overlay.js`,采集流程在适当时机调用全局方法: - **`showCollectOverlay(opts?)`**:开始采集时调用。`opts.label` 可自定义顶部提示文案,默认类似「数据采集中,无法操作页面,请等待」。 - **`hideCollectOverlay()`**:采集结束或异常回传前调用,撤掉遮罩与相关副作用。 **行为概要:** 1. **视觉**:全屏透明层(`pointer-events: none`)仅作结构挂载,顶部居中一条提示条;不在遮罩根节点上写 `cursor`(透明层不接收指针时浏览器不绘制该层光标)。 2. **等待光标**:向 `document.documentElement` 增加类名(如 `lp-collect-cursor-wait`),并注入一次 `