scrape google shopping

Google Shopping’i kazımak, Google’ın alışveriş sonuçlarından geniş ölçekte yapılandırılmış ürün verileri (başlıklar, fiyatlar, satıcılar, puanlar ve gönderim notları) toplamaktır. Bu sonuçlar yoğun bir şekilde korunduğu ve yerelleştirildiği için, bunu güvenilir bir şekilde yapmak, tek bir bağlantıda tek bir kazıyıcı yerine IP’lerinin döndürülmesini ve doğru coğrafi hedeflemeyi gerektirir.

Bu kılavuz ilk koddur. Coğrafi hedefli istekleri, ülkeye özgü proxy’ler üzerinden yönlendirmeyi, Google’ın kasıtlı olarak gizlediği ürün kartlarını ayrıştırmayı, sayfalandırmayı, yeniden denemeyi ve hız sınırlarında beklemeyi, izin iletişim kutusu yönetimiyle headless bir tarayıcı geri dönüşünü, CSV dışa aktarımıyla temiz bir veri modelini, bir fiyat geçmişi izleyicisini ve bir izleme programını kapsar. Ayrıca anti-bot gerçekliği, kendin yap kazıyıcı ile ücretli SERP API arasındaki denge ve yasal sınırların nerede olduğu konusunda da dürüst davranıyor.

DataImpulse, 195 ülkede 90 milyondan fazla konut, mobil ve veri merkezi IP adresi sunan etik bir proxy sağlayıcısıdır. Süresi dolmayan trafiğe sahip GB başına 1 dolardan başlayan bir kullandıkça öde modeli kullanır ve web kazıma, reklam doğrulama, fiyat izleme, pazar araştırması ve çoklu hesap yönetimi için kullanılır.

Temel Bilgiler

  • Yerelleştirilmiş fiyatlandırma: Google Shopping’i doğru bir şekilde kazımak için gl ve hl parametrelerini ayarlamanız ve istekleri hedef ülkede bir IP aracılığıyla yönlendirmeniz gerekir; çünkü fiyatlar, satıcılar ve stok durumu bölgeye göre farklılık gösterir.
  • En iyi proxy türü: algılamayı geçen gerçek tüketici IP’leri kullanan dönen konut proxy’leri.
  • Fiyat: GB başına 1 dolardan başlayan fiyatlarla, kullandıkça öde, süresi dolmayan trafik ve abonelik yok.
  • Kapsam: 195 ülkede 90 milyondan fazla etik kaynaklı IP’ler.
  • Güvenilirlik: %99,51 başarı oranı, G2’de 5 üzerinden 4,8 puan aldı.
  • Protokoller ve hedefleme: Ülke hedefleme dahil HTTP, HTTPS ve SOCKS5.
Google Shopping ürün verilerini toplama

Google Shopping’ten hangi verileri çıkarabilirsiniz?

Google Shopping, fiyatlandırma ve pazar araştırması için yararlı olan çeşitli yapılandırılmış alanlarla ürün listelemelerini sunar. Her sonuç genellikle ayıklayabileceğiniz ve satırlara normalleştirebileceğiniz tutarlı bir dizi nitelik taşır.

  • Ürün detayları: başlık, açıklama pasajı, marka, model ve ürün resmi URL.
  • Fiyat: listelenen fiyat, para birimi ve bazen satıcılar arasındaki fiyat aralığı.
  • Satıcı: satıcı adı ve ürün detay sayfasında aynı ürünü sunan rakip satıcıların listesi.
  • Derecelendirmeler ve incelemeler: mevcut olduğunda toplam yıldız derecelendirmesi ve inceleme sayıları.
  • Kullanılabilirlik ve nakliye: bölgeye göre değişen stok durumu ve nakliye notları.

