Google Maps Verisi Scraping: İşletme Listeleri ve Yorumlar

Google Haritalar'ı isimleri, adresler, derecelendirmeler ve incelemeler dahil olmak üzere işletme verileri için nasıl kazınacağını öğrenin. API'yi karşılaştırmak, proxy stratejileri ve Python ve Node.js kod örnekleri.

Google Maps Verisi Scraping: İşletme Listeleri ve Yorumlar

Google Maps Data'ı neden avlayın?

Google Maps dünyadaki yerel işletmelerin en kapsamlı veritabanı içerir. 200 milyondan fazla işletme listelendikten sonra, isimler, adresler, telefon numaraları, web siteleri, derecelendirmeler, incelemeler, çalışma saatleri ve fotoğraflar - tüm yapılandırılmış ve arama edilebilir.

Bu verilerin programmatik olarak kopyalanması değerli iş uygulamaları sağlar:

  • Kurşun nesli: Hedeflenen işletme listeleri endüstri ve konum
  • Rekabetçi analiz: Harita rakip yerleri, derecelendirmeler ve duygusal bakış
  • Pazar araştırması: İş yoğunluğu, fiyatlandırma modelleri ve bölge tarafından hizmet kapsamı
  • Yerel SEO denetim: İş listelerinizi onaylayın ve rakiplerle karşılaştırın
  • Data zenginleştirme: Tamam CRM verileri taze iş bilgisi ile

Bu kılavuz, Google Haritalar verilerini kullanarak çıkarmak için teknik yaklaşımlar kapsar. Daha geniş SERP kazı stratejileri için, bizi gör Tam SERP proxy rehberi ile kazınır.

Google Yerleri API vs avlanma

Bir hurda inşa etmeden önce, resmi Google Yer API'nin ihtiyaçlarınızı karşıladığını düşünün.

Google Yerleri API vs avlanma
Faktör Faktör Faktör Faktöryerler APIYararlanmak
Maliyet Maliyet Maliyet Maliyet Maliyet1000 istek başına 17 $ (on ücretsiz tier)Proxy bant genişliği sadece (~$0.10-0.50 $ 1000 sayfa)
Data fieldsStructured JSON, 20+ alanTüm görünür veriler de yorum metinleri dahil
Puan limitleriSürekli ve günlük sınırlarhavuz proxy büyüklüğü
Review textEn alakalı 5 yorumTüm yorumları (Pagination ile)
ReliabilityResmi, istikrarlı uç noktalarıs bakım gerektirir
Hizmet ŞartlarıTam olarak uyumluToS ve yerel düzenlemeler kontrol
Scale ScalePahalı ölçekYüksek hacimlerde maliyet etkin
Yerler API küçük ölçekli, üretim-kırık uygulamalar için en iyi seçimdir. Yararlanma, büyük veri setlerine ihtiyacınız olduğunda, tam inceleme metnine veya API maliyetleri yasaklandığında daha maliyetlidir.

Google Maps URL Structure

Google Maps URL modellerini anlamak bir scraper inşa etmek için önemlidir. İki ana giriş noktası vardır:

Arama Sonuçları

Google Maps arama sonuçları erişilebilir:

# Browser URL format
https://www.google.com/maps/search/restaurants+near+new+york
# URL parameters for search
https://www.google.com/maps/search/{query}/@{lat},{lng},{zoom}z

Place Details

Bireysel iş sayfaları bu modeli takip eder:

# Place detail URL
https://www.google.com/maps/place/{business+name}/@{lat},{lng},{zoom}z/data=!{place_id}

Bir Google Maps avlayıcı

Google Maps bir JavaScript-heavy uygulamasıdır. Normal Google Arama'nın aksine, basit HTTP talepleri genellikle eksik verileri döndürür. İki yaklaşım var: gömülü JSON verilerini sayfa kaynağından ayırın veya bir kafasız tarayıcı kullanın.

Yaklaşım 1: Gömülü JSON (Faster)

Google Maps sayfaları HTML kaynağında gömülü veri içeriyor. İşte onu nasıl çıkarmak:

import requests
import json
import re
import time
import random
PROXY_URL = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
def search_google_maps(query, location="us"):
    """Search Google Maps and extract business listings."""
    proxies = {"http": PROXY_URL, "https": PROXY_URL}
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
        "Accept-Language": "en-US,en;q=0.9",
        "Accept": "text/html,application/xhtml+xml",
    }
    # Use the search URL format
    search_url = f"https://www.google.com/maps/search/{query.replace(' ', '+')}"
    response = requests.get(
        search_url,
        headers=headers,
        proxies=proxies,
        timeout=20,
    )
    response.raise_for_status()
    # Extract embedded JSON data from the page
    # Google Maps embeds data in a specific pattern
    businesses = []
    # Look for business data patterns in the response
    # The data is typically in a JavaScript variable
    patterns = re.findall(r'\["([^"]+)",null,null,null,null,null,null,null,"([^"]*)"', response.text)
    # Alternative: parse the structured search results
    # Google Maps returns data in protobuf-like JSON arrays
    json_matches = re.findall(r'null,\["([^"]{5,80})"[^]]*?"([^"]*?(?:St|Ave|Rd|Blvd|Dr|Ln)[^"]*?)"', response.text)
    for match in json_matches[:20]:
        businesses.append({
            "name": match[0],
            "address": match[1] if len(match) > 1 else "",
        })
    return businesses
