In this Article

scrape google shopping

In this Article

يعني تجريف Google Shopping جمع بيانات منتجات منظمة، مثل البني والأسعار والتقييمات وملاحظات الشحن، من نتائج التسوق في Google على نطاق واسع. ونظراً إلى أن هذه النتائج محمية ومخصصة حسب الموقع بدرجة كبيرة، فإن تنفيذ ذلك بموثوقية تتطلب تغطية عناوين IP واستهدافاً جغرافياً دقيقاً، بدلاً من استخدام أداة تجريف واحدة عبر اتصال واحد.

يشير هذا الدليل إلى الشيفرة. ويشرح موافقته على عدم وجود جغرافيا، والتوجيه عبر بروكسيات خاصة بكل دولة، وتعرف بطاقات المنتجات التي تجعل Google تعتمدها مبهمة عمداً، وتقسيم النتائج إلى صفحات، إذا أراد المحاولة والتراجع عند حدود شرعية، ولا تفويضاً بمتصفح بلا واجهة مع مربع الموافقة، ونموذج منظم البيانات مع تصدير ملف CSV، وتعقباً لسجل التصاميم، وجدولاً للمراقبة. كما يُعرض بوضوح أنظمة مكافحة الروبوتات، والمفاضلة بين أداة تجريف اعتمادها بنفسك وواجهة SERP API مدفوع، والحدود القانونية.

DataImpulse شركة بروكسيات متخصصة ولديها أكثر من 90 مليون عنوان IP سكني ومحمول ومركز بيانات في 195 دولة. ويعتمد نموذج الدفع حسب الاستخدام ابتداءً من 1 دولار لكل جيجابايت مع حركة لا تنتهي صلاحيتها، وأصلها في تجريف العمل والتحقق من الإعلانات وأبحاث السوق وإدارة الاعتماد الآلي.

حقائق أساسية

  • تسعير محلي: لتجريف Google Shopping بشكل دقيق، يجب تخفيض الطلبات المقترنة gl وhl إلى عنوان IP في الدولة بالتفصيل، بحيث يتم تفصيلها وتنوعها من منطقة إلى أخرى.
  • أفضل نوع من البروكسيات: بروكسيات سكنية مستعمله عناوين IP للمستهلكين وتتجاوز.
  • السعر: ابتداءً من 1 دولار لكل جيجابايت، والدفع حسب الاستخدام، مع حركة لا تنتهي صلاحيتها ومن دون اشتراك.
  • التغطية: أكثر من 90 مليون عنوان IP مصدره في 195 دولة.
  • الموثوقية: نجاح النجاح 99.51%، 4.8 من 5 على G2.
  • البروتوكولات والاستهداف: HTTP وHTTPS وSOCKS5، مع تضمين الاستهداف حسب الدولة.
جمع بيانات منتجات Google Shopping

ما الذي يمكنك تجريفه من بيانات Google Shopping؟

تحتوي قوائم Google Shopping على مجموعة من المنتجات التي تحتوي على منظمة مفيدة للتسعير والأبحاث السوقية. وتحمل كل النتيجة المعتادة مجموعة تسقيط من المستندات التي يمكنك نسخها وتوحيدها في صفوف.

  • تفاصيل المنتج: العنوان ومقتطف الوصف والعلامة التجارية والطراز وURL لصورة المنتج.
  • السعر: السعر المعروض والعملة، وأحياناً نطاق سعري لدى البائعين.
  • البائع: اسم التاجر، وفي صفحة تفاصيل المنتج قائمة بالبائعين المنافسين الذين يقدمون السلعة نفسها.
  • التقييمات والمراجعات: متوسط تقييم النجوم وعدد المراجعات عند توفرهما.
  • التوافر والشحن: حالة المخزون وملاحظات الشحن التي تختلف حسب المنطقة.

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

كيف تسألاً التوجهاً جغرافياً إلى Google Shopping؟