Google düzenini güncellediğinde tam alanlar değişir, bu nedenle herhangi bir ayrıştırıcının eksik değerleri ve değişen işaretlemeyi tolere etmesi gerekir. Bir derecelendirmenin veya satıcının her zaman mevcut olduğunu varsaymak yerine, her alanı isteğe bağlı olarak değerlendirin ve türleri çıkardıktan sonra doğrulayın. Aynı ürün farklı ülkelerde farklı fiyatlarda görünebileceğinden, şemanızı daha sonra coğrafyaya odaklanmak yerine başlangıçtan itibaren bir (ürün, ülke, zaman damgası) anahtarı etrafında planlayın.

Google Shopping’e coğrafi hedefli bir isteği nasıl gönderirsiniz?

Alışveriş sekmesi bayrağı artı yerel parametrelerle Google’ın arama uç noktasına ulaşıp ardından gerçek bir müşterinin göndereceği aynı IP ve parametre sinyallerini okuyarak coğrafi hedefli bir istek gönderirsiniz. En önemli iki parametre güzel (örneğin ülke gl=de Almanya için) ve selam (arayüz dili, örneğin hl=de). Üçüncü kullanışlı olanı ise konum-style terimini sorgu bağlamına eklersiniz, ancak güzel artı IP eşleşen bir çıkış işin çoğunu yapar.

Parametreleri tek başına ayarlamak yeterli değildir, çünkü Google aynı zamanda hangi fiyatların ve satıcıların gösterileceğine karar vermek için IP isteğini de okur. Aşağıdaki minimum istek, gerçekçi başlıklar ve yerel ayar çifti gönderir. Bir IP katmanı eklemeden önce temel çağrıyı görebilmeniz için kasıtlı olarak proxy’den kaldırılmıştır.

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

Sakla Kabul-Dil başlık şununla hizalandı: selam. İngilizce dil başlığıyla talep edilen Almanca fiyat sayfası, hem doğal olmayan görünen hem de yanlış para birimini döndürebilen bir uyumsuzluktur. Ölçeği büyüttüğünüzde, bu temel işlev yerel ayarın belirlendiği tek yer haline gelir ve bu da her aşağı yönlü çağrının tutarlı olmasını sağlar.

İstekleri ülke hedefli proxy’ler aracılığıyla nasıl yönlendirirsiniz?

İşaret ederek ülke hedefli bir proxy üzerinden yönlendirilirsiniz istekler tek bir ağ geçidinde ve hedef ülkeyi proxy kullanıcı adına kodlamak. DataImpulse ile ağ geçidi gw.dataimpulse.com:823ve ekleme __cr.us veya __cr.de kullanıcı adınıza çıkış ülkesini seçer. Ülke hedefleme taban fiyata dahildir; eyalet, şehir, ZIP ve ASN hedefleme ise ücretli eklentilerdir. Proxy kimlik doğrulaması sizin için yeniyse, kılavuzumuz proxy kimlik doğrulaması kullanıcı adı ve şifre mekaniğini derinlemesine kapsar.

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

Önemli disiplin, proxy ülkeyi değiştirmek ve güzel/selam birlikte eşleştirin. Pazarlar arası bir fiyat karşılaştırması oluşturmak için, bir ülke listesinin üzerinden geçin ve IP çıkışını ve yerel ayarı aynı adımda tutun; böylece her yanıt tek, tutarlı bir müşteri konumunu yansıtır.

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, yönetilen bir kazıma hizmeti değil, IP katmanını sağlar; böylece kazıyıcının kendisine sahip olursunuz. Dönen konut proxyleri gerçek tüketici cihazlarından geldikleri için burada her zamanki gibi uygunlar; veri merkezi proxy’leri daha ucuzdur ancak işaretlemesi daha kolaydır ve mobil proxy’ler En zorlu hedefler için taşıyıcı sınıfı IP’leri taşıyın.

Google Shopping ürün kartlarını nasıl ayrıştırırsınız?

Ürün kartlarını hoşgörülü bir HTML kitaplığıyla ayrıştırırsınız ve kırılgan derin seçiciler yerine sabit metin kalıplarına bağlanırsınız çünkü Google’ın sınıf adları karmaşıktır ve sık sık değişir. Bugün tarayıcınızın geliştirme araçlarından kopyaladığınız herhangi bir seçici birkaç hafta içinde bozulabilir; bu nedenle, ayrıştırıcıyı bir düzen değişikliğinde çökmek yerine incelikle bozulacak şekilde oluşturun.

