v2.0.0
Public proxy types are removed and renamed (see Removed and Changed), which is a breaking
change to the library API under SemVer.
Added
- Generalized retry for every backend (static, JS, headless), applied whether or not a proxy
pool is configured. Transient failures — connection errors, timeouts,429, and5xx— are
retried with exponential backoff and jitter. RetryOptionsonCrawlerOptions.Retry(MaxRetries,BaseDelay,MaxDelay,JitterFactor,
DelayOnRateLimit,AttemptTimeout). Headless backends default toMaxRetries = 1.- Per-attempt timeout (
RetryOptions.AttemptTimeout) that cancels and retries a stalled request. - CLI flags
--retries,--retryDelay,--maxRetryDelay, and--attemptTimeout. - New
SimpleCrawler.Core.Retrynamespace:RetryExecutor,RetryClassifier,RetryReason,
RetryAttempt<T>,RetryHandler. AbstractHeadlessCrawler<TPage, TResult>inSimpleCrawler.Core: a shared base for real-browser
backends that owns the proxy-keyed page pool, the acquire/retry loop, and single-evaluation
extraction. Backends supply four vendor primitives (NewPageAsync,NavigateAsync,
ClosePageCore,EvaluateExtractorAsync) plus an optionalAfterSuccessfulLoadhook.
Changed
- Proxy rotation is now the "alternative route" case of the shared retry loop: a multi-proxy pool
rotates instantly (no delay); a single-proxy or absent pool backs off;429backs off even when
another proxy is free (DelayOnRateLimit, default on). - Breaking:
IProxyPool.ReportFailurenow takesRetryReasoninstead ofProxyFailureKind. - Retry is installed at the HTTP layer for
HttpClient-based backends, sorobots.txt/sitemap
probes and JS sub-resource fetches inherit it. The crawlerHttpClientrequest timeout is left
uncapped;RetryOptions.AttemptTimeoutbounds each attempt instead. PlaywrightCrawler<TResult>andPuppeteerCrawler<TResult>now derive from
AbstractHeadlessCrawler<IPage, TResult>instead ofAbstractRobotsCrawler<IPage, IPage, TResult>,
removing ~90% of the duplication between them. This is source-compatible: the new base still
derives fromAbstractRobotsCrawler<IPage, IPage, TResult>, no public member was removed, and
subclasses still need only overrideGetResult. Pre-compiled third-party subclasses should be
recompiled against the new base.
Removed
- Breaking: removed
ProxyFailureKind,ProxyAttempt<T>,ProxyFailureClassifier,
ProxyRetryExecutor, andProxyRoutingHandler— superseded by theRetrynamespace. - Breaking: removed
ProxyPoolOptions.MaxRetries; the retry budget moved to
RetryOptions.MaxRetries.
Compatibility
- The
smpcrawlCLI stays backward-compatible:--proxyRetriesis retained as a hidden alias for
--retries.