سأطلب منك أن تركز بشكل خاص على الوصول إلى نقطة النهاية التي بحثتها Google مع علامة التسوق والمعاملات اللغوية، ثم تسارع إلى مؤشرات IP والمعاملات التي يرسلها الأشخاص الذين يتسوقون بشكل حقيقي. وأهم المعاملات بينهما gl، أي الدولة، مثل gl=de لألمانيا، وhl، أي لغة الواجهة، مثل hl=de. وهناك معامل ثالث مفيد على نمط location يمكنك إدراجه في سياق الاستعلام، لكن gl مع عنوان IP نهاية وفقا للقيادة الأكثر أهمية.

لا يكفي ضبط المعاملات وحده، لأن Google تقرأ عنوان IP للطلب لتحدد التفاصيل ومن يراجعهم. أرسل الطلب البسيط أدناه ترويسات نموذجية وزوج اللغة الاخرى. وقد تُرك عمدا من دون بروكسي كي ترى الاستدعاء الأساسي قبل إضافة IP.

import requests

def build_params(query, country="us", lang="en", start=0):
    return {
        "q": query,
        "tbm": "shop",   # shopping vertical
        "gl": country,    # country bias, e.g. de, gb, fr
        "hl": lang,       # interface language
        "num": 40,        # results per page (soft cap)
        "start": start,   # pagination offset
    }

HEADERS = {
    "User-Agent": (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
        "AppleWebKit/537.36 (KHTML, like Gecko) "
        "Chrome/124.0 Safari/537.36"
    ),
    "Accept-Language": "en-US,en;q=0.9",
}

resp = requests.get(
    "https://www.google.com/search",
    params=build_params("wireless headphones", country="us", lang="en"),
    headers=HEADERS,
    timeout=30,
)
print(resp.status_code, len(resp.text))

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

كيف يمكنك توجيه الطلبات عبر الوكلاء المستهدفين للدولة؟

يمكنك التوجيه عبر وكيل مستهدف للبلد عن طريق الإشارة requests في بوابة واحدة وترميز البلد المستهدف في اسم مستخدم الوكيل. مع DataImpulse البوابة هي gw.dataimpulse.com:823، وإلحاق __cr.us أو __cr.de إلى اسم المستخدم الخاص بك يحدد بلد الخروج. يتم تضمين استهداف الدولة في السعر الأساسي، في حين أن استهداف الولاية والمدينة والرمز البريدي وASN عبارة عن وظائف إضافية مدفوعة الأجر. إذا كانت مصادقة الوكيل جديدة بالنسبة لك، فدليلنا حول مصادقة الوكيل يغطي ميكانيكا اسم المستخدم وكلمة المرور في العمق.

import requests

USER = "your_login"
PASS = "your_password"
GATEWAY = "gw.dataimpulse.com:823"

def proxy_for(country):
    # __cr. pins the exit IP to that country
    cred = f"{USER}__cr.{country}:{PASS}"
    url = f"http://{cred}@{GATEWAY}"
    return {"http": url, "https": url}

resp = requests.get(
    "https://www.google.com/search",
    params=build_params("wireless headphones", country="de", lang="de"),
    headers=HEADERS,
    proxies=proxy_for("de"),
    timeout=30,
)
print(resp.status_code, len(resp.text))

الانضباط المهم هو تبديل البلد الوكيل و gl/hl زوجان معًا. لإنشاء مقارنة الأسعار عبر الأسواق، قم بالتكرار على قائمة البلدان وحافظ على عنوان IP الخاص بالخروج والإعدادات المحلية بشكل متماسك بحيث تعكس كل استجابة موقعًا واحدًا ومتسقًا للمتسوقين.

MARKETS = [
    {"country": "us", "lang": "en"},
    {"country": "de", "lang": "de"},
    {"country": "gb", "lang": "en"},
    {"country": "fr", "lang": "fr"},
]

