This commit is contained in:
zhu
2026-05-06 10:22:38 +08:00
parent 350d4fc2e2
commit 53e4f0b2f4
10 changed files with 256 additions and 183 deletions

View File

@@ -1,6 +1,6 @@
import type { PlatformFieldConfig } from '@/types';
import type { PlatformFieldConfig } from '@/types';
/** DOM 抓取后的通用结果结构。 */
// DOM 抓取后的通用结果结构。
export type DomScrapeResult = Record<string, unknown>;
@@ -19,10 +19,12 @@ export async function scrapeDomFields(fields: PlatformFieldConfig[]): Promise<Do
}
/** 睡眠工具,给点击、翻页、异步渲染留出等待时间。 */
// 睡眠工具,给点击、翻页、异步渲染留出等待时间。
const sleep = (ms?: number) => new Promise((resolve) => window.setTimeout(resolve, ms ?? 1500));
/** 从元素中提取实际值,默认取文本,也支持 attr、图片 src、链接 href。 */
/**
* 从元素中提取实际值,默认取文本,也支持 attr、图片 src、链接 href。
*/
function extractValue(el: Element | null, config: PlatformFieldConfig): string | null {
if (!el) {
return null;
@@ -46,7 +48,9 @@ function extractValue(el: Element | null, config: PlatformFieldConfig): string |
return (el.textContent || '').replace(/\n/g, '').trim();
}
/** 根据字段 condition 配置在指定 DOM 范围内自动点击目标元素。 */
/**
* 根据字段 condition 配置在指定 DOM 范围内自动点击目标元素。
*/
async function autoClick(config: PlatformFieldConfig, rootDom: ParentNode): Promise<void> {
if (!config.condition) {
return;
@@ -62,7 +66,9 @@ async function autoClick(config: PlatformFieldConfig, rootDom: ParentNode): Prom
}
}
/** 递归处理字段配置,支持普通字段、嵌套 row、列表和表格。 */
/**
* 递归处理字段配置,支持普通字段、嵌套 row、列表和表格。
*/
async function processFields(columns: PlatformFieldConfig[], rootDom: ParentNode): Promise<DomScrapeResult> {
const result: DomScrapeResult = {};
@@ -100,7 +106,9 @@ async function processFields(columns: PlatformFieldConfig[], rootDom: ParentNode
return result;
}
/** 按列表配置抓取所有列表项,并按分页配置继续翻页。 */
/**
* 按列表配置抓取所有列表项,并按分页配置继续翻页。
*/
async function processList(config: PlatformFieldConfig, rootDom: ParentNode): Promise<DomScrapeResult[]> {
const allList: DomScrapeResult[] = [];
let pageCount = 0;
@@ -148,7 +156,9 @@ async function processList(config: PlatformFieldConfig, rootDom: ParentNode): Pr
return allList;
}
/** 按表格配置抓取表格行数据,并按分页配置继续翻页。 */
/**
* 按表格配置抓取表格行数据,并按分页配置继续翻页。
*/
async function processTable(config: PlatformFieldConfig, rootDom: ParentNode): Promise<DomScrapeResult[]> {
const allTableData: DomScrapeResult[] = [];
let pageCount = 0;
@@ -221,4 +231,4 @@ async function processTable(config: PlatformFieldConfig, rootDom: ParentNode): P
}
return allTableData;
}
}