Sağlam bir yaklaşım, her aday kartı okur, başlığı ve görseli etiket yapısından alır ve para birimine duyarlı bir normal ifadeyle fiyatı çıkarır. Aşağıdaki seçiciler garanti değil, gerçekçi örneklerdir; bunları güncellemeyi ve normal ifadeyi güvenilir geri dönüşünüz olarak tutmayı bekliyoruz.

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

Gizlenmiş işaretleme burada norm olduğundan, bazı ekipler bunun yerine işlenmiş bir DOM’a yönelir. Statik HTML’yi ayrıştırma ile işlenmiş sayfaları ayrıştırma konusunda daha geniş ödünleşimler için kılavuzumuza bakın. dinamik web sayfalarını kazıma.

Google 429 değerini döndürdüğünde nasıl sayfalara ayırıp geri çekilirsiniz?

Sayfaları ilerleterek sayfalandırırsınız başlangıç sayfa boyutunuza uygun adımlarla dengelenir ve HTTP 429’u (ve boş veya CAPTCHA yanıtlarını) bekleyip yeni bir IP aracılığıyla yeniden denemek için bir sinyal olarak değerlendirerek hız sınırlarından kurtulursunuz. Google tekrarlanan otomatik istekleri agresif bir şekilde kısıtlar, bu nedenle sayfalandırma ve geri alma aynı döngüye aittir.

Bir istekten kart dönmeyene veya sayfa sınırına ulaşana kadar sayfaları yürüyün. Proxy sözlüğünü yeniden okuyarak IP çıkışını sayfalar arasında döndürün ve yalnızca durum koduna güvenmek yerine gövdedeki onay veya CAPTCHA işaretlerini kontrol ederek yumuşak blokları tespit edin.

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

Aşağıdaki yeniden deneme yardımcısı, yeniden denemeleri dağıtarak engellenen çalışanların hepsinin aynı anda yeniden denememesini sağlayan jitter’lı üstel beklemeyi kullanır. Her deneme proxy sözlüğü’i yeniden getirir, böylece dönen bir havuz bir sonraki denemede size yeni bir IP verir.

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

Yeniden denemeler başarılı olsa bile istek oranlarını makul tutun. Sayfalar arasında nazik bir temel gecikme, döndürmeyle birleştiğinde, uzun vadeli istikrar açısından, tekrar denemelere güvenmekten daha fazlasını yapar. hakkındaki notlarımız web kazıma en iyi uygulamaları İlerleme hızı ve başlık hijyenini daha ayrıntılı olarak ele alın.

Engellenen sayfaları headless bir tarayıcıyla nasıl oluşturursunuz?

Basit bir HTTP isteği izin duvarlarına veya JavaScript tarafından oluşturulan içeriğe ulaşmaya devam ettiğinde, sayfayı gerçek bir istemci gibi yürüten headless bir tarayıcıya geri dönün ve DOM’u okumadan önce izin iletişim kutusunu kapatın. Playwright, bağlam başına proxy’leri ve güvenilir beklemeyi desteklediği için iyi bir seçimdir.

Aşağıdaki komut dosyası, Chromium’u ülke hedefli bir DataImpulse proxy aracılığıyla başlatır, Avrupa yerel ayarlarının genellikle gösterdiği çerezi veya izin iletişim kutusunu yönetir, içeriği bekler ve oluşturulan HTML’yi döndürür, böylece onu aynı yere besleyebilirsiniz ayrıştırma_kartları işlev.

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

Başsız bir tarayıcı, ham bir isteğe göre CPU ve bellek açısından daha ağırdır; bu nedenle, bunu, varsayılan yol yerine, gerçekten oluşturulması gereken sayfalar için hedeflenen bir geri dönüş olarak kullanın. Çoğu takım hız için doğrudan HTTP’yi çalıştırır ve yalnızca şu durumlarda Oyun Yazarına iletir: is_blocked ateş etmeye devam ediyor. Yığınınız Python yerine JavaScript ise aynı model Puppeteer için de geçerlidir; Görmek JavaScript ile web kazıma.