def fetch_market(query, market):
    c, lang = market["country"], market["lang"]
    return requests.get(
        "https://www.google.com/search",
        params=build_params(query, country=c, lang=lang),
        headers={**HEADERS, "Accept-Language": f"{lang};q=0.9"},
        proxies=proxy_for(c),
        timeout=30,
    )

for m in MARKETS:
    r = fetch_market("wireless headphones", m)
    print(m["country"], r.status_code, len(r.text))

يوفر DataImpulse طبقة IP، وليس خدمة تجريف مُدارة، لذا فأنت تمتلك أداة الكشط نفسها. الدورية وكلاء السكنية هي الملائمة المعتادة هنا لأنها تأتي من أجهزة استهلاكية حقيقية؛ وكلاء مركز البيانات هي أرخص ولكن من الأسهل وضع علامة عليها، و وكلاء المحمول تحمل عناوين IP من فئة الناقل لأصعب الأهداف.

كيف يمكنك تحليل بطاقات منتجات Google Shopping؟

يمكنك تحليل بطاقات المنتج باستخدام مكتبة HTML متسامحة والارتساء على أنماط نصية ثابتة بدلاً من المحددات العميقة الهشة، لأن أسماء فئات Google مبهمة ويتم تدويرها بشكل متكرر. قد يتعطل أي محدد تنسخه من أدوات تطوير متصفحك اليوم في غضون أسابيع، لذا قم ببناء المحلل اللغوي ليتحلل بأمان بدلاً من التعطل عند تغيير التخطيط.

يقرأ النهج القوي كل بطاقة مرشح، ويسحب العنوان والصورة من بنية العلامة، ويستخرج السعر بتعبير عادي مدرك للعملة. المحددات أدناه هي أمثلة واقعية، وليست ضمانات؛ نتوقع تحديثها والاحتفاظ بالتعبير العادي باعتباره احتياطيًا موثوقًا به.

from bs4 import BeautifulSoup
import re

# Currency-aware price matcher: symbol optional, thousands and decimals tolerated.
PRICE_RE = re.compile(r"(?:[$€£]|USD|EUR|GBP)\s?\d[\d.,]*")

def parse_cards(html):
    soup = BeautifulSoup(html, "html.parser")
    rows = []
    # These class names ROTATE; treat them as hints, keep the fallbacks.
    candidates = soup.select("div.sh-dgr__content, div.sh-dlr__list-result, div[data-docid]")
    if not candidates:
        candidates = soup.find_all("div")  # last-resort sweep
    for card in candidates:
        text = card.get_text(" ", strip=True)
        price_match = PRICE_RE.search(text)
        if not price_match or len(text) > 400:
            continue
        img = card.find("img")
        link = card.find("a", href=True)
        rows.append({
            "title": _first_text(card, ["h3", "h4"]),
            "price_raw": price_match.group(0),
            "image": img.get("src") if img else None,
            "url": link["href"] if link else None,
        })
    return rows

def _first_text(card, tags):
    for t in tags:
        el = card.find(t)
        if el and el.get_text(strip=True):
            return el.get_text(strip=True)
    return None

CURRENCY = {"$": "USD", "€": "EUR", "£": "GBP"}

def normalize_price(raw):
    if not raw:
        return None, None
    symbol = next((s for s in CURRENCY if s in raw), None)
    code = CURRENCY.get(symbol, "USD")
    digits = re.sub(r"[^\d.,]", "", raw).replace(",", "")
    try:
        return float(digits), code
    except ValueError:
        return None, code

نظرًا لأن العلامات المبهمة هي القاعدة هنا، فإن بعض الفرق تصل إلى DOM معروض بدلاً من ذلك. للحصول على المفاضلات الأوسع نطاقًا لتحليل صفحات HTML الثابتة مقابل الصفحات المعروضة، راجع دليلنا لـ كشط صفحات الويب الديناميكية.

