Merlin Backend 12 files · 0 subfolders
Copy to Workspace 04-Scraping Shared from "Merlin Backend" on Inkdown
Scraping Architecture
Overview
The scraping system extracts content from web pages using multiple providers with automatic fallback. It handles regular web pages, JavaScript-rendered content, premium proxies, and even special cases like Twitter/X posts.
Scraping Providers
02-DeepResearch.md
1. ScrapingBee Integration File: src/server/services/scrapper.ts
Basic Configuration
Core Scraping Function File: src/server/services/scrapper.ts:40
API Call Structure File: src/server/services/scrapper.ts:22
api_key: Authentication
url: Target URL to scrape
render_js: Execute JavaScript (slower, more expensive)
premium_proxy: Use residential proxies (better success rate, more expensive)
Retry Logic (Deep Research):
Attempt 1: Standard proxy, no JS
Attempt 2: Standard proxy, JS enabled
Attempt 3+: Premium proxy, JS enabled
2. Firecrawl Integration File: src/server/services/firecrawl.ts
For deep research, AI-powered scraping via Firecrawl:
Automatic content extraction
Markdown conversion
PDF text extraction
Rate limiting handled by library
3. Deep Research 4-Tier Scraping File: src/server/endpoints/unified/features/deepResearch/firecrawlSerp.ts
For deep research, a sophisticated multi-tier approach:
4. Twitter/X Special Handling File: src/server/services/scrapper.ts:81
Twitter/X uses a special CDN API instead of scraping:
Twitter blocks most scrapers
CDN endpoint is public but requires token generation
Returns clean text (no HTML parsing needed)
4s timeout (fast fail)
This mimics Twitter's frontend token generation to access their CDN.
5. Parallel URL Scraping File: src/server/endpoints/unified/features/web-access/utils.ts
When multiple search results need scraping, fetch in parallel:
Parallel fetching (all at once)
8-second timeout per URL
Returns fastest results first
Graceful degradation (undefined for failures)
6. HTML to Markdown Conversion File: src/server/endpoints/unified/features/web-access/utils.ts
Scrape HTML (via ScrapingBee)
Parse with JSDOM or similar
Extract main content (remove nav, ads, etc.)
Convert to Markdown (Turndown or similar)
Validate minimum length (100 chars)
7. Retry Architecture File: src/server/utilities/retry.ts
The retry system used by scrapers:
Retry 0: Standard proxy, no JS
Retry 1: Standard proxy, JS enabled
Retry 2+: Premium proxy, JS enabled
8. Error Handling Strategy
Scraping Error Hierarchy
Error Handling in Code
9. Integration with Search Scraping is the second step after search:
10. Performance Optimization
Scraping Best Practices
Parallel Execution
Timeout Management
Content Validation
Smart Retries
Summary The scraping architecture:
Multi-Tier Fallback : ScrapingBee → Firecrawl → Direct
Progressive Enhancement : Standard → JS → Premium proxy
Parallel Execution : All URLs scraped simultaneously
Smart Retries : Context-aware with exponential backoff
Special Cases : Twitter CDN API for X.com
Content Validation : Minimum length checks
Error Resilience : Graceful degradation to undefined
Key Principle: Never let a scraping failure crash the research. Always have a fallback, always return gracefully.