Comprehensive Google Maps review scraper with filtering, multiple export formats, photo downloads, and business metadata
当前为
| Issue | Before | After |
|---|---|---|
| "a year ago" dates | Returned unknown |
Now correctly parses to estimated date |
| Profile image resolution | Hardcoded =w36-h36 didn't match actual =w72-h72 |
Uses regex =w\d+-h\d+[^=]* to match any size |
| CSV special characters | Could break on \r\n in reviews |
Proper escaping + UTF-8 BOM for Excel |
| Scroll container detection | Fragile .parentElement.parentElement chain |
Multiple selector strategies with fallback |
{
"name": "Apex Roofing",
"address": "123 Main St, Denver CO",
"rating": 4.9,
"totalReviews": 67,
"category": "Roofing contractor",
"url": "https://google.com/maps/place/..."
}
Toggle to include/exclude business owner replies:
{
"owner_response": {
"text": "Thank you for the kind words!",
"date_raw": "2 months ago",
"date_estimated": "2025-09-27"
},
"has_owner_response": true
}
reviewer_local_guide_level - Local Guide badge level (1-10)reviewer_review_count - Total reviews by this userreviewer_profile_url - Direct link to contributor profileAuto-generates: Apex_Roofing_reviews_2025-11-27.csv
(Previously: google_maps_reviews_2025-11-27.csv)
"Download All Photos" button extracts every review photo at max resolution.
interface Review {
// Reviewer
reviewer_name: string;
reviewer_profile_url: string;
reviewer_profile_img: string; // Now high-res (s400)
reviewer_local_guide_level: number | null;
reviewer_review_count: number | null;
// Review content
review_id: string;
review_url: string;
star_rating: number; // 1-5
review_content: string;
review_date_raw: string; // "2 months ago"
review_date_estimated: string; // "2025-09-27" (FIXED!)
review_date_timestamp: number | null;
// Photos
review_photos: string[]; // High-res URLs
review_photo_count: number;
// Owner response (optional)
owner_response: {
text: string;
date_raw: string;
date_estimated: string;
} | null;
has_owner_response: boolean;
// Meta
scraped_at: string; // ISO timestamp
}
.user.js file contents