mcp-scraper 0.43.2 → 0.43.4
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 +1 -1
- package/dist/bin/api-server.cjs +92 -52
- package/dist/bin/api-server.cjs.map +1 -1
- package/dist/bin/api-server.js +2 -2
- package/dist/bin/mcp-scraper-cli.cjs +1 -1
- package/dist/bin/mcp-scraper-cli.cjs.map +1 -1
- package/dist/bin/mcp-scraper-cli.js +1 -1
- package/dist/bin/mcp-scraper-install.cjs +1 -1
- package/dist/bin/mcp-scraper-install.cjs.map +1 -1
- package/dist/bin/mcp-scraper-install.js +1 -1
- package/dist/bin/mcp-stdio-server.cjs +1 -1
- package/dist/bin/mcp-stdio-server.cjs.map +1 -1
- package/dist/bin/mcp-stdio-server.js +3 -3
- package/dist/bin/paa-harvest.cjs +42 -22
- package/dist/bin/paa-harvest.cjs.map +1 -1
- package/dist/bin/paa-harvest.js +2 -2
- package/dist/{chunk-H7LQ6PTI.js → chunk-6TAQ2MXK.js} +50 -24
- package/dist/chunk-6TAQ2MXK.js.map +1 -0
- package/dist/{chunk-YJNGNMDO.js → chunk-SXLQZKWC.js} +3 -3
- package/dist/chunk-XQIVXIAL.js +7 -0
- package/dist/chunk-XQIVXIAL.js.map +1 -0
- package/dist/{chunk-DAS7L4SF.js → chunk-ZDVQARDQ.js} +3 -1
- package/dist/chunk-ZDVQARDQ.js.map +1 -0
- package/dist/index.cjs +42 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/{server-BPEXEKA6.js → server-K76DL4S7.js} +39 -32
- package/dist/server-K76DL4S7.js.map +1 -0
- package/dist/{worker-2LIOH744.js → worker-OB6WSWOD.js} +3 -3
- package/package.json +2 -1
- package/dist/chunk-DAS7L4SF.js.map +0 -1
- package/dist/chunk-H7LQ6PTI.js.map +0 -1
- package/dist/chunk-MD75M2L5.js +0 -7
- package/dist/chunk-MD75M2L5.js.map +0 -1
- package/dist/server-BPEXEKA6.js.map +0 -1
- /package/dist/{chunk-YJNGNMDO.js.map → chunk-SXLQZKWC.js.map} +0 -0
- /package/dist/{worker-2LIOH744.js.map → worker-OB6WSWOD.js.map} +0 -0
package/dist/bin/paa-harvest.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
harvest
|
|
4
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-6TAQ2MXK.js";
|
|
5
5
|
import {
|
|
6
6
|
browserServiceApiKey
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-ZDVQARDQ.js";
|
|
8
8
|
import "../chunk-3ZUBQQPQ.js";
|
|
9
9
|
import "../chunk-5UN33CGU.js";
|
|
10
10
|
import "../chunk-FCFQ634B.js";
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
|
+
HEADLESS_HARVEST_TEST_ENV,
|
|
2
3
|
HEADLESS_OPS,
|
|
3
4
|
browserServiceApiKey,
|
|
4
5
|
browserServiceProxyId,
|
|
5
6
|
currentCostContext,
|
|
6
7
|
recordKernelSession,
|
|
7
8
|
runWithCostContext
|
|
8
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-ZDVQARDQ.js";
|
|
9
10
|
import {
|
|
10
11
|
DEFAULT_PROXY_MODE,
|
|
11
12
|
HarvestOptionsSchema,
|
|
@@ -130,10 +131,38 @@ var MapsSelectors = {
|
|
|
130
131
|
expandReview: '[data-review-id] button[aria-label*="See more"], [data-review-id] button.w8nwRe'
|
|
131
132
|
};
|
|
132
133
|
|
|
134
|
+
// src/lib/browser-user-agent.ts
|
|
135
|
+
var RUNTIME_BROWSER_UA = /\b(?:HeadlessChrome|Chrome|Chromium|Firefox)\/\d+|\bVersion\/\d+.*\bSafari\//;
|
|
136
|
+
async function detectPageUserAgent(page) {
|
|
137
|
+
try {
|
|
138
|
+
const value = await page.evaluate(() => navigator.userAgent);
|
|
139
|
+
return typeof value === "string" && RUNTIME_BROWSER_UA.test(value) ? value : null;
|
|
140
|
+
} catch {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async function detectRuntimeUserAgent(browser) {
|
|
145
|
+
let probeContext = null;
|
|
146
|
+
try {
|
|
147
|
+
let page = browser.contexts().flatMap((context) => context.pages())[0];
|
|
148
|
+
if (!page) {
|
|
149
|
+
probeContext = await browser.newContext();
|
|
150
|
+
page = probeContext.pages()[0] ?? await probeContext.newPage();
|
|
151
|
+
}
|
|
152
|
+
return await detectPageUserAgent(page);
|
|
153
|
+
} catch {
|
|
154
|
+
return null;
|
|
155
|
+
} finally {
|
|
156
|
+
if (probeContext) await probeContext.close().catch(() => {
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function withRuntimeUserAgent(options, runtimeUserAgent) {
|
|
161
|
+
return runtimeUserAgent ? { ...options, userAgent: runtimeUserAgent } : options;
|
|
162
|
+
}
|
|
163
|
+
|
|
133
164
|
// src/driver/BrowserDriver.ts
|
|
134
165
|
chromium.use(StealthPlugin());
|
|
135
|
-
var DESKTOP_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36";
|
|
136
|
-
var MOBILE_USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1";
|
|
137
166
|
var DEFAULT_KERNEL_BROWSER_TIMEOUT_SECONDS = 180;
|
|
138
167
|
var KERNEL_BROWSER_CLOSE_TIMEOUT_MS = 3e3;
|
|
139
168
|
var KERNEL_SESSION_DELETE_TIMEOUT_MS = 5e3;
|
|
@@ -168,21 +197,11 @@ async function ensureKernelProfile(kernelClient, name) {
|
|
|
168
197
|
if (!isKernelProfileConflict(err)) throw err;
|
|
169
198
|
}
|
|
170
199
|
}
|
|
171
|
-
async function detectRuntimeUserAgent(browser) {
|
|
172
|
-
try {
|
|
173
|
-
const page = browser.contexts()[0]?.pages()[0];
|
|
174
|
-
if (!page) return null;
|
|
175
|
-
const ua = await page.evaluate(() => navigator.userAgent);
|
|
176
|
-
return typeof ua === "string" && /Chrome\/\d+/.test(ua) ? ua : null;
|
|
177
|
-
} catch {
|
|
178
|
-
return null;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
200
|
function rankCheckContextOptions(config, runtimeUserAgent) {
|
|
182
201
|
return {
|
|
183
202
|
viewport: config.viewport,
|
|
184
203
|
locale: config.locale,
|
|
185
|
-
|
|
204
|
+
...runtimeUserAgent ? { userAgent: runtimeUserAgent } : {},
|
|
186
205
|
...config.deviceScaleFactor ? { deviceScaleFactor: config.deviceScaleFactor } : {},
|
|
187
206
|
...config.isMobile !== void 0 ? { isMobile: config.isMobile } : {},
|
|
188
207
|
...config.hasTouch !== void 0 ? { hasTouch: config.hasTouch } : {}
|
|
@@ -257,7 +276,7 @@ var BrowserDriver = class {
|
|
|
257
276
|
viewport: config.viewport,
|
|
258
277
|
locale: config.locale,
|
|
259
278
|
device,
|
|
260
|
-
userAgent:
|
|
279
|
+
userAgent: null,
|
|
261
280
|
deviceScaleFactor: config.deviceScaleFactor ?? null,
|
|
262
281
|
isMobile: config.isMobile === true,
|
|
263
282
|
hasTouch: config.hasTouch === true
|
|
@@ -345,7 +364,7 @@ var BrowserDriver = class {
|
|
|
345
364
|
}
|
|
346
365
|
this.browser = await playwrightChromium.connectOverCDP(kernelBrowser.cdp_ws_url);
|
|
347
366
|
const runtimeUserAgent = await detectRuntimeUserAgent(this.browser);
|
|
348
|
-
this.debugSnapshot.context.userAgent =
|
|
367
|
+
this.debugSnapshot.context.userAgent = runtimeUserAgent;
|
|
349
368
|
this.context = await this.browser.newContext(rankCheckContextOptions(config, runtimeUserAgent));
|
|
350
369
|
await this.installEsbuildHelperShims(this.context);
|
|
351
370
|
this.page = await this.context.newPage();
|
|
@@ -367,17 +386,19 @@ var BrowserDriver = class {
|
|
|
367
386
|
...config.browserExecutablePath ? { executablePath: config.browserExecutablePath } : {},
|
|
368
387
|
...config.ignoreDefaultArgs ? { ignoreDefaultArgs: config.ignoreDefaultArgs } : {}
|
|
369
388
|
};
|
|
370
|
-
const ctxOpts = rankCheckContextOptions(config);
|
|
371
389
|
if (config.profileDir) {
|
|
372
390
|
this.context = await chromium.launchPersistentContext(config.profileDir, {
|
|
373
391
|
...launchOpts,
|
|
374
|
-
...
|
|
392
|
+
...rankCheckContextOptions(config)
|
|
375
393
|
});
|
|
376
394
|
await this.installEsbuildHelperShims(this.context);
|
|
377
395
|
this.page = await this.context.newPage();
|
|
396
|
+
this.debugSnapshot.context.userAgent = await detectPageUserAgent(this.page);
|
|
378
397
|
} else {
|
|
379
398
|
this.browser = await chromium.launch(launchOpts);
|
|
380
|
-
|
|
399
|
+
const runtimeUserAgent = await detectRuntimeUserAgent(this.browser);
|
|
400
|
+
this.debugSnapshot.context.userAgent = runtimeUserAgent;
|
|
401
|
+
this.context = await this.browser.newContext(rankCheckContextOptions(config, runtimeUserAgent));
|
|
381
402
|
await this.installEsbuildHelperShims(this.context);
|
|
382
403
|
this.page = await this.context.newPage();
|
|
383
404
|
}
|
|
@@ -1304,8 +1325,6 @@ async function extractAISurfacesFromDocument(config) {
|
|
|
1304
1325
|
}
|
|
1305
1326
|
|
|
1306
1327
|
// src/extractor/PAAExtractor.ts
|
|
1307
|
-
var DESKTOP_USER_AGENT2 = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36";
|
|
1308
|
-
var MOBILE_USER_AGENT2 = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1";
|
|
1309
1328
|
var PAAExtractor = class {
|
|
1310
1329
|
constructor(driver, reporter) {
|
|
1311
1330
|
this.driver = driver;
|
|
@@ -2115,7 +2134,6 @@ var PAAExtractor = class {
|
|
|
2115
2134
|
requireUsEgress: options.requireUsEgress,
|
|
2116
2135
|
viewport: isMobile ? { width: 390, height: 844 } : { width: 1280, height: 800 },
|
|
2117
2136
|
locale: `${options.hl}-${options.gl.toUpperCase()}`,
|
|
2118
|
-
userAgent: isMobile ? MOBILE_USER_AGENT2 : DESKTOP_USER_AGENT2,
|
|
2119
2137
|
deviceScaleFactor: isMobile ? 3 : 1,
|
|
2120
2138
|
isMobile,
|
|
2121
2139
|
hasTouch: isMobile,
|
|
@@ -3242,7 +3260,12 @@ async function harvest(rawOptions) {
|
|
|
3242
3260
|
max_questions: attemptOptions.maxQuestions
|
|
3243
3261
|
}));
|
|
3244
3262
|
const baseCtx = currentCostContext();
|
|
3245
|
-
const
|
|
3263
|
+
const allowHeadlessTest = baseCtx?.harvestBrowserMode === "headless-test" && process.env[HEADLESS_HARVEST_TEST_ENV] === "true";
|
|
3264
|
+
const attempt = baseCtx ? await runWithCostContext({
|
|
3265
|
+
...baseCtx,
|
|
3266
|
+
forceHeadless: allowHeadlessTest,
|
|
3267
|
+
forceHeadful: !allowHeadlessTest
|
|
3268
|
+
}, () => extractOnce(attemptOptions, signal)) : await extractOnce(attemptOptions, signal);
|
|
3246
3269
|
if (attempt.error) {
|
|
3247
3270
|
const err = attempt.error;
|
|
3248
3271
|
const outcome2 = classifyAttemptError(err);
|
|
@@ -3433,6 +3456,9 @@ export {
|
|
|
3433
3456
|
OrganicSelectors,
|
|
3434
3457
|
LocalPackSelectors,
|
|
3435
3458
|
MapsSelectors,
|
|
3459
|
+
detectPageUserAgent,
|
|
3460
|
+
detectRuntimeUserAgent,
|
|
3461
|
+
withRuntimeUserAgent,
|
|
3436
3462
|
serpArrivalUrl,
|
|
3437
3463
|
buildYouTubeChannelVideosUrl,
|
|
3438
3464
|
BrowserDriver,
|
|
@@ -3447,4 +3473,4 @@ export {
|
|
|
3447
3473
|
resolveKernelProxyId,
|
|
3448
3474
|
harvest
|
|
3449
3475
|
};
|
|
3450
|
-
//# sourceMappingURL=chunk-
|
|
3476
|
+
//# sourceMappingURL=chunk-6TAQ2MXK.js.map
|