results = search_google_maps("restaurants near Times Square New York")
for b in results:
    print(f"{b['name']} - {b['address']}")

Yaklaşım 2: Headless Browser (More reliable)

Daha güvenilir ekstraksiyon için, JavaScript oluşturan bir kafasız tarayıcı kullanın:

from playwright.sync_api import sync_playwright
import json
import time
PROXY_URL = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
def scrape_maps_with_browser(query):
    """Use Playwright to scrape Google Maps with full JS rendering."""
    with sync_playwright() as p:
        browser = p.chromium.launch(
            headless=True,
            proxy={
                "server": "http://gate.proxyhat.com:8080",
                "username": "USERNAME",
                "password": "PASSWORD",
            },
        )
        page = browser.new_page()
        page.set_extra_http_headers({
            "Accept-Language": "en-US,en;q=0.9",
        })
        # Navigate to Google Maps search
        search_url = f"https://www.google.com/maps/search/{query.replace(' ', '+')}"
        page.goto(search_url, wait_until="networkidle", timeout=30000)
        # Wait for results to load
        page.wait_for_selector('div[role="feed"]', timeout=10000)
        # Scroll to load more results
        feed = page.query_selector('div[role="feed"]')
        for _ in range(5):
            feed.evaluate("el => el.scrollBy(0, 1000)")
            time.sleep(1.5)
        # Extract business data from the results
        businesses = []
        items = page.query_selector_all('div[role="feed"] > div > div > a')
        for item in items:
            name = item.get_attribute("aria-label")
            href = item.get_attribute("href")
            if name and href:
                businesses.append({
                    "name": name,
                    "url": href,
                })
        browser.close()
        return businesses
results = scrape_maps_with_browser("coffee shops in San Francisco")
for b in results:
    print(f"{b['name']}")
    print(f"  {b['url'][:80]}...")
    print()

İş Detayları

Bir işletme URL'leri listesine sahipseniz, her listeden ayrıntılı bilgi alın:

import requests
import re
import json
PROXY_URL = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
def extract_business_details(maps_url):
    """Extract detailed business info from a Google Maps place page."""
    proxies = {"http": PROXY_URL, "https": PROXY_URL}
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
        "Accept-Language": "en-US,en;q=0.9",
    }
    response = requests.get(maps_url, headers=headers, proxies=proxies, timeout=20)
    text = response.text
    business = {}
    # Extract business name
    name_match = re.search(r'

Google Haritalar için Proxy Stratejisi

Google Maps, belirli bir proxy stratejisi gerektiren kendi anti-bot korumalarına sahiptir.

Konut Proxies Neden Gereklidir

Google Maps özellikle veri merkezi IP'leri engelleme konusunda agresiftir. Uygulama, birden fazla API çağrısı aracılığıyla veri tutar ve Google tüm bu istekler boyunca IP'yi çapraz etkiler. Konut temsilcileri evden ProxyHat Temeldir çünkü:

  • IP itibarını, bu Haritalar API çağrılarının uygulanmasının uygulanmasını kontrol ediyor
  • Yere özgü aramalar için şehir düzeyinde geo-targeting destekliyorlar
  • Haritaların beklediği tutarlı seans davranışını koruyorlar

Oturum Yönetimi

Talep başına IP'leri nereye döndüğünü kazırken, Google Maps yapışkan seanslarla daha iyi çalışır:

# For Google Maps, use sticky sessions (same IP for a business detail page)
# ProxyHat supports session-based rotation via the proxy URL
# See docs.proxyhat.com for session configuration
# Rotating IP (for search listings)
ROTATING_PROXY = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
# Sticky session (for individual place pages)
# Same session ID = same IP for the session duration
STICKY_PROXY = "http://USERNAME-session-maps123:PASSWORD@gate.proxyhat.com:8080"

Puan Limiting

Google Maps normal Google Arama'dan daha hızlı taleplere daha duyarlıdır. Bu yönergeleri izleyin:

  • Arama sonucu sayfaları arasında 5-10 saniye bekleyin
  • Bireysel yer sayfası arasında 3-5 saniye bekleyin
  • Limit concurrent requests to avoid burst pattern
  • Sayfalar arasında daha uzun gecikmeler kullanın (8-15 saniye)

Node.js Uygulama

const axios = require('axios');
const { HttpsProxyAgent } = require('https-proxy-agent');
const agent = new HttpsProxyAgent('http://USERNAME:PASSWORD@gate.proxyhat.com:8080');
async function searchGoogleMaps(query) {
  const searchUrl = `https://www.google.com/maps/search/${encodeURIComponent(query)}`;
  const { data } = await axios.get(searchUrl, {
    headers: {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
      'Accept-Language': 'en-US,en;q=0.9',
    },
    httpsAgent: agent,
    timeout: 20000,
  });
  // Extract business names from the response
  const businesses = [];
  const namePattern = /\["([^"]{3,80})",null,null,null,null,null,null,null/g;
  let match;
  while ((match = namePattern.exec(data)) !== null) {
    businesses.push({ name: match[1] });
  }
  return businesses;
}
async function main() {
  const results = await searchGoogleMaps('plumbers in Chicago');
  console.log(`Found ${results.length} businesses:`);
  results.forEach((b, i) => console.log(`${i + 1}. ${b.name}`));
}
main().catch(console.error);

Scaleing Yorumlar at Scale

Google Maps incelemeleri en değerli veri noktaları arasındadır. Her inceleme, inceleme adı, derecelendirme, metin, tarih ve bazen fotoğraflar içerir.

import requests
import re
import json
import time
import random
PROXY_URL = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
def extract_reviews(place_id, num_reviews=50):
    """Extract reviews for a Google Maps place using the internal API."""
    proxies = {"http": PROXY_URL, "https": PROXY_URL}
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
        "Accept-Language": "en-US,en;q=0.9",
    }
    reviews = []
    # Google Maps loads reviews via AJAX with pagination tokens
    # The first page is loaded with the place page
    maps_url = f"https://www.google.com/maps/place/?q=place_id:{place_id}"
    response = requests.get(maps_url, headers=headers, proxies=proxies, timeout=20)
    # Extract review data from embedded JSON
    # Reviews are typically in arrays with rating, text, and author
    review_pattern = re.findall(
        r'"(\d)","([^"]{10,500})"[^]]*?"([^"]{2,50})"',
        response.text
    )
    for match in review_pattern[:num_reviews]:
        reviews.append({
            "rating": int(match[0]),
            "text": match[1],
            "author": match[2],
        })
    return reviews
# Example: extract reviews
reviews = extract_reviews("ChIJN1t_tDeuEmsRUsoyG83frY4")  # Example place ID
for r in reviews[:5]:
    print(f"{'*' * r['rating']} by {r['author']}")
    print(f"  {r['text'][:100]}...")
    print()

Data Structuring and Storage

Organize Google Haritalar verilerini analiz için yapılandırılmış bir format haline getirdi:

import json
import csv
from datetime import datetime
def save_businesses(businesses, output_format="json"):
    """Save scraped business data in structured format."""
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    if output_format == "json":
        filename = f"maps_data_{timestamp}.json"
        with open(filename, "w") as f:
            json.dump(businesses, f, indent=2, ensure_ascii=False)
    elif output_format == "csv":
        filename = f"maps_data_{timestamp}.csv"
        if businesses:
            keys = businesses[0].keys()
            with open(filename, "w", newline="", encoding="utf-8") as f:
                writer = csv.DictWriter(f, fieldnames=keys)
                writer.writeheader()
                writer.writerows(businesses)
    print(f"Saved {len(businesses)} businesses to {filename}")
    return filename

Yasal ve Etik Bakışlar

Google Haritalar verilerini hapsetmek önemli yasal ve etik soruları gündeme getiriyor:

  • Google Hizmet Şartları: Google'ın ToS otomatik kazıyı yasaklamaktadır. Üretim uygulamaları için resmi yerleri API'yi kullanmayı düşünün
  • Data protection: Telefon numaraları ve adresleri gibi iş verileri bazı yargılarda veri koruma düzenlemelerine tabi olabilir
  • Limitleme: Kaynaklarla bile, Google'ın altyapısına saygılı olun. Excessive scraping hizmet kalitesini etkiler
  • Data freshness: Her zaman verilerinizi zamanlayın ve düzenli olarak yenilemeyin, iş bilgisi sık sık değişir
Görev-kritik uygulamalar için, resmi yerleri API'yi inceleme metinleri gibi ek alanlar için hedef alan veriler için bir araya getirmeyi düşünün. Bu hibrit yaklaşım veri tamlığı ile uyumludur.

Web'de daha iyi uygulamaları kazımak için, bizi gör Web scrapingants için tam kılavuzVe bloklardan kaçınmayı öğren Anti-blocking rehberi. ProxyHat Belgeleri yapılandırma detayları için.

Başlamaya hazır mısınız?

148+ ülkede 50M+ konut IP'sine AI destekli filtreleme ile erişin.

Fiyatlandırmayı GörüntüleKonut Proxy'leri
← Bloga Dön