Kazınmış verileri nasıl yapılandırır ve dışa aktarırsınız?

Verileri her zaman piyasayı ve yakalama zaman damgasını içeren sabit bir kayıt etrafında yapılandırırsınız, ardından CSV’ye aktarırsınız, böylece çıktının farklılaştırılması, bir elektronik tabloya yüklenmesi veya bir depoya gönderilmesi kolaydır. Bir veri sınıfı size tür ipuçları ve bir satırın net bir tanımını verir.

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’yi yazmak, veri sınıfı alanlarının boşaltılması meselesidir. Ekleme modu ve başlık koruması, zamanlanmış bir işin, yeniden yazmaya gerek kalmadan zaman içinde tek bir dosya olarak büyümesine olanak tanır.

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

Ülkeyi ve zaman damgasını her satırda tutmak, daha sonra bir SKU için bugün hangi pazarın en ucuz olduğu veya fiyatın bu hafta nasıl hareket ettiği gibi soruları yanıtlamanıza olanak tanır. Bu coğrafya ve zaman anahtarı, bir sonraki bölümdeki fiyat geçmişi izleyicinin temelini oluşturuyor.

Google Shopping fiyat geçmişini zaman içinde nasıl takip edersiniz?

Fiyat geçmişini, her bir gözlemi ürün, ülke ve güne göre anahtarlanmış küçük bir veritabanına yerleştirerek izlersiniz; böylece kazıyıcıyı yeniden çalıştırmak, önceki günleri korurken kopyalamak yerine bugünün satırını günceller. SQLite milyonlarca satır için yeterlidir ve sunucuya ihtiyaç duymaz, bu da izleme işinin bağımsız kalmasını sağlar.

Aşağıdaki şemada bileşik benzersiz bir anahtar ve bir ÇATIŞMA ÜZERİNE Üzülmek. Kazıyıcının bir günde iki kez çalıştırılması, ilgili en son fiyatın (ürün, ülke, gün) üzerine yazılır; bunu günler boyunca çalıştırmak, daha sonra grafiğini oluşturabileceğiniz zaman serisini oluşturur.

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

Günler arasında başlıkları eşleştirmek pratikteki en zor kısımdır çünkü Google’ın başlıkları yakalamalar arasında biraz farklılık gösterir. Küçük bir izleme listesi için, alıntılanmış başlığa sabit bir anahtar olarak güvenmek yerine, ham başlıkları yükseltmeden önce kontrol ettiğiniz standart bir ürün kimliğiyle eşleştirin.

Devam eden fiyat takibini nasıl planlıyorsunuz?

Getir-ayrıştır-depola adımlarını tek bir giriş noktasına sararak ve bunu cron ile sabit bir tempoda çalıştırarak izlemeyi planlarsınız, böylece fiyatlar manuel çalıştırmalar olmadan otomatik olarak yenilenir. Günde bir kez çalıştırma, fiyat takibi için makul bir varsayılandır; daha sık çalıştırmalar hem maliyeti artırır hem de çoğu katalog için fazla bir sinyal eklenmeden riski engeller.

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

Daha sonra cron’a kaydedin. Aşağıdaki giriş, monitörü her gün 06:15’te çalıştırır ve hata ayıklama için çıktıyı günlüğe kaydeder; bu, aksi takdirde programlanmış bir kazıyıcının sessizce başarısız olması nedeniyle önemlidir.

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

İşin içine hafif bir titreşim ekleyin (başlangıçta birkaç dakikalık rastgele bir uyku), böylece isteklerin Google’a her gün aynı saat saniyesinde ulaşmaması sağlanır. Çıkış ülkelerini dönüşümlü olarak değiştirin ve daha önce anlatıldığı gibi istekleri hızlandırın ve artan engelleme oranları için günlüğe göz atın; bu, Google’ın savunmasını değiştirdiğinin veya kalıplarınızın çok düzenli hale geldiğinin ilk işaretidir.

