Google Maps Lead Scraper & SMB Audit avatar

Google Maps Lead Scraper & SMB Audit

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Google Maps Lead Scraper & SMB Audit

Google Maps Lead Scraper & SMB Audit

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Muhammad Sajid Izzulhaq

Muhammad Sajid Izzulhaq

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 hours ago

Last modified

Categories

Share

UMKM Lead Generator — Google Maps

Actor Apify yang mencari UMKM yang belum punya website, lalu memberi skor urutan prioritas supaya Anda tahu siapa yang perlu dihubungi lebih dulu.

Cocok untuk siapa: freelance web developer, digital agency, dan siapa pun yang menj jasa pembuatan website atau landing page ke UMKM.

Masalah yang diselesaikan

Mencari calon klien secara manual di Google Maps itu melelahkan. Kalau Anda cari "warung kopi", rata-rata 19 dari 20 hasil tidak punya website sama sekali — dan sebagian besar tidak punya nomor telepon yang bisa dihubungi. Actor ini menyaring dua masalah itu sekaligus, lalu menandai mana yang paling layak dikejar.

Yang dilakukan actor

  1. Mengambil hasil pencarian Google Maps lewat endpoint JSON internal (tbm=map). Tanpa headless browser, jadi jauh lebih cepat dan murah.
  2. Mengekstrak nama, alamat, rating, jumlah ulasan, kategori, koordinat, nomor telepon, dan website.
  3. Menghitung gapScore 0-100 untuk setiap bisnis, dengan gapReason dalam Bahasa Indonesia yang bisa langsung Anda pakai saat menelepon.
  4. Mengembalikan hanya lead yang layak: tidak punya website sendiri dan punya nomor telepon publik.

Input

location itu bukan hiasan: nama kota di situ menggeser pusat pencarian. Filter geografis Google ada di dalam pb pada !2d{lng}!3d{lat}, jadi kalau kotanya tidak dipetakan ke koordinat yang benar, hasilnya salah kota tanpa warning.

Yang dilakukan actor dengan location:

  1. dicocokkan ke tabel kota offline (819 nama: 217 kota Indonesia + kota besar dunia), case/spasi/awalan kota tidak berpengaruh;
  2. dipakai sebagai titik tengah pencarian, bukan cuma tambahan di query;
  3. dipakai juga untuk memperingatkan kalau countryCode tidak cocok.

Kalau nama kotanya tidak ada di tabel, actor berhenti dengan pesan jelas — lebih baik gagal daripada mengirim lead salah kota. Wilayah yang ada di tabel melewati lat/lng, atau tambahkan kotanya ke packages/gmaps-core/src/gmaps_core/data/cities.json.

FieldTipeDefaultKeterangan
searchStringslist of string["Kopi"]Kata kunci. Actor menggabungkannya dengan location.
locationstringwajibKota yang jadi pusat pemindaian, mis. Jakarta. Dicocokkan ke tabel kota offline.
lat / lngnumberkosongTitik tengah manual. Kosongkan kecuali tahu persis koordinatnya.
radiusKmnumber30Radius dari titik tengah.
maxItemsinteger20Total hasil per kata kunci (1-480). Dipecah otomatis jadi beberapa request.
languagestringidKode bahasa respons Google, mis. id atau en.
countryCodestringidKode negara respons Google, mis. id atau jp.
onlyGapLeadsbooleantrueHanya lead tanpa website + bertelepon.
minGapScoreinteger0Buang lead di bawah skor ini.
includeUnprovenbooleanfalseSertakan bisnis tanpa rating.
includeRawbooleanfalseKembalikan semua tempat, bukan hanya lead.
debugDumpbooleanfalseSimpan payload Google mentah ke key-value store.

Output

Tiga keluaran sekaligus:

TujuanLokasi di halaman runIsi
Spreadsheetkey-value store default, record leads.xlsx2 sheet: Leads dan Ringkasan.
Data mentahdatasetSatu baris per tempat, bisa disaring di UI Apify.
Ringkasan runkey-value store default, record SUMMARYStatistik dan parameter run.

Dataset punya dua tampilan, dipilih dari dropdown di atas tabel:

TampilanIsi
Leads15 kolom untuk menghubungi calon klien, urut dari skor tertinggi.
Semua tempat24 kolom lengkap, termasuk yang sudah punya website sendiri.

Setiap kolom punya judul Bahasa Indonesia, dan Prioritas memakai nilai Panas / Hangat / Dingin — bukan hot / warm / cold yang cuma penting di kode.

Isi spreadsheet

Sheet Leads memuat semua tempat yang dipindai (bukan hanya lead), diurutkan sesuai skor. Handy karena yang butuh filtering bisa pakai dropdown Autofilter:

No, Nama, Kategori, Rating, Ulasan, Telepon, WhatsApp, Kota, Kecamatan, Alamat, Website, Skor Gap, Prioritas, Alasan (script jualan), Buka di Maps, Penawaran.

Beberapa detail yang disengaja:

  • Telepon ditulis sebagai teks. Kalau jadi angka, Excel membuang nol di depan dan nomor jadi tidak bisa dihubungi.
  • Kolom WhatsApp adalah tautan wa.me siap klik, tapi hanya untuk nomor HP. Nomor tetap tidak bisa dipakai WhatsApp, jadi dikosongkan.
  • Alasan dan Penawaran sudah Bahasa Indonesia, bisa langsung dibacakan saat menelepon.

