← 返回
未分类 Key 中文

Apify Google Maps Scraper

This skill should be used when the user asks to "scrape Google Maps", "find businesses on Google Maps", "get business listings", "extract business data", "fi...
此技能用于用户请求“抓取谷歌地图”“在谷歌地图上查找企业”“获取商家列表”“提取商家数据”等情形。
futurizerush
未分类 clawhub v0.1.1 1 版本 100000 Key: 需要
★ 0
Stars
📥 342
下载
💾 0
安装
1
版本
#ai-agent#apify#business#email#google-maps#latest#lead-generation#scraping

概述

Google Maps Scraper with Apify

Search and extract business listings from Google Maps including name, address, phone, website, email, ratings, and opening hours. Supports email extraction from business websites.

Actor: futurizerush/google-maps-scraper

Prerequisites

Set APIFY_API_TOKEN in environment. Get a token at console.apify.com/account/integrations.

Execution Flow

Apify runs are asynchronous. Every request follows 3 steps:

  1. Start a run -- POST to the actor API, receive a run ID and dataset ID
  2. Poll until done -- GET the run status, wait for SUCCEEDED
  3. Fetch results -- GET the dataset items (returns a JSON array)

Typical run time: 1-5 minutes depending on result count and email scraping.

Input Parameters

ParameterTypeRequiredDescription
----------------------------------------
searchQueriesarray of stringsYes (or startUrls)Search queries (e.g. ["coffee shop taipei"], ["dentist new york"])
startUrlsarray of objectsYes (or searchQueries)Direct Google Maps URLs in [{"url": "..."}] format
maxResultsintegerNoMax results per query. Default: 50. Min: 50
languagestringNoLanguage for results. Options: "en", "zh-TW". Default: varies
scrapeEmailsbooleanNoExtract emails from business websites. Default: true

Complete Example (Python)

import requests, os, time

TOKEN = os.environ["APIFY_API_TOKEN"]
BASE = "https://api.apify.com/v2"

# Step 1: Start the run
response = requests.post(
    f"{BASE}/acts/futurizerush~google-maps-scraper/runs?token={TOKEN}",
    json={
        "searchQueries": ["coffee shop taipei"],
        "maxResults": 50,
        "language": "en",
        "scrapeEmails": True,
    },
)
response.raise_for_status()
run = response.json()["data"]
run_id = run["id"]
dataset_id = run["defaultDatasetId"]

# Step 2: Poll until done
while True:
    status = requests.get(
        f"{BASE}/actor-runs/{run_id}?token={TOKEN}"
    ).json()["data"]["status"]
    if status == "SUCCEEDED":
        break
    if status in ("FAILED", "ABORTED", "TIMED-OUT"):
        raise RuntimeError(f"Run failed: {status}")
    time.sleep(5)

# Step 3: Fetch results (JSON array)
items = requests.get(
    f"{BASE}/datasets/{dataset_id}/items?token={TOKEN}"
).json()
for biz in items:
    print(f"{biz['name']} ({biz['businessType']})")
    print(f"  Rating: {biz['rating']} ({biz['reviews']} reviews)")
    print(f"  Address: {biz['address']}")
    print(f"  Phone: {biz['phone']}")
    if biz.get("emails"):
        print(f"  Emails: {', '.join(biz['emails'])}")

Search with direct Google Maps URL

requests.post(
    f"{BASE}/acts/futurizerush~google-maps-scraper/runs?token={TOKEN}",
    json={
        "startUrls": [
            {"url": "https://www.google.com/maps/search/sushi+restaurant+tokyo"}
        ],
        "maxResults": 50,
        "scrapeEmails": True,
    },
)

Multiple queries

requests.post(
    f"{BASE}/acts/futurizerush~google-maps-scraper/runs?token={TOKEN}",
    json={
        "searchQueries": ["dentist new york", "lawyer new york", "accountant new york"],
        "maxResults": 50,
        "scrapeEmails": True,
    },
)

Complete Example (bash)

# Step 1: Start the run
RUN_RESPONSE=$(curl -s -X POST \
  "https://api.apify.com/v2/acts/futurizerush~google-maps-scraper/runs?token=$APIFY_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries": ["coffee shop taipei"], "maxResults": 50, "language": "en", "scrapeEmails": true}')

