← 返回 Skills 市场
futurizerush

Apify Google Maps Scraper

作者 Futurize Rush · GitHub ↗ · v0.1.1 · MIT-0
cross-platform ⚠ suspicious
97
总下载
0
收藏
0
当前安装
2
版本数
在 OpenClaw 中安装
/install apify-google-maps
功能描述
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...
使用说明 (SKILL.md)

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

Parameter Type Required Description
searchQueries array of strings Yes (or startUrls) Search queries (e.g. ["coffee shop taipei"], ["dentist new york"])
startUrls array of objects Yes (or searchQueries) Direct Google Maps URLs in [{"url": "..."}] format
maxResults integer No Max results per query. Default: 50. Min: 50
language string No Language for results. Options: "en", "zh-TW". Default: varies
scrapeEmails boolean No Extract 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

Error Cause Fix
401 Unauthorized Invalid or missing API token Check APIFY_API_TOKEN
invalid-input: "must be >= 50" maxResults below minimum Set maxResults to at least 50
No results Query too specific or no businesses match Broaden 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

安全使用建议
Before installing, note that the runtime instructions require APIFY_API_TOKEN even though the registry metadata doesn't declare it. If you plan to use this skill: 1) verify the actor owner and the actor 'futurizerush/google-maps-scraper' on Apify to ensure you trust it; 2) create a scoped/restricted Apify API token (not your main account token) and never share it publicly; 3) be aware runs may crawl external websites to extract emails (possible privacy/ToS/legal implications) and may incur Apify usage costs; 4) confirm the registry metadata is updated to declare APIFY_API_TOKEN, and consider revoking or rotating the token after use. If any of these checks fail or you cannot trust the remote actor, do not provide your token.
功能分析
Type: OpenClaw Skill Name: apify-google-maps Version: 0.1.1 The skill is a standard integration for a Google Maps scraper hosted on Apify. The provided Python and Bash examples in SKILL.md correctly demonstrate how to interact with the official Apify API (api.apify.com) using a user-provided API token. While the documentation includes an affiliate link (?fpr=rush), the code logic is transparent, aligns with the stated purpose of business data extraction, and shows no signs of malicious intent, data exfiltration, or prompt injection.
能力评估
Purpose & Capability
The name/description match the instructions: the skill invokes an Apify actor to scrape Google Maps and (optionally) business websites for emails. That capability is coherent with the stated purpose.
Instruction Scope
SKILL.md explicitly instructs the agent to call api.apify.com endpoints (start runs, poll run status, fetch dataset items) and to set/use APIFY_API_TOKEN. All network calls are to Apify (and Google Maps URLs supplied as inputs). There is no instruction to read unrelated local files, but the instructions do require an environment credential that is not declared in the metadata.
Install Mechanism
This is an instruction-only skill with no install spec and no code files, so there is no on-disk installation or third-party package download risk in the bundle itself.
Credentials
SKILL.md requires APIFY_API_TOKEN (sensitive credential granting access to the user's Apify account), but the skill metadata lists no required environment variables nor a primary credential. The token requirement is appropriate for an Apify-based scraper but its absence from declared requirements is an incoherence and a risk if users are not warned.
Persistence & Privilege
The skill is not always-enabled and does not request system config paths or other long-term privileges; autonomous invocation is allowed but is the platform default.
如何使用
  1. 确保已安装 OpenClaw(本地或 Docker 部署)
  2. 在对话框中输入安装命令:/install apify-google-maps
  3. 安装完成后,直接呼叫该 Skill 的名称或使用 /apify-google-maps 触发
  4. 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
版本历史
v0.1.1
Add discovery tags for SEO
v0.1.0
Initial release. Extract business listings with emails, ratings, and hours. All output fields verified.
元数据
Slug apify-google-maps
版本 0.1.1
许可证 MIT-0
累计安装 0
当前安装数 0
历史版本数 2
常见问题

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... 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 97 次。

如何安装 Apify Google Maps Scraper?

在 OpenClaw 或 Claude Code 对话框中运行命令「/install apify-google-maps」即可一键安装,无需额外配置。

Apify Google Maps Scraper 是免费的吗?

是的,Apify Google Maps Scraper 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。

Apify Google Maps Scraper 支持哪些平台?

Apify Google Maps Scraper 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。

谁开发了 Apify Google Maps Scraper?

由 Futurize Rush(@futurizerush)开发并维护,当前版本 v0.1.1。

💬 留言讨论