كيف يمكنك ترقيم الصفحات والتراجع عندما تقوم Google بإرجاع 429؟

يمكنك ترقيم الصفحات من خلال تقدم start يتم الإزاحة في خطوات تتوافق مع حجم صفحتك، ويمكنك تجاوز حدود المعدل من خلال التعامل مع HTTP 429 (والاستجابات الفارغة أو CAPTCHA) كإشارة للانتظار وإعادة المحاولة من خلال عنوان IP جديد. يخنق Google الطلبات التلقائية المتكررة بقوة، لذا فإن ترقيم الصفحات والتراجع ينتميان إلى نفس الحلقة.

انتقل إلى الصفحات حتى لا يُرجع الطلب أي بطاقات أو تصل إلى رأس الصفحة. قم بتدوير عنوان IP الخاص بالخروج بين الصفحات عن طريق إعادة قراءة إملاء الوكيل، واكتشف الكتل الإلكترونية عن طريق التحقق من الموافقة أو علامات CAPTCHA في النص بدلاً من الثقة في رمز الحالة وحده.

BLOCK_MARKERS = ("unusual traffic", "/sorry/", "consent.google", "captcha")

def is_blocked(resp):
    if resp.status_code in (429, 503):
        return True
    body = resp.text.lower()
    return any(m in body for m in BLOCK_MARKERS)

def paginate(query, market, max_pages=5, page_size=40):
    all_rows = []
    for page in range(max_pages):
        params = build_params(query, market["country"], market["lang"],
                              start=page * page_size)
        resp = get_with_retry(
            "https://www.google.com/search",
            params=params, proxies=proxy_for(market["country"]),
        )
        if resp is None:
            break
        rows = parse_cards(resp.text)
        if not rows:
            break  # no more results
        all_rows.extend(rows)
    return all_rows

يستخدم مساعد إعادة المحاولة أدناه التراجع الأسي مع عدم الاستقرار، الذي ينشر عمليات إعادة المحاولة بحيث لا تتم إعادة المحاولة لجميع العمال المحظورين في نفس اللحظة. تقوم كل محاولة بإعادة جلب أمر الوكيل، لذا فإن المجموعة الدوارة تمنحك عنوان IP جديدًا في المحاولة التالية.

import time, random

def get_with_retry(url, params, proxies, max_attempts=4):
    for attempt in range(max_attempts):
        try:
            resp = requests.get(url, params=params, headers=HEADERS,
                                proxies=proxies, timeout=30)
        except requests.RequestException:
            resp = None
        if resp is not None and not is_blocked(resp):
            return resp
        # exponential backoff: 2, 4, 8 seconds, plus jitter
        wait = (2 ** (attempt + 1)) + random.uniform(0, 1.5)
        time.sleep(wait)
    return None  # exhausted; caller decides what to do

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

كيف يمكنك عرض الصفحات المحظورة باستخدام متصفح بدون رأس؟

عندما يستمر طلب HTTP العادي في الوصول إلى جدران الموافقة أو المحتوى الذي يتم عرضه بواسطة JavaScript، ارجع إلى متصفح بدون رأس ينفذ الصفحة مثل عميل حقيقي ويتجاهل مربع حوار الموافقة قبل قراءة DOM. يعد Playwright مناسبًا لأنه يدعم الوكلاء لكل سياق والانتظار الموثوق به.

يقوم البرنامج النصي أدناه بتشغيل Chromium من خلال وكيل DataImpulse الذي يستهدف الدولة، ويتعامل مع ملف تعريف الارتباط أو مربع حوار الموافقة الذي تعرضه اللغات الأوروبية عادةً، وينتظر المحتوى، ويعيد HTML المعروض حتى تتمكن من إدخاله في نفس parse_cards وظيفة.

from playwright.sync_api import sync_playwright

