Scrapers
Pitchbook profiles
Bulk harvester for Pitchbook's roughly one million public profiles. Walks pitchbook.com/sitemap.xml down to the sub-sitemaps under public-profiles/, then optionally scrapes each profile page for the structured company or investor fields.
Updated today
Overview
At a glance
- Worker
ultron-pitchbook-public-profiles- Runtime
- Python, anti-fingerprint Firefox engine
- Total addressable
- ~1M public profiles from the sitemap
- Default discover cap
- 200 URLs (raise for production)
- Kind filter
- both | company | investor
- Proxy
- Residential US recommended
- Default delay
- 1500 ms, +50% jitter
Fundraising-adjacent workflows need investor and portfolio metadata at scale. The Pitchbook public-profile surface is the broadest free source of normalised company + investor data; this actor turns it into structured rows we can land in the brain.
Three modes
| Mode | What it does |
|---|---|
| discover | Walks sitemap.xml + sub-sitemaps. Pushes URL discovery rows. No profile pages fetched. |
| scrape | Takes profileUrls[] from input. Fetches each profile, pushes parsed rows. No sitemap walk. |
| discover-and-scrape | Default. Walks sitemap up to maxDiscoverUrls, then scrapes each. Combine input profileUrls[] with the discovered set. |
Input schema
.actor/INPUT_SCHEMA.jsonjson
Crawl flow
src/__main__.pypy
Output shape
dataset-row.jsonjson
Anti-bot strategy
Cloudflare's JS challenge is the primary defense.
| Defense | Counter |
|---|---|
| Cloudflare JS challenge | Anti-fingerprint Firefox engine clears it without solving the puzzle (real DOM execution). |
| Datacenter IP gating | Residential US proxy. |
| Rate-limit per IP | 1500 ms minimum, jitter prevents pattern detection. |
| Hot-cache poisoning on heavy-hit profiles | Per-URL retry budget is 1; we move on rather than hammer. |
Webhook contract
actor.jsonjson
File map
actors/pitchbook-public-profiles
.actor
actor.json
INPUT_SCHEMA.json
src
__main__.py
Dockerfile
requirements.txt
README.md