Selected Work
Shipped · PromptCloud

Modular Web Scraping Pipeline

Production-scale, multi-site extraction with YAML-driven configuration

Twenty different websites means twenty different ways of breaking. This pipeline was my attempt to stop firefighting site-specific scripts and start treating extraction as configuration, not code.

ContextPromptCloud / 42Signals
Sites Automated20+
StackPython · MySQL · BeautifulSoup

Before this pipeline existed, every new site meant a new one-off script: its own parsing logic, its own retry handling, its own quiet way of failing at 2 a.m. That's manageable at three sites. It stops being manageable at twenty, when every fix to one script has to be re-learned and re-applied to nineteen others that were each written slightly differently.

The fix wasn't cleverer scraping code; it was refusing to let site-specific logic touch the parts of the system that should behave identically everywhere: retries, storage, validation. I designed a YAML-configured adaptor system that separates URL collection, fetching, parsing, and storage into independent stages, so onboarding a new site becomes writing a config file, not a new program.

That separation is the part I'd defend in an interview: the moment "how do I find pages on this site" and "what do I do when a request fails" are tangled together in the same script, you've made every future site slower to add and every existing site riskier to touch.

The Build

Challenge

Site-specific scripts broke constantly with no unified architecture for scaling across multiple data sources; every fix had to be re-applied by hand, site by site.

Approach

Designed a YAML-configured adaptor system separating URL collection, fetching, parsing, and storage as independent stages, with retry logic and MySQL-backed storage shared across every site.

Architecture
URL Collector
Page Fetcher
YAML Parser
BS4 / Scrapy
Retry Layer
MySQL
Impact
20+Sites Automated
Faster Setup vs. One-Off Scripts65%
Data Accuracy95%+
PythonMySQLBeautifulSoupScrapyYAML

Scaling extraction across dozens of sources?

Happy to talk through adaptor design, retry strategy, or where config-driven pipelines start to strain.