Google Maps Business Scraper
Pricing
from $2.00 / 1,000 results
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
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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 searchQuerymaxScrolls(integer, default: 50): Maximum pagination scroll attemptsmaxResults(integer): Stop after extracting N businessesextractReviews(boolean, default: false): Click into each business to extract detailed reviews (slower)maxReviewsPerBusiness(integer, default: 10): Limit reviews per business when extractReviews enabledproxyConfiguration(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,websiterating,reviewCount,priceLevelhours(object),categories(array)photoUrls(array),latitude,longitudeplaceId(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
- Start small: Test with
maxResults: 10first to verify your query works - Disable reviews initially: Set
extractReviews: falsefor faster scraping - Limit scroll depth: Use
maxScrolls: 20-30for most use cases (100-200 results) - 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.