| |
| |
| |
| |
|
|
| export interface CrawlerConfig { |
| preset: string; |
| maxConcurrency: number; |
| requestHandlerTimeoutSecs: number; |
| maxRequestRetries: number; |
| pageLoadWaitMs: number; |
| launchOptions: { |
| headless: boolean | 'new'; |
| args?: string[]; |
| }; |
| selectors: { |
| brand: string[]; |
| price: string[]; |
| originalPrice: string[]; |
| rating: string[]; |
| reviews: string[]; |
| }; |
| |
| useProxy: boolean; |
| proxyFile?: string; |
| } |
|
|
| const PRESETS: Record<string, Partial<CrawlerConfig>> = { |
| fast: { |
| maxConcurrency: 20, |
| requestHandlerTimeoutSecs: 30, |
| maxRequestRetries: 1, |
| pageLoadWaitMs: 500, |
| useProxy: true, |
| launchOptions: { |
| headless: 'new', |
| args: [ |
| '--no-sandbox', |
| '--disable-setuid-sandbox', |
| '--disable-dev-shm-usage', |
| '--disable-gpu', |
| '--disable-software-rasterizer', |
| '--disable-extensions', |
| '--disable-background-networking', |
| '--disable-default-apps', |
| '--disable-sync', |
| '--disable-translate', |
| '--hide-scrollbars', |
| '--mute-audio', |
| '--no-first-run', |
| '--no-pings', |
| '--disable-features=IsolateOrigins,site-per-process' |
| ] |
| } |
| }, |
| stable: { |
| maxConcurrency: 5, |
| requestHandlerTimeoutSecs: 90, |
| maxRequestRetries: 1, |
| pageLoadWaitMs: 500, |
| useProxy: true, |
| launchOptions: { |
| headless: 'new', |
| args: [ |
| '--no-sandbox', |
| '--disable-setuid-sandbox', |
| '--disable-dev-shm-usage', |
| '--disable-gpu', |
| '--disable-software-rasterizer', |
| '--disable-extensions', |
| '--disable-background-networking', |
| '--disable-default-apps', |
| '--disable-sync', |
| '--disable-translate', |
| '--hide-scrollbars', |
| '--mute-audio', |
| '--no-first-run', |
| '--no-pings', |
| '--disable-features=IsolateOrigins,site-per-process', |
| '--dns-prefetch-disable', |
| '--disable-logging' |
| ] |
| } |
| }, |
| stealth: { |
| maxConcurrency: 2, |
| requestHandlerTimeoutSecs: 240, |
| maxRequestRetries: 2, |
| pageLoadWaitMs: 800, |
| useProxy: false, |
| launchOptions: { |
| headless: 'new', |
| args: [ |
| '--no-sandbox', |
| '--disable-setuid-sandbox', |
| '--disable-dev-shm-usage', |
| '--disable-gpu', |
| '--disable-software-rasterizer', |
| '--disable-extensions', |
| '--disable-background-networking', |
| '--disable-default-apps', |
| '--disable-sync', |
| '--disable-translate', |
| '--hide-scrollbars', |
| '--mute-audio', |
| '--no-first-run', |
| '--no-pings', |
| '--disable-features=IsolateOrigins,site-per-process', |
| |
| '--disable-blink-features=AutomationControlled', |
| '--disable-automation', |
| '--disable-web-security', |
| '--allow-running-insecure-content', |
| '--disable-features=VizDisplayCompositor', |
| '--disable-features=ImprovedCookieControls,SameSiteByDefaultCookies,CookiesWithoutSameSiteMustBeSecure', |
| '--disable-features=WebRtcHideLocalIpsWithMdns', |
| '--disable-features=WebContentsForceDark', |
| '--disable-features=AutofillEnableAccountWalletStorage', |
| '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' |
| ] |
| } |
| } |
| }; |
|
|
| export const DEFAULT_SELECTORS = { |
| |
| brand: [ |
| '.js_pdp_short-info__brand-link' |
| ], |
| price: [ |
| 'span.js_pdp_price__retail-price__value_original' |
| ], |
| originalPrice: [ |
| 'span.pdp_price__strike-through-price' |
| ], |
| rating: [ |
| 'div.pdp_cr-rating-score span' |
| ], |
| reviews: [ |
| 'span.js_pdp_cr-rating--review-count' |
| ] |
| }; |
|
|
| export function getCrawlerConfig(presetName: string = 'stable', overrides: Partial<CrawlerConfig> = {}): CrawlerConfig { |
| const preset = PRESETS[presetName] || PRESETS['stable']; |
| |
| |
| const baseConfig: CrawlerConfig = { |
| preset: presetName, |
| maxConcurrency: 5, |
| requestHandlerTimeoutSecs: 60, |
| maxRequestRetries: 3, |
| pageLoadWaitMs: 2000, |
| useProxy: false, |
| selectors: DEFAULT_SELECTORS, |
| launchOptions: { |
| headless: 'new' |
| } |
| }; |
| |
| |
| const mergedConfig: Partial<CrawlerConfig> = { |
| ...baseConfig, |
| ...preset, |
| ...overrides |
| }; |
| |
| |
| mergedConfig.launchOptions = { |
| ...(baseConfig.launchOptions), |
| ...(preset.launchOptions || {}), |
| ...(overrides.launchOptions || {}) |
| }; |
| |
| return mergedConfig as CrawlerConfig; |
| } |