لماذا بيانات (سكرابي غوغل)؟
وتحتوي خرائط غوغل على قاعدة البيانات الأكثر شمولا للأعمال التجارية المحلية في العالم. ومع إدراج ما يزيد على ٢٠٠ مليون من الأعمال التجارية، فإنها تشمل الأسماء والعناوين وأرقام الهاتف والمواقع الشبكية والتقديرات والاستعراضات وساعات التشغيل والصور - كلها منظمة وقابلة للبحث.
ويتيح استخراج هذه البيانات من الناحية البرنامجية تطبيقات تجارية قيمة:
- جيل الرصاص: بناء قوائم محددة الأهداف للأعمال التجارية حسب الصناعة والموقع
- التحليل التنافسي: مواقع منافسي الخرائط، وتقديرات، واستعراض المشاعر
- بحوث السوق: فهم كثافة الأعمال، وأنماط التسعير، وتغطية الخدمات حسب المناطق
- المراجعة المحلية للحسابات: تحقق من قوائم أعمالك وقارنها بالمنافسين
- إثراء البيانات: بيانات إدارة المخاطر المؤسسية بمعلومات جديدة عن الأعمال التجارية
This guide covers the technical approaches to extracting Google Maps data using proxies. وللاطلاع على الاستراتيجيات الأوسع نطاقاً لخردة نظام التخطيط الاستراتيجي، انظر اكتملت عملية التخلص من المتفجرات من مخلفات الحرب مع دليل العملاء.
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الاعتبارات القانونية والأخلاقية
وتثير بيانات خرائط غوغل مسائل قانونية وأخلاقية هامة:
- شروط الخدمة: (جوجل) يُحظر الخردة الآلية النظر في استخدام تطبيقات الإنتاج في الأماكن الرسمية
- حماية البيانات: يمكن أن تخضع بيانات الأعمال التجارية، مثل أرقام الهواتف والعناوين، لأنظمة حماية البيانات في بعض الولايات القضائية
- المعدل الذي يحد من: حتى مع المحترفين، كونوا محترمين للبنية التحتية جوجل. الخردة الزائدة تؤثر على نوعية الخدمات
- طفرة البيانات: دائماً ما تدق بياناتك وتعيدها بشكل منتظم مع تغير المعلومات التجارية
وفيما يتعلق بالتطبيقات البالغة الأهمية للبعثات، النظر في الجمع بين الرقم القياسي الموحد للمواقع الرسمية للبيانات الأساسية مع الخردة المستهدفة للميادين التكميلية مثل النص الاستعراضي. ويوازن هذا النهج الهجين الامتثال لإكمال البيانات.
من أجل المزيد من الخردة على الإنترنت دليل كامل لأجهزة التخريد الشبكيوتعلم عن تجنب الكتل في دليل مكافحة القفلإستشارة وثائق الإثبات لتفاصيل التكوين