RUN_ID=$(echo "$RUN_RESPONSE" | jq -r '.data.id')
DATASET_ID=$(echo "$RUN_RESPONSE" | jq -r '.data.defaultDatasetId')

# Step 2: Poll until done
while true; do
  STATUS=$(curl -s "https://api.apify.com/v2/actor-runs/$RUN_ID?token=$APIFY_API_TOKEN" \
    | jq -r '.data.status')
  [ "$STATUS" = "SUCCEEDED" ] && break
  [ "$STATUS" = "FAILED" ] || [ "$STATUS" = "ABORTED" ] && echo "Failed: $STATUS" && exit 1
  sleep 5
done

# Step 3: Fetch results
curl -s "https://api.apify.com/v2/datasets/$DATASET_ID/items?token=$APIFY_API_TOKEN" | jq '.'

Output Format

Each item in the results array (field names verified from real API output on 2026-04-11):

{
  "name": "RUFOUS COFFEE",
  "placeId": "ChIJW03Z2y6qQjQRkIeeuqF3-mU",
  "latitude": 25.0235003,
  "longitude": 121.5436548,
  "rating": 4.6,
  "reviews": 1756,
  "address": "No. 339號, Section 2, Fuxing S Rd, Da'an District, Taipei City, Taiwan 106",
  "businessType": "Coffee shop",
  "phone": "+886 2 2736 6880",
  "website": "https://www.rufous.com.tw/",
  "email": null,
  "emails": [],
  "url": "https://www.google.com/maps/place/RUFOUS+COFFEE/data=...",
  "hours": [
    "Monday: 12 to 8 PM",
    "Tuesday: 12 to 8 PM",
    "Wednesday: 12 to 8 PM",
    "Thursday: Closed",
    "Friday: 12 to 8 PM",
    "Saturday: 12 to 8 PM",
    "Sunday: 12 to 8 PM"
  ],
  "hoursDetail": {
    "Monday": "12 to 8 PM",
    "Tuesday": "12 to 8 PM",
    "Thursday": "Closed"
  },
  "sourceUrl": "https://www.google.com/maps/search/coffee%20shop%20taipei?hl=en",
  "query": "coffee shop taipei",
  "timestamp": "2026-04-11T06:10:14.294Z",
  "scrapeDuration": 233
}

Note: Field names use camelCase. email is a single string (or null), emails is an array (may be empty even with scrapeEmails: true if no email is found on the website). hours is an ordered array; hoursDetail is a keyed object.

Error Handling

ErrorCauseFix
-------------------
401 UnauthorizedInvalid or missing API tokenCheck APIFY_API_TOKEN
invalid-input: "must be >= 50"maxResults below minimumSet maxResults to at least 50
No resultsQuery too specific or no businesses matchBroaden the search query

Tips

  • Use scrapeEmails: true for lead generation -- the actor visits each business website to find emails.
  • Email scraping adds time (visiting each website), so runs take longer with it enabled.
  • placeId is a stable Google Maps identifier -- use it for deduplication across queries.
  • hours is an ordered array (Monday-Sunday), hoursDetail is a keyed object -- use whichever is more convenient.
  • latitude and longitude can be used for distance calculations or map visualizations.
  • Multiple search queries run in a single actor execution.
  • No Google Maps API key required.

Links

版本历史

共 1 个版本

  • v0.1.1 当前
    2026-05-07 12:59 安全 安全

安全检测

腾讯云安全 (Keen)

安全,无风险
查看报告

腾讯云安全 (Sanbu)

安全,无风险
查看报告

🔗 相关推荐

data-analysis

Tavily 搜索

jacky1n7
通过 Tavily API 进行网页搜索(Brave 替代方案)。当用户要求搜索网页、查找来源或链接,且 Brave 网页搜索不可用时使用。
★ 279 📥 101,706
data-analysis

AdMapix

fly0pants
AdMapix 原始数据层,提供广告创意、应用、排名、下载/收入及市场元数据。返回 AdMapix API 的结构化 JSON;调用方...
★ 298 📥 143,195
data-analysis

Data Analysis

ivangdavila
{"answer":"数据分析与可视化。查询数据库、生成报告、自动化电子表格,将原始数据转化为清晰可行的见解。适用于:(1) 您……"}
★ 218 📥 71,828