Google Maps Business Scraper avatar

Google Maps Business Scraper

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Google Maps Business Scraper

Google Maps Business Scraper

Google Maps Business Scraper finds and extracts local business information by location or keyword. Collects business names, addresses, phone numbers, operating hours, ratings, customer reviews, and photos. Perfect for lead generation, market research, and competitive analysis.

Pricing

from $2.00 / 1,000 results

Rating

0.0

(0)

Developer

Kirill Y

Kirill Y

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Extract business listings, reviews, hours, photos, and contact information from Google Maps by location or keyword search.

What This Actor Does

Scrapes Google Maps business data including:

  • Business names, addresses, phone numbers, websites
  • Ratings, review counts, and full review text (optional)
  • Operating hours and price levels
  • Categories and photo URLs
  • Geographic coordinates (latitude/longitude)

Perfect for:

  • Market research and competitor analysis
  • Local business directory building
  • Lead generation for B2B sales
  • Monitoring business presence across locations
  • Collecting customer reviews and sentiment data

This actor uses PlaywrightCrawler with headless Chrome to handle Google Maps' JavaScript-heavy interface and implements infinite scroll to load all available results. Anti-detection measures including residential proxy rotation and session management ensure reliable data extraction.

Input Configuration

Required:

  • searchQuery (string): Search terms (e.g., "restaurants in San Francisco" or "plumbers near Seattle")

Optional:

  • location (string): Override location if not in searchQuery
  • maxScrolls (integer, default: 50): Maximum pagination scroll attempts
  • maxResults (integer): Stop after extracting N businesses
  • extractReviews (boolean, default: false): Click into each business to extract detailed reviews (slower)
  • maxReviewsPerBusiness (integer, default: 10): Limit reviews per business when extractReviews enabled
  • proxyConfiguration (object): Proxy settings (defaults to residential proxies - required for Google Maps)

Example Input:

{
"searchQuery": "coffee shops in Seattle, WA",
"maxScrolls": 30,
"maxResults": 50,
"extractReviews": false,
"proxyConfiguration": {
"useApifyProxy": true,
"groups": ["RESIDENTIAL"]
}
}

Output Format

Array of business objects with:

  • name, address, phone, website
  • rating, reviewCount, priceLevel
  • hours (object), categories (array)
  • photoUrls (array), latitude, longitude
  • placeId (Google Maps identifier)
  • reviews (array, if extractReviews enabled)

Example Output:

{
"name": "Blue Bottle Coffee",
"address": "1103 1st Ave, Seattle, WA 98101",
"phone": "(206) 123-4567",
"website": "https://bluebottlecoffee.com",
"rating": 4.5,
"reviewCount": 234,
"priceLevel": "$$",
"hours": {},
"categories": ["Coffee shop", "Cafe", "Bakery"],
"photoUrls": ["https://lh3.googleusercontent.com/..."],
"latitude": 47.6062,
"longitude": -122.3321,
"placeId": "ChIJV4k8_9BqkFQRd0hU6Xh8MZ0",
"reviews": []
}

Important Notes

⚠️ Google Maps Blocking: Google has extremely aggressive anti-bot detection. Even with residential proxies, you may encounter CAPTCHAs or blocking. This is a known limitation of Google Maps scraping. Success rates vary (typically 60-80% with residential proxies). Consider using Google Places API as an alternative if you need guaranteed reliability.

Residential Proxies Required: Datacenter proxies will be blocked immediately. This actor defaults to Apify residential proxies, which are essential for any success. Expect higher proxy costs.

Rate Limits: The actor sets maxConcurrency: 3 to avoid detection. Increasing concurrency may trigger blocking. If you see high session retirement rates in logs, increase scroll delays or reduce concurrency further.

Review Extraction: Enabling extractReviews significantly increases runtime and cost because the crawler must click into each business and scroll through reviews. Use this feature sparingly and set maxReviewsPerBusiness to limit extraction depth. For 50 businesses with 10 reviews each, expect 5-10 minutes of runtime.

Session Management: The actor automatically retires blocked sessions and rotates IPs using SessionPool with 100 session capacity. When blocking is detected (timeouts, captchas), the problematic IP is retired from the pool, and a new proxy is selected. This ensures long-running scrapes can continue despite occasional blocking.

Scroll Behavior: The infinite scroll implementation tracks scroll height changes. If no new content loads after scrolling (height unchanged), the crawler stops automatically. Set maxScrolls to limit pagination depth - most searches return 100-300 results with 30-50 scrolls.

Technical Details

  • Crawler: PlaywrightCrawler with Chrome in headless mode
  • Anti-detection: Browser fingerprinting (enabled by default in Crawlee 3.16), residential proxy rotation, session management with automatic IP retirement on blocking
  • Pagination: Infinite scroll handling with scroll height tracking loop
  • Runtime: Node.js 24 on apify/actor-node-playwright-chrome:24 base image
  • Dependencies: Apify SDK 3.5.3, Crawlee 3.16.0
  • Session Lifecycle: markGood() on success, retire() on blocking/captcha, markBad() on server errors (5xx)

Common Issues

"Could not find scrollable container" error: Google Maps layout changed. Open an issue with the search query and date, and we'll update the selectors.

High session retirement rate: Your scrape is hitting rate limits. Reduce maxConcurrency to 1-2 or increase wait times between scrolls.

Empty results: Verify your search query returns results on Google Maps manually. Some queries may have no results or require more specific location information.

Missing data fields: Not all businesses have complete information. The scraper returns null for missing fields rather than failing.

Performance Tips

  1. Start small: Test with maxResults: 10 first to verify your query works
  2. Disable reviews initially: Set extractReviews: false for faster scraping
  3. Limit scroll depth: Use maxScrolls: 20-30 for most use cases (100-200 results)
  4. Monitor costs: Residential proxies cost more - track usage in Apify dashboard

Changelog

See CHANGELOG.md for version history.

License

Apache-2.0

Support

For issues, questions, or feature requests, contact Apify support or open an issue in the repository.