Hangi koleksiyon yaklaşımını seçmelisiniz: Kendin Yap, gizli uç noktalar, SERP API veya headless?

Ne kadar kırılganlığa ve mühendisliğe sahip olmak istediğinize ve istek başına ne kadar ödemek istediğinize göre seçim yapın. Tek bir doğru cevap yoktur; dürüst takas, bakım yükü ve anti-bot maruziyetine karşı kontrol ve maliyettir.

Bot karşıtı gerçeklik: Google bu sonuçları hız sınırlama, CAPTCHA’lar, izin duvarları, dönüşümlü işaretleme ve davranışsal sinyallerle aktif olarak savunur. Kendin yap kazıyıcılar periyodik olarak kırılır ve sürekli bakım gerektirir. Proxy’ler ve bekleme blokajları azaltır; onları ortadan kaldırmazlar. Kalıcı olarak engellenemez bir Google kazıyıcı vaat eden herkes aşırı satış yapıyor.

Yaklaşmak Maliyet Kırılganlık Kontrol
DIY HTML ayrıştırma Düşük (yalnızca proxy) Yüksek Tam dolu
Gizli JSON uç noktaları Düşük (yalnızca proxy) Çok yüksek Tam dolu
SERP API Yüksek (talep başına) Düşük Sınırlı
Başsız tarayıcı Orta (bilgi işlem + proxy) Orta Tam dolu

SERP API ve DIY karşılaştırması: Üçüncü taraf bir SERP API, ayrıştırılmış alışveriş sonuçlarını JSON olarak döndürür ve istek başına bir fiyatla, satıcıya bağımlı olarak ve tam olarak ne getirileceği üzerinde daha az kontrolle ayrıştırma ve engellemeyi kaldırma işini sizin için üstlenir. Proxy’ler üzerinde kendin yap kazıyıcının maliyeti istek başına çok daha azdır ve size tam kontrol sağlar, ancak Google değiştiğinde ayrıştırıcı, yeniden denemeler ve bakım size ait olur. DataImpulse’nin nereye uyduğunu açıklığa kavuşturmak gerekirse: bu, bir SERP API veya yönetilen bir kazıma hizmeti değil, bu Kendin Yap yaklaşımlarından herhangi birinin altındaki proxy katmanıdır. Sıfır ayrıştırma işi istiyorsanız SERP API dürüst bir öneridir; Düşük maliyet ve kontrol istiyorsanız ve bir kazıyıcının bakımını yapabiliyorsanız, dönen proxy’lerde DIY daha iyi bir ekonomidir. Gizli JSON uç noktaları daha ucuz olabilir ancak Google bunları bildirimde bulunmaksızın değiştirebileceği veya kaldırabileceği için en kırılgan olanıdır.

Google Shopping’i kazımak yasal ve etik midir?

Herkese açık olarak görülebilen ürün verilerinin kazınması, genellikle özel veya güvenlikli içeriğe erişimden daha düşük risk olarak kabul edilir, ancak bu, kurallardan muaf değildir ve bu yasal bir tavsiye değildir. Google Shopping’teki fiyatlar ve listeler herkese açıktır, ancak bunları nasıl topladığınız ve kullandığınız yine de önemlidir ve özel durumunuzu nitelikli bir danışmanla teyit etmelisiniz.

  • Hizmet şartları: otomatik erişim, telif hakkı veya bilgisayar erişim yasalarından ayrı bir sözleşme konusu olan Google’ın şartlarıyla çelişebilir.
  • Kişisel veriler: ürün listelemeleri genellikle kişisel veriler değildir ancak inceleyenlerin adlarını veya diğer tanımlayıcıları toplamaktan kaçının ve geçerli olduğu yerlerde GDPR’ye uyun.
  • Oran ve yükleme: sorguladığınız hizmetin kalitesini düşürmemek için istek hacmini makul tutun.
  • Veri kullanımı: Telif hakkıyla korunan görsellerin veya açıklamaların toptan yeniden kullanılması, fiyatları gerçek olarak analiz etmekten daha fazla risk taşır.

