webpeel 0.8.1 → 0.9.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.
- package/README.md +39 -5
- package/dist/cli.js +1299 -85
- package/dist/cli.js.map +1 -1
- package/dist/core/application-tracker.d.ts +85 -0
- package/dist/core/application-tracker.d.ts.map +1 -0
- package/dist/core/application-tracker.js +184 -0
- package/dist/core/application-tracker.js.map +1 -0
- package/dist/core/apply.d.ts +163 -0
- package/dist/core/apply.d.ts.map +1 -0
- package/dist/core/apply.js +817 -0
- package/dist/core/apply.js.map +1 -0
- package/dist/core/branding.d.ts +1 -1
- package/dist/core/branding.d.ts.map +1 -1
- package/dist/core/budget.d.ts +43 -0
- package/dist/core/budget.d.ts.map +1 -0
- package/dist/core/budget.js +325 -0
- package/dist/core/budget.js.map +1 -0
- package/dist/core/challenge-detection.d.ts +27 -0
- package/dist/core/challenge-detection.d.ts.map +1 -0
- package/dist/core/challenge-detection.js +436 -0
- package/dist/core/challenge-detection.js.map +1 -0
- package/dist/core/change-tracking.d.ts.map +1 -1
- package/dist/core/change-tracking.js +10 -1
- package/dist/core/change-tracking.js.map +1 -1
- package/dist/core/crawler.d.ts.map +1 -1
- package/dist/core/crawler.js +17 -4
- package/dist/core/crawler.js.map +1 -1
- package/dist/core/diff.d.ts +62 -0
- package/dist/core/diff.d.ts.map +1 -0
- package/dist/core/diff.js +289 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/extract-listings.d.ts +39 -0
- package/dist/core/extract-listings.d.ts.map +1 -0
- package/dist/core/extract-listings.js +331 -0
- package/dist/core/extract-listings.js.map +1 -0
- package/dist/core/extract.d.ts.map +1 -1
- package/dist/core/extract.js +15 -2
- package/dist/core/extract.js.map +1 -1
- package/dist/core/fetcher.d.ts +29 -3
- package/dist/core/fetcher.d.ts.map +1 -1
- package/dist/core/fetcher.js +158 -20
- package/dist/core/fetcher.js.map +1 -1
- package/dist/core/human.d.ts +176 -0
- package/dist/core/human.d.ts.map +1 -0
- package/dist/core/human.js +681 -0
- package/dist/core/human.js.map +1 -0
- package/dist/core/jobs.d.ts +12 -2
- package/dist/core/jobs.d.ts.map +1 -1
- package/dist/core/jobs.js +124 -2
- package/dist/core/jobs.js.map +1 -1
- package/dist/core/map.d.ts.map +1 -1
- package/dist/core/map.js +14 -2
- package/dist/core/map.js.map +1 -1
- package/dist/core/paginate.d.ts +32 -0
- package/dist/core/paginate.d.ts.map +1 -0
- package/dist/core/paginate.js +107 -0
- package/dist/core/paginate.js.map +1 -0
- package/dist/core/rate-governor.d.ts +81 -0
- package/dist/core/rate-governor.d.ts.map +1 -0
- package/dist/core/rate-governor.js +238 -0
- package/dist/core/rate-governor.js.map +1 -0
- package/dist/core/search-provider.d.ts +5 -0
- package/dist/core/search-provider.d.ts.map +1 -1
- package/dist/core/search-provider.js +81 -2
- package/dist/core/search-provider.js.map +1 -1
- package/dist/core/site-search.d.ts +45 -0
- package/dist/core/site-search.d.ts.map +1 -0
- package/dist/core/site-search.js +253 -0
- package/dist/core/site-search.js.map +1 -0
- package/dist/core/strategies.d.ts +8 -0
- package/dist/core/strategies.d.ts.map +1 -1
- package/dist/core/strategies.js +185 -45
- package/dist/core/strategies.js.map +1 -1
- package/dist/core/strategy-hooks.d.ts +6 -0
- package/dist/core/strategy-hooks.d.ts.map +1 -1
- package/dist/core/strategy-hooks.js.map +1 -1
- package/dist/core/table-format.d.ts +31 -0
- package/dist/core/table-format.d.ts.map +1 -0
- package/dist/core/table-format.js +147 -0
- package/dist/core/table-format.js.map +1 -0
- package/dist/core/user-agents.d.ts +58 -0
- package/dist/core/user-agents.d.ts.map +1 -0
- package/dist/core/user-agents.js +159 -0
- package/dist/core/user-agents.js.map +1 -0
- package/dist/core/watch.d.ts +100 -0
- package/dist/core/watch.d.ts.map +1 -0
- package/dist/core/watch.js +368 -0
- package/dist/core/watch.js.map +1 -0
- package/dist/index.d.ts +13 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -4
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +3 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/types.d.ts +73 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/llms.txt +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-extract repeated listing patterns from HTML pages.
|
|
3
|
+
*
|
|
4
|
+
* Given raw HTML (e.g. an eBay search results page), this module detects the
|
|
5
|
+
* largest group of sibling elements with a consistent internal structure and
|
|
6
|
+
* extracts structured fields (title, price, image, link, description, rating)
|
|
7
|
+
* from each item.
|
|
8
|
+
*
|
|
9
|
+
* @module extract-listings
|
|
10
|
+
*/
|
|
11
|
+
import { load } from 'cheerio';
|
|
12
|
+
/* ------------------------------------------------------------------ */
|
|
13
|
+
/* Internal helpers */
|
|
14
|
+
/* ------------------------------------------------------------------ */
|
|
15
|
+
/** Tags we consider as potential listing containers. */
|
|
16
|
+
const CONTAINER_CHILD_TAGS = new Set(['li', 'div', 'article', 'section', 'tr', 'a']);
|
|
17
|
+
/** Return a normalised "child-tag signature" for a DOM element.
|
|
18
|
+
* Includes tag names **and their counts** so that elements with the same
|
|
19
|
+
* child-tag *names* but different *counts* (e.g. 3 `<td>` vs 2 `<td>`)
|
|
20
|
+
* produce distinct signatures. This is essential for table-based layouts
|
|
21
|
+
* like Hacker News where story rows (3 td) must be distinguished from
|
|
22
|
+
* subtext rows (2 td).
|
|
23
|
+
*/
|
|
24
|
+
function childSignature($, el) {
|
|
25
|
+
const children = $(el).children();
|
|
26
|
+
if (children.length === 0)
|
|
27
|
+
return '';
|
|
28
|
+
const tagCounts = new Map();
|
|
29
|
+
children.each((_, child) => {
|
|
30
|
+
const tagName = child.tagName?.toLowerCase();
|
|
31
|
+
if (tagName)
|
|
32
|
+
tagCounts.set(tagName, (tagCounts.get(tagName) || 0) + 1);
|
|
33
|
+
});
|
|
34
|
+
return [...tagCounts.entries()]
|
|
35
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
36
|
+
.map(([tag, count]) => `${tag}:${count}`)
|
|
37
|
+
.join(',');
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Check whether two child-tag signatures are "similar enough" to be considered
|
|
41
|
+
* the same listing type.
|
|
42
|
+
*
|
|
43
|
+
* Compares full `tag:count` pairs so that elements with the same child tags
|
|
44
|
+
* but different counts are kept separate (critical for table-based layouts
|
|
45
|
+
* like Hacker News where story rows have 3 `<td>` and subtext rows have 2).
|
|
46
|
+
*
|
|
47
|
+
* Similarity is measured by Jaccard index on `tag:count` pairs, with a
|
|
48
|
+
* threshold of 0.5 or one being a subset of the other.
|
|
49
|
+
*/
|
|
50
|
+
function signaturesAreSimilar(a, b) {
|
|
51
|
+
if (a === b)
|
|
52
|
+
return true;
|
|
53
|
+
if (!a || !b)
|
|
54
|
+
return false;
|
|
55
|
+
// Compare full "tag:count" pairs (e.g. "td:3" ≠ "td:2")
|
|
56
|
+
const pairsA = new Set(a.split(','));
|
|
57
|
+
const pairsB = new Set(b.split(','));
|
|
58
|
+
const intersection = [...pairsA].filter(p => pairsB.has(p)).length;
|
|
59
|
+
const union = new Set([...pairsA, ...pairsB]).size;
|
|
60
|
+
return intersection === pairsA.size || intersection === pairsB.size || (intersection / union) >= 0.5;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Walk the DOM and find the best "listing container" — the element whose
|
|
64
|
+
* direct children form the largest group of structurally-similar items.
|
|
65
|
+
*/
|
|
66
|
+
function findListingContainer($) {
|
|
67
|
+
const candidates = [];
|
|
68
|
+
$('*').each((_, el) => {
|
|
69
|
+
const $el = $(el);
|
|
70
|
+
const children = $el.children();
|
|
71
|
+
if (children.length < 3)
|
|
72
|
+
return; // need at least 3 repeating items
|
|
73
|
+
// Group children by tag name
|
|
74
|
+
const byTag = new Map();
|
|
75
|
+
children.each((_, child) => {
|
|
76
|
+
const tag = child.tagName?.toLowerCase();
|
|
77
|
+
if (tag && CONTAINER_CHILD_TAGS.has(tag)) {
|
|
78
|
+
let arr = byTag.get(tag);
|
|
79
|
+
if (!arr) {
|
|
80
|
+
arr = [];
|
|
81
|
+
byTag.set(tag, arr);
|
|
82
|
+
}
|
|
83
|
+
arr.push(child);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
for (const [tag, tagChildren] of byTag) {
|
|
87
|
+
if (tagChildren.length < 3)
|
|
88
|
+
continue;
|
|
89
|
+
// Compute child-structure signatures
|
|
90
|
+
const childSigs = [];
|
|
91
|
+
for (const child of tagChildren) {
|
|
92
|
+
const sig = childSignature($, child);
|
|
93
|
+
childSigs.push({ child, sig });
|
|
94
|
+
}
|
|
95
|
+
// Separate children with content vs empty
|
|
96
|
+
const withSig = childSigs.filter(c => c.sig.length > 0);
|
|
97
|
+
const withoutSig = childSigs.filter(c => c.sig.length === 0);
|
|
98
|
+
if (withSig.length === 0) {
|
|
99
|
+
// All children are text-only or empty — still consider if there are enough
|
|
100
|
+
const withContent = tagChildren.filter(c => $(c).text().trim().length > 3);
|
|
101
|
+
if (withContent.length >= 3) {
|
|
102
|
+
const score = withContent.length;
|
|
103
|
+
candidates.push({ parent: el, tag, children: withContent, score });
|
|
104
|
+
}
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
// Find the dominant signature (most common structure among children)
|
|
108
|
+
const sigCounts = new Map();
|
|
109
|
+
for (const { sig } of withSig) {
|
|
110
|
+
sigCounts.set(sig, (sigCounts.get(sig) || 0) + 1);
|
|
111
|
+
}
|
|
112
|
+
let dominantSig = '';
|
|
113
|
+
let dominantCount = 0;
|
|
114
|
+
for (const [sig, count] of sigCounts) {
|
|
115
|
+
if (count > dominantCount) {
|
|
116
|
+
dominantSig = sig;
|
|
117
|
+
dominantCount = count;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Use *similarity* matching: include children whose signature is
|
|
121
|
+
// "similar enough" to the dominant one (handles optional sub-elements).
|
|
122
|
+
const matching = withSig
|
|
123
|
+
.filter(c => signaturesAreSimilar(c.sig, dominantSig))
|
|
124
|
+
.map(c => c.child);
|
|
125
|
+
// Also include text-only children that have meaningful content
|
|
126
|
+
for (const { child } of withoutSig) {
|
|
127
|
+
if ($(child).text().trim().length > 3) {
|
|
128
|
+
matching.push(child);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (matching.length < 3)
|
|
132
|
+
continue;
|
|
133
|
+
const consistency = matching.length / tagChildren.length;
|
|
134
|
+
const score = matching.length * consistency;
|
|
135
|
+
candidates.push({ parent: el, tag, children: matching, score });
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
if (candidates.length === 0)
|
|
139
|
+
return null;
|
|
140
|
+
// Sort by initial structural score descending.
|
|
141
|
+
candidates.sort((a, b) => b.score - a.score || b.children.length - a.children.length);
|
|
142
|
+
// Take top candidates and re-rank by content quality.
|
|
143
|
+
// This ensures containers with actual titles/prices beat those with
|
|
144
|
+
// usernames or boilerplate (e.g. HN subtext rows vs title rows).
|
|
145
|
+
const topN = candidates.slice(0, Math.min(candidates.length, 8));
|
|
146
|
+
let best = null;
|
|
147
|
+
let bestContentScore = -1;
|
|
148
|
+
for (const cand of topN) {
|
|
149
|
+
let titleLenSum = 0;
|
|
150
|
+
let titlesFound = 0;
|
|
151
|
+
let linksFound = 0;
|
|
152
|
+
const sample = cand.children.slice(0, 5);
|
|
153
|
+
for (const child of sample) {
|
|
154
|
+
const item = extractItem($, child);
|
|
155
|
+
if (item.title && item.title.length >= 3) {
|
|
156
|
+
titleLenSum += item.title.length;
|
|
157
|
+
titlesFound++;
|
|
158
|
+
}
|
|
159
|
+
if (item.link)
|
|
160
|
+
linksFound++;
|
|
161
|
+
}
|
|
162
|
+
// Content score: average title length × title hit rate × structural score
|
|
163
|
+
const avgTitleLen = titlesFound > 0 ? titleLenSum / titlesFound : 0;
|
|
164
|
+
const titleRate = titlesFound / sample.length;
|
|
165
|
+
const contentScore = avgTitleLen * titleRate * cand.score;
|
|
166
|
+
if (contentScore > bestContentScore) {
|
|
167
|
+
bestContentScore = contentScore;
|
|
168
|
+
best = cand;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return best;
|
|
172
|
+
}
|
|
173
|
+
/** Price-matching regex — $12.34, £99, €5,00, etc. */
|
|
174
|
+
const PRICE_RE = /(?:[\$£€¥₹])\s*[\d,]+(?:\.\d{1,2})?|[\d,]+(?:\.\d{1,2})?\s*(?:USD|EUR|GBP|JPY|INR)/i;
|
|
175
|
+
/**
|
|
176
|
+
* Resolve a potentially relative URL against a base URL.
|
|
177
|
+
* Returns the original string if resolution fails.
|
|
178
|
+
*/
|
|
179
|
+
function resolveUrl(href, baseUrl) {
|
|
180
|
+
if (!href)
|
|
181
|
+
return undefined;
|
|
182
|
+
if (href.startsWith('data:') || href.startsWith('javascript:'))
|
|
183
|
+
return undefined;
|
|
184
|
+
if (!baseUrl)
|
|
185
|
+
return href;
|
|
186
|
+
try {
|
|
187
|
+
return new URL(href, baseUrl).href;
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return href;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Extract a single ListingItem from a DOM element.
|
|
195
|
+
*/
|
|
196
|
+
function extractItem($, el, baseUrl) {
|
|
197
|
+
const $el = $(el);
|
|
198
|
+
const item = {};
|
|
199
|
+
// --- Title ---
|
|
200
|
+
// Priority: heading > [class*="title"]/[class*="name"] text or inner link text > first <a> text
|
|
201
|
+
const heading = $el.find('h1, h2, h3, h4, h5, h6').first();
|
|
202
|
+
if (heading.length && heading.text().trim().length >= 3) {
|
|
203
|
+
item.title = heading.text().trim();
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
// Iterate ALL title/name class matches (not just .first()) — some sites
|
|
207
|
+
// have multiple elements with "title" in their class (e.g. HN has a rank
|
|
208
|
+
// cell and a title cell both with class="title").
|
|
209
|
+
const titleCandidates = $el.find('[class*="title"], [class*="name"], [class*="Title"], [class*="Name"]');
|
|
210
|
+
titleCandidates.each((_, tc) => {
|
|
211
|
+
if (item.title)
|
|
212
|
+
return; // already found
|
|
213
|
+
const $tc = $(tc);
|
|
214
|
+
const innerLink = $tc.find('a').first();
|
|
215
|
+
const candidateText = (innerLink.length ? innerLink.text() : $tc.text()).trim();
|
|
216
|
+
if (candidateText.length >= 3) {
|
|
217
|
+
item.title = candidateText;
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
if (!item.title) {
|
|
221
|
+
// Fall back to first <a> with meaningful text
|
|
222
|
+
$el.find('a').each((_, a) => {
|
|
223
|
+
if (item.title)
|
|
224
|
+
return;
|
|
225
|
+
const text = $(a).text().trim();
|
|
226
|
+
if (text.length >= 3) {
|
|
227
|
+
item.title = text;
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// --- Price ---
|
|
233
|
+
const priceEl = $el.find('[class*="price"], [class*="Price"], [data-price]').first();
|
|
234
|
+
if (priceEl.length) {
|
|
235
|
+
const priceText = priceEl.text().trim();
|
|
236
|
+
const match = priceText.match(PRICE_RE);
|
|
237
|
+
item.price = match ? match[0] : priceText;
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
// Scan entire element text for a price pattern
|
|
241
|
+
const fullText = $el.text();
|
|
242
|
+
const match = fullText.match(PRICE_RE);
|
|
243
|
+
if (match) {
|
|
244
|
+
item.price = match[0];
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// --- Image ---
|
|
248
|
+
const img = $el.find('img').first();
|
|
249
|
+
if (img.length) {
|
|
250
|
+
const src = img.attr('src') || img.attr('data-src') || img.attr('data-lazy-src');
|
|
251
|
+
item.image = resolveUrl(src, baseUrl);
|
|
252
|
+
}
|
|
253
|
+
// --- Link ---
|
|
254
|
+
// Prefer the link associated with the title (inside a title-class element
|
|
255
|
+
// or heading), falling back to the first <a> in the listing.
|
|
256
|
+
const titleContainer = $el.find('[class*="title"], [class*="Title"], h1, h2, h3, h4, h5, h6').first();
|
|
257
|
+
const titleLink = titleContainer.length ? titleContainer.find('a[href]').first() : null;
|
|
258
|
+
const primaryLink = (titleLink && titleLink.length) ? titleLink : $el.find('a[href]').first();
|
|
259
|
+
if (primaryLink && primaryLink.length) {
|
|
260
|
+
item.link = resolveUrl(primaryLink.attr('href'), baseUrl);
|
|
261
|
+
}
|
|
262
|
+
// If the element itself is an <a>, use its href
|
|
263
|
+
if (!item.link && $el.prop('tagName')?.toLowerCase() === 'a') {
|
|
264
|
+
item.link = resolveUrl($el.attr('href'), baseUrl);
|
|
265
|
+
}
|
|
266
|
+
// --- Rating ---
|
|
267
|
+
const ratingEl = $el.find('[class*="rating"], [class*="Rating"], [class*="star"], [class*="Star"], [aria-label*="star"], [aria-label*="rating"]').first();
|
|
268
|
+
if (ratingEl.length) {
|
|
269
|
+
const ariaLabel = ratingEl.attr('aria-label');
|
|
270
|
+
item.rating = ariaLabel || ratingEl.text().trim() || undefined;
|
|
271
|
+
}
|
|
272
|
+
// --- Description ---
|
|
273
|
+
// Gather remaining text that isn't the title or price
|
|
274
|
+
const usedTexts = new Set();
|
|
275
|
+
if (item.title)
|
|
276
|
+
usedTexts.add(item.title);
|
|
277
|
+
if (item.price)
|
|
278
|
+
usedTexts.add(item.price);
|
|
279
|
+
if (item.rating)
|
|
280
|
+
usedTexts.add(item.rating);
|
|
281
|
+
const descParts = [];
|
|
282
|
+
$el.find('p, span, [class*="desc"], [class*="Desc"], [class*="subtitle"], [class*="snippet"]').each((_, descEl) => {
|
|
283
|
+
const text = $(descEl).text().trim();
|
|
284
|
+
if (text.length > 5 && !usedTexts.has(text) && text !== item.title) {
|
|
285
|
+
descParts.push(text);
|
|
286
|
+
usedTexts.add(text);
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
if (descParts.length > 0) {
|
|
290
|
+
item.description = descParts.slice(0, 2).join(' ');
|
|
291
|
+
}
|
|
292
|
+
return item;
|
|
293
|
+
}
|
|
294
|
+
/* ------------------------------------------------------------------ */
|
|
295
|
+
/* Public API */
|
|
296
|
+
/* ------------------------------------------------------------------ */
|
|
297
|
+
/**
|
|
298
|
+
* Automatically detect repeated listing patterns in raw HTML and extract
|
|
299
|
+
* structured items.
|
|
300
|
+
*
|
|
301
|
+
* @param html - Raw HTML string to parse.
|
|
302
|
+
* @param url - Optional base URL for resolving relative links and images.
|
|
303
|
+
* @returns Array of extracted listing items (may be empty).
|
|
304
|
+
*
|
|
305
|
+
* @example
|
|
306
|
+
* ```typescript
|
|
307
|
+
* import { extractListings } from 'webpeel';
|
|
308
|
+
*
|
|
309
|
+
* const items = extractListings(ebayHtml, 'https://ebay.com/sch?q=card');
|
|
310
|
+
* console.log(items[0].title); // "Charizard VMAX 020/189"
|
|
311
|
+
* console.log(items[0].price); // "$24.99"
|
|
312
|
+
* ```
|
|
313
|
+
*/
|
|
314
|
+
export function extractListings(html, url) {
|
|
315
|
+
if (!html || html.trim().length === 0)
|
|
316
|
+
return [];
|
|
317
|
+
const $ = load(html);
|
|
318
|
+
const container = findListingContainer($);
|
|
319
|
+
if (!container)
|
|
320
|
+
return [];
|
|
321
|
+
const items = [];
|
|
322
|
+
for (const child of container.children) {
|
|
323
|
+
const item = extractItem($, child, url);
|
|
324
|
+
// Filter out empty / too-short titles
|
|
325
|
+
if (!item.title || item.title.length < 3)
|
|
326
|
+
continue;
|
|
327
|
+
items.push(item);
|
|
328
|
+
}
|
|
329
|
+
return items;
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=extract-listings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-listings.js","sourceRoot":"","sources":["../../src/core/extract-listings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/core/extract.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAoD9B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/core/extract.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAoD9B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAmF5F"}
|
package/dist/core/extract.js
CHANGED
|
@@ -57,11 +57,24 @@ export function extractStructured(html, options) {
|
|
|
57
57
|
const result = {};
|
|
58
58
|
if (options.selectors) {
|
|
59
59
|
// Direct CSS selector extraction
|
|
60
|
-
for (const [field,
|
|
61
|
-
|
|
60
|
+
for (const [field, selectorRaw] of Object.entries(options.selectors)) {
|
|
61
|
+
// Support @attr syntax: "a@href" extracts the href attribute from <a> elements
|
|
62
|
+
const attrMatch = selectorRaw.match(/^(.+?)@([a-zA-Z-]+)$/);
|
|
63
|
+
const cssSelector = attrMatch ? attrMatch[1] : selectorRaw;
|
|
64
|
+
const attrName = attrMatch ? attrMatch[2] : null;
|
|
65
|
+
const elements = $(cssSelector);
|
|
62
66
|
if (elements.length === 0) {
|
|
63
67
|
result[field] = null;
|
|
64
68
|
}
|
|
69
|
+
else if (attrName) {
|
|
70
|
+
// Extract attribute value(s)
|
|
71
|
+
if (elements.length === 1) {
|
|
72
|
+
result[field] = elements.first().attr(attrName) ?? null;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
result[field] = elements.map((_, el) => $(el).attr(attrName) ?? null).get();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
65
78
|
else if (elements.length === 1) {
|
|
66
79
|
result[field] = elements.first().text().trim();
|
|
67
80
|
}
|
package/dist/core/extract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/core/extract.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG/B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,OAAuB;IAEvB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAG,aAAa,EAAE,UAAU,GAAG,2BAA2B,EAAE,GAAG,OAAO,CAAC;IAElH,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACrE,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAEpF,qDAAqD;IACrD,MAAM,QAAQ,GAAG,KAAK,CAAC;IACvB,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ;QAChD,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,yBAAyB;QACxD,CAAC,CAAC,OAAO,CAAC;IAEZ,MAAM,YAAY,GAAG,MAAM;QACzB,CAAC,CAAC,4GAA4G,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,6CAA6C;QAC1L,CAAC,CAAC,0FAA0F,MAAM,6CAA6C,CAAC;IAElJ,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEtD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,GAAG,UAAU,mBAAmB,EAAE;QACnE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,eAAe,EAAE,UAAU,SAAS,EAAE;SACvC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;gBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE;aAC5C;YACD,WAAW,EAAE,CAAC;YACd,eAAe,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;SACzC,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAS,CAAC;IAC5C,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;IAE9D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,8BAA8B,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAAuB;IACrE,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,iCAAiC;QACjC,KAAK,MAAM,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/core/extract.ts"],"names":[],"mappings":"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"}
|
package/dist/core/fetcher.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Core fetching logic: simple HTTP and browser-based fetching
|
|
3
3
|
*/
|
|
4
|
+
import { type Page } from 'playwright';
|
|
4
5
|
import type { PageAction } from '../types.js';
|
|
5
6
|
export interface FetchResult {
|
|
6
7
|
/** Text content (HTML/JSON/XML/plain text). For binary documents, this may be an empty string. */
|
|
@@ -13,9 +14,9 @@ export interface FetchResult {
|
|
|
13
14
|
/** Raw Content-Type header from the response (may include charset). */
|
|
14
15
|
contentType?: string;
|
|
15
16
|
/** Playwright page object (only available in browser/stealth mode, must be closed by caller) */
|
|
16
|
-
page?: import('playwright
|
|
17
|
+
page?: import('playwright').Page;
|
|
17
18
|
/** Playwright browser object (only available in browser/stealth mode, must be closed by caller) */
|
|
18
|
-
browser?: import('playwright
|
|
19
|
+
browser?: import('playwright').Browser;
|
|
19
20
|
}
|
|
20
21
|
/**
|
|
21
22
|
* Simple HTTP fetch using native fetch + Cheerio
|
|
@@ -43,6 +44,14 @@ export declare function browserFetch(url: string, options?: {
|
|
|
43
44
|
keepPageOpen?: boolean;
|
|
44
45
|
/** Abort signal for internal races/cancellation */
|
|
45
46
|
signal?: AbortSignal;
|
|
47
|
+
/**
|
|
48
|
+
* Path to a persistent Chrome user-data-dir.
|
|
49
|
+
* When set, bypasses the shared browser pool and keeps the browser alive
|
|
50
|
+
* between fetches so cookies / session data persist.
|
|
51
|
+
*/
|
|
52
|
+
profileDir?: string;
|
|
53
|
+
/** Launch browser in headed (visible) mode. Only meaningful with profileDir or for debugging. */
|
|
54
|
+
headed?: boolean;
|
|
46
55
|
}): Promise<FetchResult>;
|
|
47
56
|
/**
|
|
48
57
|
* Retry a fetch operation with exponential backoff
|
|
@@ -74,7 +83,24 @@ export declare function browserScreenshot(url: string, options?: {
|
|
|
74
83
|
}>;
|
|
75
84
|
export declare function retryFetch<T>(fn: () => Promise<T>, maxAttempts?: number, baseDelayMs?: number): Promise<T>;
|
|
76
85
|
/**
|
|
77
|
-
*
|
|
86
|
+
* Scroll to the bottom of the page N times, waiting for the network to
|
|
87
|
+
* settle between each scroll. Useful for triggering lazy-loaded content
|
|
88
|
+
* (infinite scroll, deferred images, etc.).
|
|
89
|
+
*
|
|
90
|
+
* @param page - Playwright Page instance.
|
|
91
|
+
* @param times - Number of scroll-and-wait cycles (default: 3).
|
|
92
|
+
* @returns The final page HTML after all scrolls complete.
|
|
93
|
+
*/
|
|
94
|
+
export declare function scrollAndWait(page: Page, times?: number): Promise<string>;
|
|
95
|
+
/**
|
|
96
|
+
* Clean up browser resources (shared pool, stealth browser, and all profile browsers).
|
|
78
97
|
*/
|
|
79
98
|
export declare function cleanup(): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* Close a specific persistent profile browser (e.g. when done with a session).
|
|
101
|
+
* Safe to call even if the browser has already been closed.
|
|
102
|
+
*
|
|
103
|
+
* @param profileDir Path to the profile directory used when launching
|
|
104
|
+
*/
|
|
105
|
+
export declare function closeProfileBrowser(profileDir: string): Promise<void>;
|
|
80
106
|
//# sourceMappingURL=fetcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../src/core/fetcher.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../src/core/fetcher.ts"],"names":[],"mappings":"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"}
|