Healthgrades Provider Scraper
Pricing
$1.50 / 1,000 provider-scrapeds
Healthgrades Provider Scraper
Collect public Healthgrades provider listings and profile details with filters and bounded enrichment.
Pricing
$1.50 / 1,000 provider-scrapeds
Rating
0.0
(0)
Developer
Sam Towers
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Healthgrades scraper
Collect public Healthgrades provider listings and profile details without a browser or login. Results are written to the default dataset and can be filtered by rating, reviews, sponsorship, and phone availability.
Functional input
Supply either startUrls (Healthgrades directory/search URLs) or a grid of non-empty specialties and locations. Main options are maxItems (default 200), maxPagesPerSearch (10), includeProviderDetails (true), excludeSponsored, minRating, minReviewCount, requirePhone, maxConcurrency (maximum 5), requestDelaySeconds, maxRetries, and optional proxyUrl.
{"specialties":["Cardiology"],"locations":["Miami, FL"],"maxItems":20,"requirePhone":true}
Functional output and charging
The CLI emits one JSON object per accepted, deduplicated provider. Records include provider/profile identity, listing rating and review data, enrichment fields where available, detailFetched, search/page/source/time provenance, and billableEvent: "provider-scraped". The successful row-emission callback is the only billable boundary: duplicates and rows removed by filters are never emitted or counted. If a later request fails, previously emitted rows remain valid billable deliveries.
$python -m healthgrades_scraper.cli input.json > providers.jsonl
On Apify, configure the same JSON fields in the Actor input. Each delivered unique provider row is charged as one provider-scraped event at the configured pay-per-event price. Duplicate, filtered, or undelivered rows are not charged.
Profile enrichment uses JSON-LD plus DOM fields, paces requests, retries refused/transient requests on a fresh connection, and marks an unsuccessfully enriched row with detailFetched: false. Use requirePhone when incomplete or phone-free rows must be excluded.
The source is public Healthgrades HTML and may rate-limit high request volume. Keep concurrency and request rates bounded; use a proxy only when direct requests are blocked. The scraper does not require login and does not guarantee that every profile exposes every detail.
Development
$python -m pytest -q