Koleksiyon tarafında etik, kullandığınız IP’ler ile başlar. DataImpulse, IP’leri tercih eden ve ücret alan kullanıcılardan sağlar, GDPR ile uyumludur ve savunulabilir bir boru hattını destekleyen bir veri işleme anlaşması sunar. Rıza, kaynak kullanımı ve sorumlu uygulama konularının daha kapsamlı ele alınması için kılavuzumuza bakın. etik web kazıma. Etik bir IP kaynağını nazik ilerleme hızıyla ve verilerin dar kapsamlı, gerçeklere dayanan kullanımıyla birleştirirseniz hem yasal hem de itibar riskini düşük tutarsınız.

Google Shopping verilerini almanın yolları

Sık sorulan sorular

Google Shopping’i kazımak için konut proxy’lerine ihtiyacım var mı?

Yerleşik proxy’ler en güvenilir seçimdir çünkü normal trafiğe uyum sağlayan gerçek tüketici IP’leri kullanırlar. Veri merkezi proxy’leri az miktarda çalışabilir ancak daha kolay algılanır ve engellenir.

Google Shopping’ten yerelleştirilmiş fiyatları nasıl alabilirim?

gl ve hl parametrelerini hedef ülkeye ve dile ayarlayın ve isteği, ülke sözdizimini (örneğin, Almanya için __cr.de ile biten bir kullanıcı adı) kullanarak aynı ülkedeki bir IP proxy’si aracılığıyla yönlendirin. Google, hangi fiyatların gösterileceğine karar vermek için hem parametreleri hem de IP isteğini okur.

DataImpulse, API’yi kazıyan bir Google Shopping mi?

Hayır. DataImpulse, yönetilen bir kazıma veya SERP API değil, proxy katmanını (konut, mobil ve veri merkezi IP’ler) sağlar. Kendi kazıyıcınızı veya üçüncü taraf bir aleti IP’lerinin üzerinde çalıştırırsınız.

Google Shopping kazıyıcım neden sürekli engelleniyor?

Google, tek bir IP’den gelen tekrarlanan otomatik istekleri kısıtlar ve CAPTCHA’lar ve izin duvarları sunar. Dönüşümlü konut proxy’leri, gerçekçi başlıklar, 429 yanıtlarındaki üstel bekleme ve makul istek oranları, blokajları önemli ölçüde azaltır, ancak hiçbir yöntem bunları tamamen ortadan kaldırmaz.

SERP API kullanmalı mıyım yoksa kendi kazıyıcımı mı oluşturmalıyım?

SERP API, daha yüksek istek başına maliyet ve daha az kontrolle ayrıştırma ve engellemeyi kaldırma işlerini ortadan kaldırır; bu da bakım gerektirmeyen isteyen ekiplere uygundur. Dönen proxy’lerde kendin yap kazıyıcının maliyeti çok daha azdır ve tam kontrol sağlar, ancak ayrıştırıcıyı korursunuz ve Google değiştikçe yeniden denersiniz.

DataImpulse ne zaman doğru uyum değildir?

Statik ISP proxy’lerine, tamamen yönetilen bir API kazımasına veya bankacılık ve devlet sitelerine erişime ihtiyacınız varsa, DataImpulse doğru araç değildir. Kamuya açık verileri toplamak ve içeriğe erişmek için konut, mobil ve veri merkezi proxy’lerinin dönüşümlü olarak kullanılmasına odaklanır.

Güvenilir proxy’lerle Google Shopping’i kazımaya başlayın

Google Shopping verilerini pazarlar arasında toplamaya hazırsanız, DataImpulse size GB başına bir dolardan başlayan fiyatlarla, ülke hedefleme dahil, değişken ve sabit konut, mobil ve veri merkezi IP’ler sunar. Bir hesap oluşturun ve ilk kazıyıcınızı temiz bir IP havuzundan geçirin.


Share article: