@loopsaaage/n8n-nodes-smart-crawler 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,615 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.SmartCrawler = void 0;
40
+ const n8n_workflow_1 = require("n8n-workflow");
41
+ const axios_1 = __importDefault(require("axios"));
42
+ const cheerio = __importStar(require("cheerio"));
43
+ class SmartCrawler {
44
+ constructor() {
45
+ this.description = {
46
+ displayName: 'Smart Crawler',
47
+ name: 'smartCrawler',
48
+ icon: 'file:../../icons/smart-crawler.svg',
49
+ group: ['input'],
50
+ version: 1,
51
+ description: '通用智能爬虫节点,支持多跳数据提取',
52
+ defaults: {
53
+ name: 'Smart Crawler',
54
+ },
55
+ inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
56
+ outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
57
+ usableAsTool: true,
58
+ properties: [
59
+ {
60
+ displayName: '页面链接',
61
+ name: 'url',
62
+ type: 'string',
63
+ required: true,
64
+ default: '',
65
+ placeholder: 'https://example.com',
66
+ description: '要爬取的页面URL',
67
+ },
68
+ {
69
+ displayName: 'Cookie',
70
+ name: 'cookie',
71
+ type: 'string',
72
+ default: '',
73
+ placeholder: 'session_id=xxx; user_id=yyy',
74
+ description: '请求时使用的Cookie(可选)',
75
+ },
76
+ {
77
+ displayName: '列表选择器',
78
+ name: 'listSelector',
79
+ type: 'string',
80
+ required: true,
81
+ default: '',
82
+ placeholder: '.item, .product-item',
83
+ description: '用于选择数据列表的CSS选择器',
84
+ },
85
+ {
86
+ displayName: '字段配置',
87
+ name: 'fields',
88
+ type: 'fixedCollection',
89
+ typeOptions: {
90
+ multipleValues: true,
91
+ },
92
+ default: {},
93
+ options: [
94
+ {
95
+ displayName: '字段',
96
+ name: 'field',
97
+ values: [
98
+ {
99
+ displayName: '是否为跳转字段',
100
+ name: 'isJump',
101
+ type: 'boolean',
102
+ default: false,
103
+ description: 'Whether to extract data from a jump page',
104
+ },
105
+ {
106
+ displayName: '属性名',
107
+ name: 'attribute',
108
+ type: 'string',
109
+ default: '',
110
+ placeholder: 'href, src, data-ID',
111
+ description: '当提取类型为属性值时,指定要提取的属性名',
112
+ },
113
+ {
114
+ displayName: '提取类型',
115
+ name: 'type',
116
+ type: 'options',
117
+ options: [
118
+ {
119
+ name: '文本内容',
120
+ value: 'text',
121
+ },
122
+ {
123
+ name: 'HTML内容',
124
+ value: 'html',
125
+ },
126
+ {
127
+ name: '属性值',
128
+ value: 'attribute',
129
+ },
130
+ ],
131
+ default: 'text',
132
+ description: '如何提取字段值',
133
+ },
134
+ {
135
+ displayName: '跳转配置',
136
+ name: 'jumpConfig',
137
+ type: 'fixedCollection',
138
+ default: {},
139
+ options: [
140
+ {
141
+ displayName: '第一跳',
142
+ name: 'firstJump',
143
+ values: [
144
+ {
145
+ displayName: '点击元素选择器',
146
+ name: 'clickSelector',
147
+ type: 'string',
148
+ required: true,
149
+ default: '',
150
+ placeholder: 'a.detail-link',
151
+ description: '用于点击跳转的元素选择器',
152
+ },
153
+ {
154
+ displayName: '目标页面数据选择器',
155
+ name: 'targetSelector',
156
+ type: 'string',
157
+ default: '',
158
+ placeholder: '.content, #main',
159
+ description: '跳转后页面中要提取数据的选择器(如果为空则提取整个页面)',
160
+ },
161
+ {
162
+ displayName: '字段',
163
+ name: 'fields',
164
+ type: 'fixedCollection',
165
+ default: {},
166
+ options: [
167
+ {
168
+ displayName: '字段',
169
+ name: 'field',
170
+ values: [
171
+ {
172
+ displayName: '是否为跳转字段',
173
+ name: 'isJump',
174
+ type: 'boolean',
175
+ default: false,
176
+ },
177
+ {
178
+ displayName: '属性名',
179
+ name: 'attribute',
180
+ type: 'string',
181
+ default: '',
182
+ },
183
+ {
184
+ displayName: '提取类型',
185
+ name: 'type',
186
+ type: 'options',
187
+ options: [
188
+ {
189
+ name: '文本内容',
190
+ value: 'text',
191
+ },
192
+ {
193
+ name: 'HTML内容',
194
+ value: 'html',
195
+ },
196
+ {
197
+ name: '属性值',
198
+ value: 'attribute',
199
+ },
200
+ ],
201
+ default: 'text',
202
+ },
203
+ {
204
+ displayName: '跳转配置',
205
+ name: 'jumpConfig',
206
+ type: 'fixedCollection',
207
+ default: {},
208
+ options: [
209
+ {
210
+ displayName: '第二跳',
211
+ name: 'secondJump',
212
+ values: [
213
+ {
214
+ displayName: '点击元素选择器',
215
+ name: 'clickSelector',
216
+ type: 'string',
217
+ required: true,
218
+ default: '',
219
+ },
220
+ {
221
+ displayName: '目标页面数据选择器',
222
+ name: 'targetSelector',
223
+ type: 'string',
224
+ default: '',
225
+ },
226
+ {
227
+ displayName: '字段',
228
+ name: 'fields',
229
+ type: 'fixedCollection',
230
+ default: {},
231
+ options: [
232
+ {
233
+ displayName: '字段',
234
+ name: 'field',
235
+ values: [
236
+ {
237
+ displayName: '是否为跳转字段',
238
+ name: 'isJump',
239
+ type: 'boolean',
240
+ default: false,
241
+ },
242
+ {
243
+ displayName: '属性名',
244
+ name: 'attribute',
245
+ type: 'string',
246
+ default: '',
247
+ },
248
+ {
249
+ displayName: '提取类型',
250
+ name: 'type',
251
+ type: 'options',
252
+ options: [
253
+ {
254
+ name: '文本内容',
255
+ value: 'text',
256
+ },
257
+ {
258
+ name: 'HTML内容',
259
+ value: 'html',
260
+ },
261
+ {
262
+ name: '属性值',
263
+ value: 'attribute',
264
+ },
265
+ ],
266
+ default: 'text',
267
+ },
268
+ {
269
+ displayName: '跳转配置',
270
+ name: 'jumpConfig',
271
+ type: 'fixedCollection',
272
+ default: {},
273
+ options: [
274
+ {
275
+ displayName: '第三跳',
276
+ name: 'thirdJump',
277
+ values: [
278
+ {
279
+ displayName: '点击元素选择器',
280
+ name: 'clickSelector',
281
+ type: 'string',
282
+ required: true,
283
+ default: '',
284
+ },
285
+ {
286
+ displayName: '目标页面数据选择器',
287
+ name: 'targetSelector',
288
+ type: 'string',
289
+ default: '',
290
+ },
291
+ {
292
+ displayName: '字段',
293
+ name: 'fields',
294
+ type: 'fixedCollection',
295
+ default: {},
296
+ options: [
297
+ {
298
+ displayName: '字段',
299
+ name: 'field',
300
+ values: [
301
+ {
302
+ displayName: '字段名称',
303
+ name: 'name',
304
+ type: 'string',
305
+ required: true,
306
+ default: '',
307
+ },
308
+ {
309
+ displayName: '选择器',
310
+ name: 'selector',
311
+ type: 'string',
312
+ required: true,
313
+ default: '',
314
+ },
315
+ {
316
+ displayName: '提取类型',
317
+ name: 'type',
318
+ type: 'options',
319
+ options: [
320
+ {
321
+ name: '文本内容',
322
+ value: 'text',
323
+ },
324
+ {
325
+ name: 'HTML内容',
326
+ value: 'html',
327
+ },
328
+ {
329
+ name: '属性值',
330
+ value: 'attribute',
331
+ },
332
+ ],
333
+ default: 'text',
334
+ },
335
+ {
336
+ displayName: '属性名',
337
+ name: 'attribute',
338
+ type: 'string',
339
+ default: '',
340
+ },
341
+ ]
342
+ },
343
+ ]
344
+ },
345
+ ]
346
+ },
347
+ ]
348
+ },
349
+ {
350
+ displayName: '选择器',
351
+ name: 'selector',
352
+ type: 'string',
353
+ required: true,
354
+ default: '',
355
+ },
356
+ {
357
+ displayName: '字段名称',
358
+ name: 'name',
359
+ type: 'string',
360
+ required: true,
361
+ default: '',
362
+ },
363
+ ]
364
+ },
365
+ ]
366
+ },
367
+ ]
368
+ },
369
+ ]
370
+ },
371
+ {
372
+ displayName: '选择器',
373
+ name: 'selector',
374
+ type: 'string',
375
+ required: true,
376
+ default: '',
377
+ },
378
+ {
379
+ displayName: '字段名称',
380
+ name: 'name',
381
+ type: 'string',
382
+ required: true,
383
+ default: '',
384
+ },
385
+ ]
386
+ },
387
+ ]
388
+ },
389
+ ]
390
+ },
391
+ ]
392
+ },
393
+ {
394
+ displayName: '选择器',
395
+ name: 'selector',
396
+ type: 'string',
397
+ required: true,
398
+ default: '',
399
+ placeholder: '.title, #name',
400
+ description: 'CSS选择器,用于提取字段值',
401
+ },
402
+ {
403
+ displayName: '字段名称',
404
+ name: 'name',
405
+ type: 'string',
406
+ required: true,
407
+ default: '',
408
+ description: '字段的输出名称',
409
+ },
410
+ ],
411
+ },
412
+ ],
413
+ },
414
+ ],
415
+ };
416
+ }
417
+ async execute() {
418
+ const items = this.getInputData();
419
+ const returnData = [];
420
+ for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
421
+ try {
422
+ const url = this.getNodeParameter('url', itemIndex, '');
423
+ const cookie = this.getNodeParameter('cookie', itemIndex, '');
424
+ const listSelector = this.getNodeParameter('listSelector', itemIndex, '');
425
+ const fieldsData = this.getNodeParameter('fields', itemIndex, {});
426
+ if (!url) {
427
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), '页面链接不能为空', { itemIndex });
428
+ }
429
+ if (!listSelector) {
430
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), '列表选择器不能为空', { itemIndex });
431
+ }
432
+ const fields = fieldsData.field || [];
433
+ const response = await axios_1.default.get(url, {
434
+ headers: {
435
+ ...(cookie && { Cookie: cookie }),
436
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
437
+ },
438
+ });
439
+ const $ = cheerio.load(response.data);
440
+ const listItems = $(listSelector);
441
+ if (listItems.length === 0) {
442
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `未找到匹配列表选择器 "${listSelector}" 的元素`, { itemIndex });
443
+ }
444
+ for (let i = 0; i < listItems.length; i++) {
445
+ const listItem = listItems.eq(i);
446
+ const itemData = {};
447
+ for (const field of fields) {
448
+ try {
449
+ const fieldValue = await SmartCrawler.extractField(this, listItem, field, url, cookie, 1);
450
+ itemData[field.name] = fieldValue;
451
+ }
452
+ catch (error) {
453
+ if (this.continueOnFail()) {
454
+ itemData[field.name] = null;
455
+ }
456
+ else {
457
+ throw error;
458
+ }
459
+ }
460
+ }
461
+ returnData.push({
462
+ json: itemData,
463
+ pairedItem: { item: itemIndex },
464
+ });
465
+ }
466
+ }
467
+ catch (error) {
468
+ if (this.continueOnFail()) {
469
+ returnData.push({
470
+ json: { error: error.message },
471
+ pairedItem: { item: itemIndex },
472
+ });
473
+ }
474
+ else {
475
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), error, { itemIndex });
476
+ }
477
+ }
478
+ }
479
+ return [returnData];
480
+ }
481
+ static async extractField(executeFunctions, $element, field, baseUrl, cookie, jumpLevel) {
482
+ if (jumpLevel > 3) {
483
+ throw new n8n_workflow_1.NodeOperationError(executeFunctions.getNode(), '最多支持3跳,已达到最大跳数限制');
484
+ }
485
+ const element = $element.find(field.selector).first();
486
+ if (element.length === 0) {
487
+ return null;
488
+ }
489
+ if (!field.isJump || !field.jumpConfig) {
490
+ return SmartCrawler.extractValue(element, field.type, field.attribute);
491
+ }
492
+ if (!field.jumpConfig) {
493
+ return null;
494
+ }
495
+ const jumpConfig = SmartCrawler.getJumpConfig(field.jumpConfig, jumpLevel);
496
+ if (!jumpConfig) {
497
+ return null;
498
+ }
499
+ const clickElement = element.find(jumpConfig.clickSelector).first();
500
+ if (clickElement.length === 0) {
501
+ return null;
502
+ }
503
+ let jumpUrl;
504
+ if (clickElement.is('a')) {
505
+ const href = clickElement.attr('href');
506
+ if (!href) {
507
+ return null;
508
+ }
509
+ jumpUrl = SmartCrawler.resolveUrl(baseUrl, href);
510
+ }
511
+ else {
512
+ const href = clickElement.attr('href') || clickElement.attr('data-href');
513
+ if (!href) {
514
+ return null;
515
+ }
516
+ jumpUrl = SmartCrawler.resolveUrl(baseUrl, href);
517
+ }
518
+ const jumpResponse = await axios_1.default.get(jumpUrl, {
519
+ headers: {
520
+ ...(cookie && { Cookie: cookie }),
521
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
522
+ },
523
+ });
524
+ const $jump = cheerio.load(jumpResponse.data);
525
+ const targetElement = jumpConfig.targetSelector
526
+ ? $jump(jumpConfig.targetSelector).first()
527
+ : $jump('body').first();
528
+ if (jumpConfig.fields && jumpConfig.fields.length > 0) {
529
+ const jumpData = {};
530
+ for (const jumpField of jumpConfig.fields) {
531
+ try {
532
+ const fieldData = {
533
+ name: jumpField.name,
534
+ selector: jumpField.selector,
535
+ type: jumpField.type,
536
+ attribute: jumpField.attribute,
537
+ isJump: jumpField.isJump,
538
+ jumpConfig: jumpField.jumpConfig,
539
+ };
540
+ const value = await SmartCrawler.extractField(executeFunctions, targetElement, fieldData, jumpUrl, cookie, jumpLevel + 1);
541
+ jumpData[jumpField.name] = value;
542
+ }
543
+ catch (error) {
544
+ if (executeFunctions.continueOnFail()) {
545
+ jumpData[jumpField.name] = null;
546
+ }
547
+ else {
548
+ throw error;
549
+ }
550
+ }
551
+ }
552
+ return jumpData;
553
+ }
554
+ return targetElement.text().trim();
555
+ }
556
+ static extractValue(element, type, attribute) {
557
+ switch (type) {
558
+ case 'text':
559
+ return element.text().trim() || null;
560
+ case 'html':
561
+ return element.html() || null;
562
+ case 'attribute':
563
+ if (!attribute) {
564
+ return null;
565
+ }
566
+ return element.attr(attribute) || null;
567
+ default:
568
+ return null;
569
+ }
570
+ }
571
+ static getJumpConfig(jumpConfig, level) {
572
+ if (level === 1 && jumpConfig.firstJump) {
573
+ return SmartCrawler.normalizeJumpConfig(jumpConfig.firstJump);
574
+ }
575
+ if (level === 2 && jumpConfig.secondJump) {
576
+ return SmartCrawler.normalizeJumpConfig(jumpConfig.secondJump);
577
+ }
578
+ if (level === 3 && jumpConfig.thirdJump) {
579
+ return SmartCrawler.normalizeJumpConfig(jumpConfig.thirdJump);
580
+ }
581
+ return null;
582
+ }
583
+ static normalizeJumpConfig(config) {
584
+ const normalized = {
585
+ clickSelector: config.clickSelector || '',
586
+ targetSelector: config.targetSelector,
587
+ fields: [],
588
+ };
589
+ if (config.fields && typeof config.fields === 'object' && 'field' in config.fields) {
590
+ const fields = config.fields.field;
591
+ if (fields) {
592
+ normalized.fields = fields.map((f) => ({
593
+ name: f.name,
594
+ selector: f.selector,
595
+ type: f.type || 'text',
596
+ attribute: f.attribute,
597
+ isJump: f.isJump || false,
598
+ jumpConfig: f.jumpConfig,
599
+ }));
600
+ }
601
+ }
602
+ return normalized;
603
+ }
604
+ static resolveUrl(baseUrl, relativeUrl) {
605
+ try {
606
+ const url = new URL(relativeUrl, baseUrl);
607
+ return url.href;
608
+ }
609
+ catch {
610
+ return relativeUrl;
611
+ }
612
+ }
613
+ }
614
+ exports.SmartCrawler = SmartCrawler;
615
+ //# sourceMappingURL=SmartCrawler.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartCrawler.node.js","sourceRoot":"","sources":["../../../nodes/SmartCrawler/SmartCrawler.node.ts"],"names":[],"mappings":"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"}