Google 地图业务数据对于潜在客户开发、本地 SEO 审核和市场研究至关重要。抓取 Google 地图会直接触发积极的反机器人保护,包括验证码、IP 禁令和 JavaScript 挑战。 Scavio API 允许您按查询和位置搜索本地企业,返回包含企业名称、地址、评级、评论计数、电话号码和网站的结构化 JSON。本教程介绍如何查询任何业务类别和位置的 Google 地图数据,然后导出结果以进行推广或分析。
前置条件
- Python 3.8 或更高版本
- 请求已安装库
- Scavio API 密钥
- 要搜索的目标业务类别和位置
操作指南
步骤 1: 搜索本地企业
使用 Google 地图样式的查询(包括业务类型和位置)POST 到 Scavio 端点。 local_results 字段包含结构化的企业列表。
import os
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def search_maps(query: str, location: str) -> list[dict]:
response = requests.post(
ENDPOINT,
headers={"x-api-key": API_KEY},
json={"query": f"{query} in {location}", "country_code": "us"}
)
response.raise_for_status()
return response.json().get("local_results", [])步骤 2: 提取业务详细信息
解析每个本地结果的名称、地址、电话、评级、评论计数和网站 URL。
def extract_business(result: dict) -> dict:
return {
"name": result.get("title"),
"address": result.get("address"),
"phone": result.get("phone"),
"rating": result.get("rating"),
"reviews": result.get("reviews"),
"website": result.get("website"),
}步骤 3: 按最低评级过滤
仅将企业保留在质量领先名单评级阈值以上。
def filter_by_rating(businesses: list[dict], min_rating: float = 4.0) -> list[dict]:
return [
b for b in businesses
if b.get("rating") and float(b["rating"]) >= min_rating
]步骤 4: 导出为 CSV
将筛选后的业务列表写入 CSV 文件,以便在 CRM 导入或外展工具中使用。
import csv
def export_csv(businesses: list[dict], filename: str = "leads.csv") -> None:
with open(filename, "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["name", "address", "phone", "rating", "reviews", "website"])
writer.writeheader()
writer.writerows(businesses)
print(f"Exported {len(businesses)} businesses to {filename}")Python 示例
import os
import csv
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
def search_maps(query: str, location: str) -> list[dict]:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"query": f"{query} in {location}", "country_code": "us"})
r.raise_for_status()
return r.json().get("local_results", [])
def extract(result: dict) -> dict:
return {
"name": result.get("title"),
"address": result.get("address"),
"phone": result.get("phone"),
"rating": result.get("rating"),
"reviews": result.get("reviews"),
"website": result.get("website"),
}
if __name__ == "__main__":
results = search_maps("dentists", "San Francisco, CA")
businesses = [extract(r) for r in results]
high_rated = [b for b in businesses if b["rating"] and float(b["rating"]) >= 4.5]
with open("leads.csv", "w", newline="") as f:
w = csv.DictWriter(f, fieldnames=list(high_rated[0].keys()))
w.writeheader()
w.writerows(high_rated)
print(f"Exported {len(high_rated)} leads")JavaScript 示例
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
const fs = require("fs");
async function searchMaps(query, location) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query: `${query} in ${location}`, country_code: "us" })
});
const data = await res.json();
return (data.local_results || []).map(r => ({
name: r.title, address: r.address, phone: r.phone,
rating: r.rating, reviews: r.reviews, website: r.website
}));
}
async function main() {
const businesses = await searchMaps("dentists", "San Francisco, CA");
const filtered = businesses.filter(b => b.rating && parseFloat(b.rating) >= 4.5);
const header = "name,address,phone,rating,reviews,website";
const rows = filtered.map(b => Object.values(b).join(","));
fs.writeFileSync("leads.csv", [header, ...rows].join("\n"));
console.log(`Exported ${filtered.length} leads`);
}
main().catch(console.error);预期输出
{
"local_results": [
{
"title": "Pacific Heights Dental",
"address": "2100 Webster St, San Francisco, CA 94115",
"phone": "(415) 555-0123",
"rating": "4.9",
"reviews": 342,
"website": "https://pacificheightsdental.com",
"hours": "Open until 5:00 PM"
}
]
}