def render_shopping(query, country="de", lang="de"):
    cred_user = f"{USER}__cr.{country}"
    params = f"?q={query.replace(' ', '+')}&tbm=shop&gl={country}&hl={lang}"
    url = "https://www.google.com/search" + params
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        context = browser.new_context(
            proxy={
                "server": "http://gw.dataimpulse.com:823",
                "username": cred_user,
                "password": PASS,
            },
            locale=f"{lang}-{country.upper()}",
            user_agent=HEADERS["User-Agent"],
        )
        page = context.new_page()
        page.goto(url, wait_until="domcontentloaded", timeout=45000)
        _dismiss_consent(page)
        page.wait_for_timeout(2000)
        html = page.content()
        browser.close()
        return html

def _dismiss_consent(page):
    # Consent dialogs vary by locale; try a few common accept buttons.
    for label in ("Accept all", "Alle akzeptieren", "Tout accepter",
                  "I agree", "Accept"):
        try:
            btn = page.get_by_role("button", name=label)
            if btn.count() > 0:
                btn.first.click(timeout=3000)
                page.wait_for_timeout(1000)
                return
        except Exception:
            continue

يعد المتصفح بدون رأس أثقل على وحدة المعالجة المركزية والذاكرة من الطلب الأولي، لذا استخدمه كبديل مستهدف للصفحات التي تحتاج حقًا إلى العرض بدلاً من المسار الافتراضي. تقوم العديد من الفرق بتشغيل HTTP المباشر للسرعة ولا يتم تصعيده إلى Playwright إلا عندما is_blocked يستمر في إطلاق النار. إذا كانت مجموعتك تستخدم JavaScript بدلاً من Python، فسيتم تطبيق نفس النمط مع Puppeteer؛ يرى تجريف الويب باستخدام JavaScript.

كيف يمكنك تنظيم وتصدير البيانات المسروقة؟

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

from dataclasses import dataclass, asdict, field
from datetime import datetime, timezone
import csv

@dataclass
class Offer:
    query: str
    country: str
    title: str | None
    price: float | None
    currency: str | None
    seller: str | None = None
    url: str | None = None
    captured_at: str = field(
        default_factory=lambda: datetime.now(timezone.utc).isoformat()
    )

def to_offers(rows, query, country):
    offers = []
    for r in rows:
        price, currency = normalize_price(r.get("price_raw"))
        offers.append(Offer(
            query=query, country=country, title=r.get("title"),
            price=price, currency=currency, url=r.get("url"),
        ))
    return offers

إن كتابة ملف CSV هي مسألة تفريغ حقول فئة البيانات. يتيح وضع الإلحاق بالإضافة إلى حماية الرأس للمهمة المجدولة زيادة ملف واحد بمرور الوقت دون إعادة كتابته.

import os

def export_csv(offers, path="google_shopping.csv"):
    if not offers:
        return
    fieldnames = list(asdict(offers[0]).keys())
    write_header = not os.path.exists(path)
    with open(path, "a", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        if write_header:
            writer.writeheader()
        for o in offers:
            writer.writerow(asdict(o))

إن الاحتفاظ بالبلد والطابع الزمني في كل صف هو ما يتيح لك لاحقًا الإجابة على أسئلة مثل أي سوق هو الأرخص بالنسبة لـ SKU اليوم، أو كيف تحرك السعر هذا الأسبوع. يعد مفتاح الجغرافيا والوقت هذا هو الأساس لمتتبع تاريخ الأسعار في القسم التالي.

كيف يمكنك تتبع سجل أسعار Google Shopping مع مرور الوقت؟

يمكنك تتبع سجل الأسعار عن طريق إدخال كل ملاحظة في قاعدة بيانات صغيرة مرتبطة بالمنتج والبلد واليوم، لذا فإن إعادة تشغيل أداة الكشط تقوم بتحديث صف اليوم بدلاً من تكراره مع الحفاظ على الأيام السابقة. SQLite يكفي لملايين الصفوف ولا يحتاج إلى خادم، مما يحافظ على وظيفة المراقبة مستقلة بذاتها.

يستخدم المخطط أدناه مفتاحًا فريدًا مركبًا و ON CONFLICT مضايقة. يؤدي تشغيل المكشطة مرتين في يوم واحد إلى استبدال أحدث سعر لذلك (المنتج، البلد، اليوم)؛ يؤدي تشغيله عبر الأيام إلى إنشاء سلسلة زمنية يمكنك رسمها لاحقًا.

import sqlite3

DDL = """
CREATE TABLE IF NOT EXISTS price_history (
    product   TEXT NOT NULL,
    country   TEXT NOT NULL,
    day       TEXT NOT NULL,
    price     REAL,
    currency  TEXT,
    seller    TEXT,
    captured_at TEXT,
    PRIMARY KEY (product, country, day)
);
"""

def init_db(path="prices.db"):
    conn = sqlite3.connect(path)
    conn.execute(DDL)
    conn.commit()
    return conn

def upsert_offers(conn, offers):
    sql = """
    INSERT INTO price_history
        (product, country, day, price, currency, seller, captured_at)
    VALUES (?, ?, ?, ?, ?, ?, ?)
    ON CONFLICT(product, country, day) DO UPDATE SET
        price=excluded.price,
        currency=excluded.currency,
        seller=excluded.seller,
        captured_at=excluded.captured_at;
    """
    for o in offers:
        day = o.captured_at[:10]  # YYYY-MM-DD
        conn.execute(sql, (o.title, o.country, day, o.price,
                           o.currency, o.seller, o.captured_at))
    conn.commit()

def price_trend(conn, product, country, days=14):
    cur = conn.execute(
        """SELECT day, price, currency FROM price_history
           WHERE product = ? AND country = ?
           ORDER BY day DESC LIMIT ?""",
        (product, country, days),
    )
    return cur.fetchall()

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

كيف يمكنك جدولة المراقبة المستمرة للأسعار؟

يمكنك جدولة المراقبة عن طريق تجميع خطوات الجلب والتحليل في نقطة إدخال واحدة وتشغيلها بإيقاع ثابت باستخدام cron، بحيث يتم تحديث الأسعار تلقائيًا دون تشغيل يدوي. يعد التشغيل مرة واحدة يوميًا خيارًا افتراضيًا معقولًا لتتبع الأسعار؛ تؤدي عمليات التشغيل المتكررة إلى زيادة التكلفة ومنع المخاطر دون وجود الكثير من الإشارات الإضافية لمعظم الكتالوجات.

# run_monitor.py
def run_once(queries):
    conn = init_db()
    for query in queries:
        for market in MARKETS:
            rows = paginate(query, market, max_pages=3)
            offers = to_offers(rows, query, market["country"])
            export_csv(offers)
            upsert_offers(conn, offers)
            print(f"{query} / {market['country']}: {len(offers)} offers")
    conn.close()

if __name__ == "__main__":
    WATCHLIST = ["wireless headphones", "mechanical keyboard"]
    run_once(WATCHLIST)

ثم قم بتسجيله في cron. يقوم الإدخال أدناه بتشغيل الشاشة كل يوم في الساعة 06:15 ويسجل المخرجات لتصحيح الأخطاء، وهو أمر مهم لأن المكشطة المجدولة تفشل بصمت.

# crontab -e
# minute hour day month weekday  command
15 6 * * * cd /opt/shopping && /usr/bin/python3 run_monitor.py >> monitor.log 2>&1

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

ما هو أسلوب التجميع الذي يجب عليك اختياره: DIY، أو نقاط النهاية المخفية، أو SERP API، أو مقطوعة الرأس؟

اختر بناءً على مقدار الهشاشة والهندسة التي ترغب في امتلاكها مقابل المبلغ الذي ترغب في دفعه لكل طلب. لا توجد إجابة واحدة صحيحة. والمقايضة الصادقة هي التحكم والتكلفة مقابل عبء الصيانة والتعرض لمكافحة الروبوتات.

حقيقة مكافحة الروبوتات: تدافع Google بشكل فعال عن هذه النتائج من خلال تحديد المعدلات واختبارات CAPTCHA وجدران الموافقة والعلامات المبهمة الدوارة والإشارات السلوكية. سوف تنكسر أي مكشطة يتم صنعها بنفسك بشكل دوري وتحتاج إلى صيانة مستمرة. الوكلاء والتراجع يقللان من الكتل؛ لا يقضون عليهم. أي شخص يعد بمكشطة Google التي يمكن إلغاء حظرها بشكل دائم يبالغ في البيع.

يقترب يكلف هشاشة يتحكم
تحليل HTML DIY منخفض (الوكيل فقط) عالي ممتلىء
نقاط النهاية JSON المخفية منخفض (الوكيل فقط) عالية جدا ممتلىء
واجهة برمجة تطبيقات سيرب عالية (حسب الطلب) قليل محدود
متصفح بلا رأس متوسط ​​(حساب + وكيل) واسطة ممتلىء

واجهة برمجة تطبيقات SERP مقابل DIY: تقوم واجهة برمجة تطبيقات SERP التابعة لجهة خارجية بإرجاع نتائج التسوق التي تم تحليلها بتنسيق JSON وتستوعب أعمال التحليل وإلغاء الحظر نيابةً عنك، بسعر لكل طلب ومع قفل البائع وتحكم أقل في ما يتم جلبه بالضبط. تكلفة أداة استخراج البيانات التي تقوم بها بنفسك على الوكلاء أقل بكثير لكل طلب وتمنحك التحكم الكامل، لكنك تمتلك المحلل اللغوي وعمليات إعادة المحاولة والصيانة عندما يتغير Google. لتوضيح المكان المناسب لـ DataImpulse: إنها طبقة الوكيل الموجودة أسفل أي من أساليب DIY هذه، وليست واجهة برمجة تطبيقات SERP وليست خدمة تجريف مُدارة. إذا كنت لا تريد أي عمل تحليلي، فإن واجهة برمجة تطبيقات SERP هي التوصية الصادقة؛ إذا كنت تريد تكلفة منخفضة وتحكمًا ويمكنك صيانة مكشطة، فإن DIY على الوكلاء الدوارين هو الأفضل من الناحية الاقتصادية. يمكن أن تكون نقاط نهاية JSON المخفية أرخص ولكنها الأكثر هشاشة على الإطلاق، حيث يمكن لـ Google تغييرها أو إزالتها دون إشعار.

Is it legal and ethical to scrape Google Shopping?

يتم التعامل بشكل عام مع عملية استخراج بيانات المنتج المرئية بشكل عام على أنها أقل خطورة من الوصول إلى المحتوى الخاص أو المسور، ولكنها ليست خالية من القواعد، وهذه ليست نصيحة قانونية. الأسعار والقوائم الموجودة على Google Shopping علنية، ولكن كيفية جمعها واستخدامها لا تزال مهمة، ويجب عليك تأكيد حالتك المحددة مع محامٍ مؤهل.

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

من ناحية المجموعة، تبدأ الأخلاقيات بعناوين IP التي تستخدمها. تقوم DataImpulse بمصادر عناوين IP الخاصة بها من المستخدمين الذين يختارون الاشتراك ويتم تعويضهم، وتتوافق مع اللائحة العامة لحماية البيانات، وتقدم اتفاقية معالجة البيانات، التي تدعم خط أنابيب يمكن الدفاع عنه. للحصول على معالجة أكمل للموافقة، وتحديد المصادر، والممارسة المسؤولة، راجع دليلنا لـ تجريف الويب الأخلاقية. اجمع بين مصدر IP أخلاقي والسرعة المهذبة والاستخدام الضيق والواقعي للبيانات، وستحافظ على انخفاض المخاطر القانونية والمخاطر المتعلقة بالسمعة.

طرق سحب بيانات Google Shopping

الأسئلة المتداولة

هل أحتاج إلى وكلاء سكنيين للتخلص من Google Shopping؟

يعد الوكلاء السكنيون الخيار الأكثر موثوقية لأنهم يستخدمون عناوين IP حقيقية للمستهلكين والتي تمتزج مع حركة المرور العادية. يمكن أن تعمل وكلاء مركز البيانات مع حجم خفيف ولكن يتم اكتشافها وحظرها بسهولة أكبر.

كيف يمكنني الحصول على الأسعار المحلية من Google Shopping؟

قم بتعيين معلمات gl وhl على البلد واللغة المستهدفين، وقم بتوجيه الطلب عبر عنوان IP الوكيل في نفس البلد باستخدام بناء جملة البلد، على سبيل المثال، اسم مستخدم ينتهي بـ __cr.de لألمانيا. يقرأ Google كلاً من المعلمات وعنوان IP للطلب لتحديد الأسعار التي سيتم عرضها.

هل DataImpulse عبارة عن واجهة برمجة تطبيقات لاستخلاص البيانات من Google Shopping؟

لا. يوفر DataImpulse طبقة الوكيل (عناوين IP السكنية والمتنقلة ومراكز البيانات)، وليس عملية استخراج مُدارة أو واجهة برمجة تطبيقات SERP. يمكنك تشغيل أداة الكشط الخاصة بك أو أداة تابعة لجهة خارجية أعلى عناوين IP الخاصة بها.

لماذا يستمر حظر مكشطة Google Shopping الخاصة بي؟

تمنع Google الطلبات التلقائية المتكررة من عنوان IP واحد وتخدم اختبارات CAPTCHA وجدران الموافقة. يعمل الوكلاء السكنيون المتناوبون، والترويسات الواقعية، والتراجع المتسارع على 429 استجابة، ومعدلات الطلب المعقولة على تقليل الكتل بشكل كبير، على الرغم من عدم وجود طريقة لإزالتها بالكامل.

هل يجب علي استخدام واجهة برمجة تطبيقات SERP أو إنشاء أداة الكشط الخاصة بي؟

تعمل واجهة برمجة تطبيقات SERP على إزالة التحليل وإلغاء حظر العمل بتكلفة أعلى لكل طلب وتحكم أقل، وهو ما يناسب الفرق التي لا تريد أي صيانة. تكلف أداة الكشط التي يمكنك القيام بها بنفسك على الوكلاء المتناوبين تكلفة أقل بكثير وتمنحك تحكمًا كاملاً، لكنك تحتفظ بالمحلل اللغوي وتعيد المحاولة مع تغير Google.

متى لا يكون DataImpulse مناسبًا؟

إذا كنت بحاجة إلى وكلاء ISP ثابتين، أو واجهة برمجة تطبيقات مُدارة بالكامل، أو الوصول إلى المواقع المصرفية والحكومية، فإن DataImpulse ليست الأداة المناسبة. وهو يركز على تناوب الوكلاء السكنيين والمتنقلين ومراكز البيانات لجمع البيانات العامة والوصول إلى المحتوى.

ابدأ في استخراج Google Shopping باستخدام وكلاء موثوقين

إذا كنت مستعدًا لجمع بيانات Google Shopping عبر الأسواق، فإن DataImpulse يمنحك عناوين IP السكنية والهواتف المحمولة ومراكز البيانات الدورية والثابتة مع تضمين استهداف البلد، بدءًا من دولار واحد لكل جيجابايت. إنشاء حساب وقم بتوجيه مكشطةك الأولى عبر تجمع IP نظيف.


Share article: