استخراج بيانات Google Maps: القوائم التجارية والمراجعات

Learn how to scrape Google Maps for business data including names, addresses, ratings, and reviews. Covers API vs scraping comparison, proxy strategies, and code examples in Python and Node.js.

استخراج بيانات Google Maps: القوائم التجارية والمراجعات

لماذا بيانات (سكرابي غوغل)؟

وتحتوي خرائط غوغل على قاعدة البيانات الأكثر شمولا للأعمال التجارية المحلية في العالم. ومع إدراج ما يزيد على ٢٠٠ مليون من الأعمال التجارية، فإنها تشمل الأسماء والعناوين وأرقام الهاتف والمواقع الشبكية والتقديرات والاستعراضات وساعات التشغيل والصور - كلها منظمة وقابلة للبحث.

ويتيح استخراج هذه البيانات من الناحية البرنامجية تطبيقات تجارية قيمة:

  • جيل الرصاص: بناء قوائم محددة الأهداف للأعمال التجارية حسب الصناعة والموقع
  • التحليل التنافسي: مواقع منافسي الخرائط، وتقديرات، واستعراض المشاعر
  • بحوث السوق: فهم كثافة الأعمال، وأنماط التسعير، وتغطية الخدمات حسب المناطق
  • المراجعة المحلية للحسابات: تحقق من قوائم أعمالك وقارنها بالمنافسين
  • إثراء البيانات: بيانات إدارة المخاطر المؤسسية بمعلومات جديدة عن الأعمال التجارية

This guide covers the technical approaches to extracting Google Maps data using proxies. وللاطلاع على الاستراتيجيات الأوسع نطاقاً لخردة نظام التخطيط الاستراتيجي، انظر اكتملت عملية التخلص من المتفجرات من مخلفات الحرب مع دليل العملاء.

Google Places API vs Scraping

قبل بناء الخردة، النظر في ما إذا كان نظام "جوجل" الرسمي يلبي احتياجاتك.

Google Places API vs Scraping
العواملأماكن العملScraping
التكلفة17 دولارا لكل 000 1 طلب (بعد المستوى الحر)Proxy bandwidth only (~$0.10-0.50 per 1,000 pages)
ميادين البياناتStructured JSON, 20+ fieldsجميع البيانات المرئية بما في ذلك الاستعراضات
حدود المعدلالحدود الزمنية لكل ثاني ويوممحدودة بحجم بركة السباحة
نص الاستعراضما يصل إلى 5 استعراضات ذات صلةAll reviews (with pagination)
الموثوقيةنقاط نهاية رسمية مستقرةصيانة قطع الغيار
مدة الخدمةممتثلة تمامامراجعة الحسابات والأنظمة المحلية
Scaleالكسب في الجدولالفعالية من حيث التكلفة في المجلدات العالية
The Places API is the best choice for small-scale, production-critical applications. والتشويش أكثر فعالية من حيث التكلفة عندما تحتاج إلى مجموعات بيانات كبيرة، أو إلى نص استعراض كامل، أو عندما تصبح تكاليف API باهظة.

Google Maps URL Structure

وفهم خرائط غوغل هو أمر أساسي لبناء الخردة. وهناك مدخلان رئيسيان:

نتائج البحث

ويمكن الاطلاع على نتائج البحث عن خرائط غوغل عن طريق:

# 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 detail URL
https://www.google.com/maps/place/{business+name}/@{lat},{lng},{zoom}z/data=!{place_id}

بناء خريطة غوغل

Google Maps is a JavaScript-heavy application. وخلافاً للبحث المنتظم في غوغل، كثيراً ما ترد الطلبات البسيطة المقدمة من شركة HTTP بيانات غير كاملة. There are two approaches: parsing the embedded JSON data from page source, or using a headless browser.

Approach 1: Parsing Embedded JSON (Faster)

وتتضمن صفحات خرائط غوغل بيانات منظمة مدرجة في مصدر HTML. هنا هو كيفية استخراجه:

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']}")

النهج 2: الحشد العاقل (الأكثر موثوقية)

لاستخراج أكثر موثوقية، استخدام مصفف لا رأس له يجعل جافاسكريت:

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()

Extracting Business details

بمجرد أن يكون لديك قائمة بالأعمال التجارية المُعادية، تُستخرج معلومات مفصلة من كل قائمة:

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'

Proxy Strategy for Google Maps

Google Maps has its own anti-bot protections that require a tailored proxy strategy.

لماذا العملاء المقيمين مطلوبين

Google Maps is particularly aggressive about blocking datacenter IPs. The application loads data through multiple API calls, and Google cross-references the IP across all these requests. وكالة الإقامة ProxyHat ضرورية لأن:

  • يَعْبرونَ آي بي يُدقّقُ سمعةَ بأنّ الخرائط تَدْعو إنفاذ
  • وهي تدعم الأهداف الجيولوجية على مستوى المدينة من أجل البحث عن مواقع محددة
  • إنهم يحافظون على سلوك الدورة المتسق الذي تتوقعه الخرائط

إدارة الدورة

وخلافاً للخردة العادية لنظام تخطيط الموارد في المؤسسة، حيث تتناوب شركاء التنفيذ حسب الطلب، تعمل خرائط جوجل بشكل أفضل مع الدورات الملصقة:

# 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"

الحد الأدنى

Google Maps is more sensitive to rapid requests than regular Google search. متابعة هذه المبادئ التوجيهية:

  • انتظر 5-10 ثواني
  • انتظر 3-5 ثواني بين عدد الصفحات
  • Limit concurrent requests to avoid blast patterns
  • استخدام فترات تأخير أطول للتمهيد للاستعراض (8-15 ثانية بين الصفحات)

Node.js Implementation

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);

Extracting Reviews at Scale

وتعد استعراضات خرائط غوغل من بين أهم نقاط البيانات. ويشمل كل استعراض اسم المستعرض، والتقدير، والنص، والتاريخ، وأحيانا الصور.

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()

هيكل البيانات وتخزينها

(أ) تنظيم بيانات خرائط غوغل المشطوبة في شكل هيكلي للتحليل:

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

الاعتبارات القانونية والأخلاقية

وتثير بيانات خرائط غوغل مسائل قانونية وأخلاقية هامة:

  • شروط الخدمة: (جوجل) يُحظر الخردة الآلية النظر في استخدام تطبيقات الإنتاج في الأماكن الرسمية
  • حماية البيانات: يمكن أن تخضع بيانات الأعمال التجارية، مثل أرقام الهواتف والعناوين، لأنظمة حماية البيانات في بعض الولايات القضائية
  • المعدل الذي يحد من: حتى مع المحترفين، كونوا محترمين للبنية التحتية جوجل. الخردة الزائدة تؤثر على نوعية الخدمات
  • طفرة البيانات: دائماً ما تدق بياناتك وتعيدها بشكل منتظم مع تغير المعلومات التجارية
وفيما يتعلق بالتطبيقات البالغة الأهمية للبعثات، النظر في الجمع بين الرقم القياسي الموحد للمواقع الرسمية للبيانات الأساسية مع الخردة المستهدفة للميادين التكميلية مثل النص الاستعراضي. ويوازن هذا النهج الهجين الامتثال لإكمال البيانات.

من أجل المزيد من الخردة على الإنترنت دليل كامل لأجهزة التخريد الشبكيوتعلم عن تجنب الكتل في دليل مكافحة القفلإستشارة وثائق الإثبات لتفاصيل التكوين

¿Listo para empezar?

Accede a más de 50M de IPs residenciales en más de 148 países con filtrado impulsado por IA.

Ver preciosProxies residenciales
← Volver al Blog