Sheet Ringkasan berisi konfigurasi run, jumlah lead per prioritas, dan seberapa banyak yang punya nomor telepon.

Field di dataset

FieldKeterangan
title, address, rating, review_count, categoryData dasar bisnis.
phone, phoneInternational, phoneDigitsNomor telepon dalam tiga format.
websiteURL website kalau ada.
websiteKindown (punya website sendiri), social (cuma akun social), none.
gapScore0-100. Makin tinggi makin layak dikejar.
gapTierhot / warm / cold / none.
isGapLeadtrue bila layak dihubungi untuk jasa website.
gapReasonAlasan Bahasa Indonesia, siap dibacakan ke prospek.
suggestedOfferRekomendasi materi penawaran.
place_url, reviews_url, lat, lngUntuk verifikasi manual.

Cara skor dihitung

Tiga komponen, semuanya transparan:

KomponenNilaiLogika
Celah digital0-40Tidak ada web (40), cuma social (32), sudah punya web (0).
Reputasi0-47Rating hanya dihitung di atas 3,5; ulasan memakai skala logaritmik.
Bisa dihubungi0-15Punya nomor telepon publik.

Dua penyesuaian yang disengaja:

  • Rating di bawah 3,5 dapat 0 poin. Bisnis lemah adalah risiko, bukan peluang.
  • Ulasan sangat banyak (>3.000) dikurangi 8 poin. Hal tersebut sudah bercabang, sehingga lebih sulit dijual jasa website pribadi.

Contoh output

{
"no": 1,
"title": "BARBIE LAUNDRY",
"address": "Jl. Puntik Kemuning No.88, Peanut, Tj. Karang Timur",
"rating": 4.7,
"review_count": 464,
"phone": "0812-7923-7715",
"phoneInternational": "+62 812-7923-7715",
"phoneDigits": "081279237715",
"website": "",
"websiteKind": "none",
"hasPhone": true,
"hasWebsite": false,
"contactable": true,
"gapScore": 93,
"gapTier": "hot",
"isGapLead": true,
"gapReason": "Tidak punya website sama sekali. Reputasi sudah bagus (rating 4.7, 464 ulasan). Ada nomor telepon publik sehingga bisa langsung dihubungi.",
"suggestedOffer": "Website + Google Business Profile + landing page promo - tawarkan social proof dari ulasan yang sudah banyak"
}

Contoh menjalankan

apify run umkm-google-maps \
--input '{"searchStrings":["warung kopi","laundry"],"location":"Bandar Lampung","maxItems":40}'
# Kota lain
apify run umkm-google-maps \
--input '{"searchStrings":["kopi"],"location":"Jakarta","maxItems":100}'
# Kota luar negeri: sesuaikan countryCode, kalau tidak kolom Ulasannya
# mengikuti bahasa Indonesia
apify run umkm-google-maps \
--input '{"searchStrings":["coffee"],"location":"Tokyo","countryCode":"jp","language":"en"}'

Proxy (opsional)

Kalau kena rate limit, actor bisa scraping lewat proxy. Kredensialnya tidak pernah ada di input schema — hanya lewat environment variable SCRAPER_PROXY dengan format http://user:pass@host:port.

Untuk run di Apify, atur lewat Console → actor ini → Environment variables, bukan lewat actor.json dan bukan lewat input run. Isi actor.json hanya dipakai saat deploy pakai Apify CLI; deploy dari GitHub mengambil nilainya dari Console.

Untuk run lokal, set saja di shell:

$export SCRAPER_PROXY="http://user:pass@host:port"

Kalau kosong, actor berjalan tanpa proxy.

Catatan teknis

Scraping memakai curl_cffi untuk memalsukan sidik jari TLS seperti Chrome. Tanpa itu, Google memblokir request di level jaringan. Rate limiting 1,5-3 detik plus exponential backoff sudah menyatu di dalam kode dan tidak bisa dimatikan.

Struktur indeks field Google ada di packages/gmaps-core/src/gmaps_core/indexes.py — satu-satunya tempat yang perlu diubah kalau Google mengubah responsnya.

Batasan

  • Maksimal 40 hasil per request (batas Google), jadi maxItems dipecah otomatis. Batas keras maxItems = 480 per kata kunci. Kalau hasilnya kurang dari maxItems, berarti memang tidak ada tempat lagi di area itu — bukan scraping-nya gagal.
  • location harus berupa nama kota yang ada di tabel. Alamat jalan, nama formatted, atau nama kelurahan (Kemang, Kemang, Jatiasih) tidak dikenali. Pakai lat/lng untuk kasus seperti itu.
  • Nomor telepon hanya ada kalau pemilik usaha menempelkannya secara publik di profil Google Business. Actor tidak menebak atau mengarang nomor.
  • Data berasal dari Google Maps. Patuhi ketentuan layanan Google, dan jangan memakai actor ini untuk mengumpulkan data pribadi yang tidak dipublikasikan pemilik usaha.