2026'da Python ile Target.com'u Kazıyın: Gerçekten İşe Yarayan 3 Yöntem

Son güncelleme: April 28, 2026
2026'da Python ile Target.com'u Kazıyın: Gerçekten İşe Yarayan 3 Yöntem

Target.com, pratikte kazımaya kalkana kadar basit görünen sitelerden biri. Daha önce Requests ve BeautifulSoup ile hızlı bir Python betiği yazıp bir Target ürün sayfasına istek attıktan sonra fiyat alanınızın None döndüğünü gördüyseniz, yalnız değilsiniz.

Büyük perakende sitelerinde kazıma yöntemlerini test eden biri olarak rahatlıkla söyleyebilirim: Target, en zorlayıcı siteler arasında sürekli üst sıralarda yer alıyor. Aylık 208–280 milyon ziyaret alan bu site; fiyatlar, puanlar, stok bilgisi ve yorumlar gibi ürün verileri açısından tam bir hazine. Ancak React tabanlı istemci tarafı render ile Akamai’nin bot tespiti birleşince, basit yaklaşım neredeyse anında duvara tosluyor. Yine de Python ile gerçekten çalışan üç yöntem var. Her birini tek tek anlatacağım, ilk denemenin neden genelde bozulduğunu açıklayacağım ve Python’a değmeyecek kadar zahmetli olduğunda kullanabileceğiniz kodsuz bir kestirme yol göstereceğim.

Target.com’a İlk Python Kazımanız Neden None Döndürüyor?

Çözümlere geçmeden önce sorunu netleştirelim. Yeni başlayanların yazdığı kod çoğu zaman şöyle oluyor:

import requests
from bs4 import BeautifulSoup

url = "https://www.target.com/p/some-product/-/A-12345678"
response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
soup = BeautifulSoup(response.text, "html.parser")

price = soup.select_one('[data-test="current-price"]')
print(price)  # None

Çıktı? None. Her defasında.

Sorun kodunuzda bir hata olması değil. Target’tan requests.get() ile gelen HTML aslında bir iskelet: “gerçek sayfayı oluşturmak için bu JavaScript’i yükle” diyen bir React kabuğu. Ürün fiyatları, puanlar, yorumlar ve stok durumu ilk sayfa yüklemesinden sonra JavaScript tarafından ekleniyor. Python’un Requests kütüphanesi JavaScript çalıştırmadığı için bu öğeler yanıtta hiç yer almıyor.

Forumlar, bu duvara çarpan geliştiricilerle dolu. Bir ScrapeOps analizi bunu açıkça söylüyor: “Bir öğe None olarak görünüyorsa bunun nedeni Javascript ile oluşturulmuş olmasıdır ve requests, Javascript ile render edilen HTML’yi çekemez.” Bir Crawlbase eğitimi de bunu doğruluyor: “Target URL’sine HTTP isteği gönderdiğinizde, HTML yanıtı anlamlı veri içermez.”

JavaScript sorununu çözseniz bile bir katman daha var: Target’ın Akamai bot tespiti, TLS el sıkışmanızı parmak iziyle tanıyor ve tek bir HTML baytı bile alışveriş edilmeden Python’un requests kütüphanesini işaretliyor. Buna birazdan daha ayrıntılı değineceğim.

Target.com’u Python ile Kazımak Neden Bu Kadar Zor?

Target sadece “JavaScript kullanan bir site” değil. Katmanlı bir savunma sistemi var ve doğru kazıma yöntemini seçmek de bu katmanları anlamaktan geçiyor.

JavaScript ile Render Edilen Ürün Verisi

Target.com, React üzerinde çalışıyor. Gerçek bir tarayıcıda bir ürün ya da arama sayfasını açtığınızda şu olur:

  1. Sunucu minimal bir HTML kabuğu gönderir
  2. JavaScript paketleri yüklenip çalışır
  3. Frontend, Target’ın dahili Redsky API’sine istek atar
  4. Ürün verileri (fiyatlar, puanlar, görseller, stok durumu) DOM’a işlenir

2–4. adımları atlarsanız — ki requests.get() tam olarak bunu yapar — boş bir sayfa görürsünüz. GroupBWT bunu ölçümlemiş: statik HTTP istekleri Target’taki mevcut verinin yaklaşık yüzde 30’unu yakalıyor. Kalan yüzde 70 için JavaScript çalıştırmak ya da API’ye erişmek gerekiyor.

Arama sonuçları sayfaları daha da zorlayıcı. İlk HTML’de yalnızca birkaç ürün görünür; geri kalanlar aşağı kaydırdıkça yüklenir.

Target’ın Bot Karşıtı Savunmaları: “Proxy Kullan” Demekten Fazlası

Birçok kazıma rehberi bot karşıtı önlemleri “proxy kullan yeter” diye geçiştirir. Oysa Target’ın savunmaları biraz daha detaylı anlatılmayı hak ediyor.

TLS parmak izi alma (en önemlisi). HTTPS el sıkışması sırasında istemciniz, TLS sürümünüzü, şifre takımlarınızı, eklentilerinizi ve eliptik eğrilerinizi açığa çıkaran bir “Client Hello” paketi gönderir. Bunlar JA3 parmak izine dönüştürülür. Python’un requests kütüphanesi, anti-bot veritabanlarının anında işaretlediği sabit, bilinen bir hash8d9f7747675e24454cd9b7ed35c58707 — üretir. Chrome 16 adet dikkatle sıralanmış şifre takımı ve GREASE değerleri gönderirken; Python tarayıcı dışı sırayla 60’tan fazla öğe gönderir. Engelleme, herhangi bir HTTP içeriği alışveriş edilmeden önce gerçekleşir.

IP itibarı puanlaması. Akamai, IP’leri güven katmanlarına ayırır. Scrapfly’ın ifadesiyle veri merkezi IP’leri “büyük olasılıkla botlar tarafından kullanılacakları için ciddi negatif güven puanları” alır. Residential IP’ler ise pozitif puan alır. Özellikle Target’ta veri merkezi IP aralıkları anında işaretlenir.

JavaScript parmak izi alma. Akamai, JS motorunuzun özelliklerini, donanım kapasitenizi, işletim sistemi verilerini, yazı tiplerini, eklentileri ve davranış verilerini (yazma hızı, fare hareketi, tıklama zamanlaması) toplayan JavaScript enjekte eder. Bu, _abck çerezini — yani durum taşıyan bir parmak izi belirtecini — üretir. Geçerli bir _abck olmadan istekler engellenir.

Hız sınırı. Target, IP başına dakikada yaklaşık 30–60 istek seviyesinde 429 hatalarını tetikler. Bazı kullanıcılar, aslında “Pardon Our Interruption” engelleme sayfasını içeren aldatıcı 200 OK yanıtları aldıklarını bildiriyor — bu da otomatik tespiti daha da zorlaştırıyor.

ScrapeOps, Target’ı genel zorlukta 7/10 olarak değerlendiriyor. Akamai aşımı ise özel olarak 9/10 olarak puanlanıyor.

Python ile Target.com Kazımak İçin 3 Yöntem (Yan Yana Karşılaştırma)

Tüm uygulanabilir üç yaklaşımı tek yerde karşılaştıran içerik pek yok. İşte dürüst değerlendirme:

KriterRequests + BS4Selenium / PlaywrightRedsky API
JS render desteği❌ Hayır✅ Evet✅ Evet (JSON)
Öğe başına hız⚡ ~0,5–1 sn🐢 ~5–10 sn⚡ ~0,5–1 sn
Bot karşıtı risk⚠️ Yüksek (TLS parmak izi)⚠️ Orta⚠️ Orta (kimlik anahtarları değişebilir)
Kurulum karmaşıklığıDüşükOrtaOrta-Yüksek (tersine mühendislik)
Veri tamlığı~%30 (yalnızca statik HTML)~%95 (tam sayfa)~%90 (yapısal JSON)
En iyi kullanımStatik meta veri, __TGT_DATA__Tam ürün sayfaları, yorumlarÖlçekte toplu ürün verisi

Şimdi her birine bakalım.

Yöntem 1: Python Requests ve BeautifulSoup ile Target.com Kazımak

Bu yöntem, JavaScript ile render edilen fiyatları arama sayfalarında vermez. Ama hızlıdır, hafiftir ve nereye bakacağınızı bilirseniz beklediğinizden fazlasını çıkarır.

İşin püf noktası şu: Target, bazı ürün verilerini <script> etiketlerine gömüyor. Bu etiketlerde __PRELOADED_QUERIES__ içeren bir __TGT_DATA__ değişkeni bulunuyor. Bu JSON bloğu; ürün adlarını, açıklamaları, özellikleri ve bazen tekil ürün sayfalarında fiyatları içeriyor. Arama sonucu HTML’sinden ürün başlıklarını ve URL’leri de çıkarabilirsiniz.

Adım 1: Python Ortamınızı Kurun

Bir proje klasörü oluşturup bağımlılıkları yükleyin:

mkdir target-scraper && cd target-scraper
python -m venv venv
source venv/bin/activate  # Windows'ta: venv\Scripts\activate
pip install requests beautifulsoup4 curl_cffi

Burada standart requests yerine curl_cffi kullanın. Bu kütüphane tarayıcı TLS parmak izlerini taklit eder; Target’ta engelleri aşmada en büyük farkı yaratan şey budur. Ölçümler, standart requests ile yalnızca yüzde 12 olan bot karşıtı aşma oranının curl_cffi ile yüzde 92 olduğunu gösteriyor — yani 15 kat iyileşme.

Adım 2: Target Arama Sonuçlarını Kazıyın

Target’ın arama URL biçimi basit: https://www.target.com/s?searchTerm={keyword}

from curl_cffi import requests as cureq
from bs4 import BeautifulSoup
import time, random

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": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
}

url = "https://www.target.com/s?searchTerm=bluetooth+headphones"
resp = cureq.get(url, headers=headers, impersonate="chrome124")
soup = BeautifulSoup(resp.text, "html.parser")

# Ürün kartları bu data-test özniteliğini kullanır
cards = soup.find_all("div", {"data-test": "@web/site-top-of-funnel/ProductCardWrapper"})
for card in cards:
    link_tag = card.find("a")
    title = link_tag.get_text(strip=True) if link_tag else "N/A"
    href = "https://www.target.com" + link_tag["href"] if link_tag and link_tag.get("href") else "N/A"
    print(f"{title} — {href}")

Ürün adlarını ve URL’leri alırsınız. Fiyatlar mı? Bu HTML’den büyük olasılıkla değil. Bu beklenen bir şey.

Adım 3: Ürün Sayfalarından Gömülü JSON Verisini Çekin

Tekil ürün sayfaları, __TGT_DATA__ script etiketinde daha zengin veri gömer:

import re, json

product_url = "https://www.target.com/p/some-product/-/A-12345678"
resp = cureq.get(product_url, headers=headers, impersonate="chrome124")
soup = BeautifulSoup(resp.text, "html.parser")

# __TGT_DATA__ script'ini bulun
scripts = soup.find_all("script")
for script in scripts:
    if script.string and "__TGT_DATA__" in script.string:
        # Script içeriğinden JSON'u çıkarın
        match = re.search(r'__TGT_DATA__\s*=\s*({.*?});?\s*$', script.string, re.DOTALL)
        if match:
            tgt_data = json.loads(match.group(1))
            # JSON yapısında ürün ayrıntılarına gidin
            queries = tgt_data.get("__PRELOADED_QUERIES__", {})
            # Ürün verisi içeride gömülüdür — yapı sayfaya göre değişir
            print(json.dumps(queries, indent=2)[:500])  # Yapının önizlemesi

__TGT_DATA__ içindeki JSON yapısı; ürün adlarını, açıklamaları, özellikleri ve çoğu zaman fiyat bilgisini içerir. İç içe yapı sayfaya göre değiştiği için, çıktıyı inceleyip ona göre ilerlemeniz gerekir.

Adım 4: Sayfalama ile Devam Edin

Target’ın arama sayfası sayfalama için Nao parametresini kullanır. 1. sayfa Nao=0, 2. sayfa Nao=24, 3. sayfa Nao=48 şeklinde ilerler (24’er artar):

for page in range(0, 120, 24):  # İlk 5 sayfa
    paginated_url = f"https://www.target.com/s?searchTerm=bluetooth+headphones&Nao={page}"
    resp = cureq.get(paginated_url, headers=headers, impersonate="chrome124")
    # Ayrıştırıp veriyi çıkarın...
    time.sleep(random.uniform(2, 5))  # Kibar olun

Adım 5: Kazıdığınız Veriyi Kaydedin

import csv

with open("target_products.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["title", "url", "price", "description"])
    writer.writeheader()
    for product in products:
        writer.writerow(product)

Elde edeceğiniz veriler: Ürün başlıkları, URL’ler, açıklamalar ve gömülü meta veriler. Güvenilir biçimde alamayacaklarınız: Arama sonuç sayfalarındaki dinamik fiyatlar ve puanlar. Bunlar için Yöntem 2 veya 3 gerekir.

Yöntem 2: Selenium veya Playwright ile Target.com Kazımak

Headless bir tarayıcı JavaScript’i render eder, dinamik içeriği yükler ve gerçek kullanıcı davranışını taklit eder. Fiyatları, puanları ve yorumları almanızı sağlayan yöntem budur.

Selenium ile Playwright karşılaştırmasına gelince: Playwright benimsenmede Selenium’u geçti — 2026’da yüzde 45,1’e karşı yüzde 22,1 — ve ölçümler 2,5 kat daha hızlı olduğunu gösteriyor (20 sayfa için 11 sn’ye karşı 28 sn). Burada Selenium’u göstereceğim çünkü topluluğu daha büyük ve eğitim içeriği daha fazla; ancak sıfırdan başlıyorsanız Playwright daha iyi seçim.

Adım 1: Selenium ve ChromeDriver’ı Yükleyin

pip install selenium webdriver-manager

webdriver-manager, ChromeDriver sürümünü otomatik yönetir — artık “ChromeDriver version mismatch” derdi yok:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager

options = Options()
options.add_argument("--headless=new")
options.add_argument("--window-size=1920,1080")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("--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")

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)

Adım 2: Target Sayfalarını Yükleyin ve İçeriği Bekleyin

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver.get("https://www.target.com/s?searchTerm=bluetooth+headphones")

# Ürün kartlarının render edilmesini bekle (explicit wait > time.sleep)
WebDriverWait(driver, 15).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, '[data-test="product-title"]'))
)

Açık beklemeler kritik önemdedir. time.sleep(10) hızlı yüklemelerde vakit kaybettirir, yavaş yüklemelerde ise yetmez — yani iki durumda da kötü. WebDriverWait, öğe görünene ya da süre dolana kadar her 500 ms’de bir kontrol eder.

Adım 3: Tüm Ürünleri Yüklemek İçin Sayfayı Kaydırın

Target, ürünleri kaydırdıkça tembel yükleme ile getirir. Kaydırmazsanız tam sayfa yerine 4–5 ürün görürsünüz:

import time

last_height = driver.execute_script("return document.body.scrollHeight")
for _ in range(10):
    driver.execute_script("window.scrollBy(0, 300);")
    time.sleep(1.5)
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

ScrapeOps testleri bunu doğruluyor: 1,5 saniyelik gecikmeyle 10 kaydırma turu, kaydırmasız 4–5 ürün yerine 8+ ürün getiriyor. Her kaydırma adımı insan davranışını taklit etmek için 200–300 px olmalı.

Adım 4: Render Edilmiş Sayfadan Ürün Verisini Çekin

products = []
cards = driver.find_elements(By.CSS_SELECTOR, '[data-test="@web/site-top-of-funnel/ProductCardWrapper"]')

for card in cards:
    try:
        title = card.find_element(By.CSS_SELECTOR, '[data-test="product-title"]').text
    except:
        title = "N/A"
    try:
        price = card.find_element(By.CSS_SELECTOR, '[data-test="current-price"]').text
    except:
        price = "N/A"
    try:
        link = card.find_element(By.CSS_SELECTOR, 'a[href*="/p/"]').get_attribute("href")
    except:
        link = "N/A"

    products.append({"title": title, "price": price, "link": link})

for p in products:
    print(f'{p["title"]} — {p["price"]}')

Target için temel data-test seçicileri (2026 doğrulandı):

Veri AlanıSeçici
Ürün kartıdata-test="@web/site-top-of-funnel/ProductCardWrapper"
Ürün başlığıdata-test="product-title"
Güncel fiyatdata-test="current-price"
Puan değeridata-test="rating-value"
Puan sayısıdata-test="rating-count"

Adım 5: Ürün Yorumlarını Kazıyın (Bonus)

Tekil ürün sayfalarına gidin, yorumlar bölümüne kadar kaydırın ve yorum verisini çıkarın:

from bs4 import BeautifulSoup

driver.get("https://www.target.com/p/some-product/-/A-12345678")
# Yorumları yüklemek için aşağı kaydırın
for _ in range(5):
    driver.execute_script("window.scrollBy(0, 500);")
    time.sleep(2)

soup = BeautifulSoup(driver.page_source, "html.parser")
reviews = soup.find_all("div", {"data-test": "review-card--text"})
for review in reviews:
    print(review.get_text(strip=True)[:100])

Yorumlar Bazaarvoice entegrasyonu üzerinden yüklenir ve sayfalama (51 sayfaya kadar), yeniliğe göre sıralama ve yalnızca fotoğrafları gösteren filtreyi destekler. ScrapeOps ölçümleri Selenium ile öğe başına yaklaşık 5,1 saniye gösteriyor.

İşiniz bitince tarayıcıyı kapatmayı unutmayın:

driver.quit()

Yöntem 3: Redsky API Kullanarak Target.com Kazımak

Target’ın frontend’i her şeyi redsky.target.com üzerindeki dahili bir API’den çeker. Python ile bunu doğrudan çağırabilirsiniz — HTML ayrıştırma yok, tarayıcı yok, JavaScript render etme yok. Yanıt; fiyat, puan, yorum, görsel, stok durumu, teslimat, teknik özellikler ve varyantları kapsayan 40’tan fazla alan içeren temiz bir JSON’dur. Toplu ürün verisi için bu, açık ara en hızlı ve en güvenilir yöntemdir.

Adım 1: Chrome DevTools ile Redsky API’yi Keşfedin

Birçok eğitim bu kısmı tamamen atlar. API’yi kendiniz bulmanın yolu şöyle:

  1. Chrome’da herhangi bir Target ürün sayfasını açın
  2. DevTools’u (F12) açın → Network sekmesi
  3. Fetch/XHR ile filtreleyin
  4. Sayfayı yenileyin
  5. redsky.target.com veya redsky.a]target.com adresine giden istekleri bulun
  6. Birine tıklayın — Request URL ve Headers bölümünü inceleyin

Şuna benzer bir şey göreceksiniz:

https://redsky.target.com/redsky_aggregations/v1/web/pdp_fulfillment_v1?key=9f36aeafbe60771e321a7cc95a78140772ab3e96&tcin=12345678&store_id=2148&zip=55401

Temel parametreler:

  • key — API anahtarı (statik, değişmez — farklı uç noktalar farklı anahtarlar kullanır)
  • tcin — Target.com ürün numarası (8 haneli ürün kimliği)
  • store_id — Target mağaza konumu
  • zip — teslimat verileri için ZIP kodu

API anahtarını istek başlıklarından çıkarın. URL içinde sorgu parametresi olarak gömülüdür.

Adım 2: Redsky API’ye Doğrudan Python İsteği Gönderin

from curl_cffi import requests as cureq
import json

API_KEY = "9f36aeafbe60771e321a7cc95a78140772ab3e96"  # DevTools'tan çıkarın
TCIN = "12345678"

url = f"https://redsky.target.com/redsky_aggregations/v1/web/pdp_fulfillment_v1?key={API_KEY}&tcin={TCIN}&store_id=2148&zip=55401"

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": "application/json",
    "Origin": "https://www.target.com",
    "Referer": "https://www.target.com/",
    "Sec-Fetch-Site": "same-site",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Dest": "empty",
}

resp = cureq.get(url, headers=headers, impersonate="chrome124")
data = resp.json()

# Ürün ayrıntılarını JSON yanıtından çıkarın
product = data.get("data", {}).get("product", {})
title = product.get("item", {}).get("product_description", {}).get("title", "N/A")
price = product.get("price", {}).get("formatted_current_price", "N/A")
rating = product.get("ratings_and_reviews", {}).get("statistics", {}).get("rating", {}).get("average", "N/A")

print(f"{title} — {price} — Puan: {rating}")

HTML ayrıştırmaya gerek yok. Yanıt yapılandırılmış, temiz ve hızlıdır.

Adım 3: API Üzerinden Ürün Arama Sonuçlarını Kazıyın

product_summary_with_fulfillment_v1 uç noktası birden fazla TCIN’i aynı anda kabul eder:

tcins = ["12345678", "23456789", "34567890"]
tcin_str = ",".join(tcins)

search_url = f"https://redsky.target.com/redsky_aggregations/v1/web/product_summary_with_fulfillment_v1?key={API_KEY}&tcins={tcin_str}&store_id=2148&zip=55401"

resp = cureq.get(search_url, headers=headers, impersonate="chrome124")
results = resp.json()

for item in results.get("data", {}).get("product_summaries", []):
    title = item.get("title", "N/A")
    price = item.get("price", {}).get("formatted_current_price", "N/A")
    print(f"{title} — {price}")

TCIN almak için bunları ya arama sayfası HTML’sinden çekebilirsiniz (ürün URL’lerinde /A-XXXXXXXX olarak görünürler) ya da __TGT_DATA__ içine gömülü JSON’dan alabilirsiniz.

Adım 4: Eşzamanlı İsteklerle Ölçeği Büyütün

from concurrent.futures import ThreadPoolExecutor
import time, random

def fetch_product(tcin):
    url = f"https://redsky.target.com/redsky_aggregations/v1/web/pdp_fulfillment_v1?key={API_KEY}&tcin={tcin}&store_id=2148&zip=55401"
    time.sleep(random.uniform(2, 5))
    resp = cureq.get(url, headers=headers, impersonate="chrome124")
    return resp.json()

tcin_list = ["12345678", "23456789", "34567890", "45678901"]

with ThreadPoolExecutor(max_workers=3) as executor:
    results = list(executor.map(fetch_product, tcin_list))

Eşzamanlılık düzeyini temkinli tutun — 3–5 iş parçacığı ve 2–5 saniyelik rastgele gecikmeler. Target’ın hız sınırı IP başına dakikada yaklaşık 30–60 istek civarındadır.

Redsky API Hakkında Önemli Uyarılar

Bunun üzerine üretim ortamı için bir boru hattı kurmadan önce birkaç noktayı aklınızda tutun:

  • API anahtarları statiktir ama uç noktaya özeldir. Farklı Redsky uç noktaları farklı anahtarlar kullanır. Sık sık değişmezler, ancak Target bunları her an değiştirebilir.
  • Bu, belgelenmemiş dahili bir API’dir. Target mühendislik ekibi bunun kasıtlı olarak herkese açık olduğunu doğruladı, bu da hukuki riski azaltır; ancak SLA’ları olan desteklenen bir açık API değildir.
  • Ürün varyantlarının (renk, beden) her birinin kendine ait TCIN’i vardır. Her varyantı ayrı ayrı sorgulamanız gerekir.
  • Eksik Sec-Fetch-* başlıkları anında engelleme yaratır. Bu yaygın bir tuzaktır — mutlaka Sec-Fetch-Site, Sec-Fetch-Mode ve Sec-Fetch-Dest ekleyin.

Target.com’u Engellenmeden Ölçekte Kazımak İçin İpuçları

Bu uygulamalar, yöntemden bağımsız olarak üretim ölçeğinde geçerlidir.

Veri Merkezi Değil, Residential Proxy Kullanın

Target’ın Akamai uygulaması, veri merkezi IP aralıklarını görür görmez işaretler. Sürekli kazıma için residential proxy zorunludur. Fiyatlar oldukça değişken — Smartproxy/Decodo GB başına 4,50 $’dan başlıyor, Bright Data 5,04 $/GB seviyesinde; hacim arttıkça 3–4 $/GB’ye kadar düşebiliyor.

IP’leri her 50–100 istekte bir ya da proxy havuzunuz destekliyorsa her istekte değiştirin.

curl_cffi ile TLS Parmak İzlerini Taklit Edin

Bu, yapabileceğiniz en etkili değişikliklerden biridir. requests için doğrudan yerine geçen sürüm:

from curl_cffi import requests as cureq

# Standart requests — korumalı sitelerde %12 başarı oranı
# resp = requests.get(url, headers=headers)

# curl_cffi — %92 başarı oranı
resp = cureq.get(url, headers=headers, impersonate="chrome124")

curl_cffi (8.200+ GitHub yıldızı), chrome99 ile chrome146 arasındaki Chrome sürümlerini, ayrıca Safari, Edge ve mobil varyantları destekler. Senkron modda tls_client’a göre yüzde 20–30 daha hızlıdır.

Gerçekçi İstek Temposu ve Başlıklar Kullanın

  • Rastgele gecikmeler: İstekler arasında 2–7 saniye (sabit aralık değil — rastgelelik önemli)
  • User-Agent döndürme: 5–10 gerçek tarayıcı User-Agent dizesinden oluşan bir havuz tutun ve değiştirin
  • Oturum ısındırma: Ürün sayfalarına geçmeden önce çerez oluşturmak için target.com ana sayfasını ziyaret edin
  • Başlık tutarlılığı: Sec-Ch-Ua değeri, iddia ettiğiniz User-Agent tarayıcı sürümüyle eşleşmeli. Sec-Ch-Ua-Platform ise iddia ettiğiniz işletim sistemiyle örtüşmeli. Tutarsızlıklar hemen dikkat çeker.
  • Oturum kalıcılığı: Bir oturum içinde çerezleri istekler arasında koruyun. Scraperly rotasyonlu residential proxy’lerle 48 saatlik oturum kararlığı öneriyor.

Kodu Bırakın: Thunderbit ile Target.com Kazıyın (Kodsuz Alternatif)

Target.com, gerçekten de programatik olarak kazınması en zor perakende sitelerinden biri. JavaScript render, Akamai TLS parmak izi, veri merkezi proxy tespiti, ChromeDriver sürüm sorunları — hepsi üst üste geliyor. Python öğreniyorsanız bu harika bir alıştırma. Ama gerçek iş için Target ürün verisine ihtiyacınız varsa, maliyet-fayda hesabı çoğu zaman tutmuyor.

Veriyi mühendislik projesine dönüştürmeden almak isteyenler için Thunderbit zor kısımları otomatik olarak halleder.

Thunderbit, Target.com’un Zorluklarını Nasıl Aşar?

Thunderbit’in AI Web Scraper’ı tarayıcınız içinde çalışır; bu da JavaScript’i doğal olarak render ettiği anlamına gelir — Selenium kurulumu yok, headless tarayıcı yapılandırması yok, ChromeDriver sürüm yönetimi yok. Tarayıcı, kazıyıcının kendisidir.

İş akışı şöyle:

  1. Thunderbit Chrome Uzantısı yükleyin ve bir Target ürün ya da arama sayfasına gidin
  2. “AI Suggest Fields”e tıklayın — Thunderbit sayfayı okur ve sütun adları önerir (Ürün Başlığı, Fiyat, Puan, Görsel URL’si vb.)
  3. “Scrape”e tıklayın — veriler, render edilmiş sayfadan saniyeler içinde çıkarılır

Yapılandırılacak proxy yok. Taklit edilecek TLS parmak izi yok. None sonuçları yok.

Target Ürün Listelerini ve Detay Sayfalarını Kazıyın

Çok sayfalı iş akışı işin ilginçleştiği yer. Bir Target arama sonuçları sayfasını kazıyıp ürün listesi alın; ardından Alt Sayfa Kazıma ile her ürün URL’sini otomatik ziyaret ederek tablonuzu detay sayfası verileriyle — açıklamalar, tam yorumlar, teknik özellikler — sayfalama kodu yazmadan veya tarayıcı oturumlarını yönetmeden zenginleştirin.

Doğrudan Excel, Google Sheets, Airtable veya Notion’a aktarın. csv.writer kalıpları yok, dosya kodlama sorunları yok.

Tekrarlayan Target.com Kazımalarını Otomatikleştirin

Sürekli fiyat takibi veya stok izleme için Thunderbit’in Scheduled Scraper özelliği, programı düz dilde tanımlamanıza olanak tanır (örneğin, “her pazartesi sabah 9’da”). Cron işi yok, sunucu kurulumu yok, Python betiğini bir VPS üzerinde sürekli açık tutma derdi yok. Bu, rakip fiyatlandırmasını izleyen e-ticaret ekipleri için özellikle yararlıdır — ABD’li perakendecilerin yüzde 81’i artık otomatik fiyat kazıma kullanıyor ve fiyat istihbaratının ortalama getirisi 27:1.

Target.com’u Kazımak İçin Hangi Yöntem Ne Zaman Kullanılmalı?

İşte hızlı bir karar çerçevesi:

DurumunuzÖnerilen Yöntem
Python öğreniyorum, küçük bir projeYöntem 1: Requests + BS4 (statik veri ve __TGT_DATA__ için)
Fiyat ve yorum içeren tam ürün sayfaları gerekiyorYöntem 2: Selenium / Playwright
Ölçekte toplu ürün verisi çıkarmaYöntem 3: Redsky API
Kod yazmadan veriye hızlı ihtiyaç varThunderbit (kodsuz)
Tekrarlayan fiyat izlemeThunderbit Scheduled Scraper veya Redsky API + cron
Tek seferlik araştırma projesi, teknik olmayan ekipThunderbit — dürüstçe en hızlı yol

Üretim amaçlı bir veri hattı kuruyorsanız, Yöntem 3 (Redsky API) size en iyi hız ve güvenilirliği verir. Tek seferlik araştırma yapıyorsanız ya da ekibinizde Python uzmanı yoksa, Thunderbit saatler kazandırır. Web kazımayı öğreniyorsanız, Yöntem 1 → Yöntem 2 → Yöntem 3 sıralaması her adımda gerçek bir şey öğreten doğal bir ilerleyiştir.

Target.com Kazırken Hukuki ve Etik Değerlendirmeler

Kısaca değinmekte fayda var. Target’ın robots.txt dosyasında yaklaşık 120+ tane Disallow yolu var; ancak dikkat çekici biçimde /p/ (ürünler) veya /c/ (kategoriler) engellenmiyor — yani ürün ve kategori sayfaları taramaya açık. Sepet, hesap ve ödeme sayfaları kısıtlı.

Target’ın Hizmet Şartları otomatik erişimi yasaklıyor. Bununla birlikte Redsky API’nin kasıtlı olarak herkese açık olması (Target mühendisleri tarafından doğrulandı) API tabanlı veri toplamada hukuki riski azaltıyor.

Bilmeniz gereken temel hukuki emsaller:

  • hiQ v. LinkedIn (Dokuzuncu Daire, 2022): herkese açık verinin kazınması CFAA’yı ihlal etmez
  • Meta v. Bright Data (2024): Meta kaybetti — mahkeme, herkese açık veri kazımasında CFAA ihlali olmadığına karar verdi

Büyük ölçekli ticari kazıma için hukuk danışmanına başvurun. Piyasa araştırması, fiyat karşılaştırması ve herkese açık veriyi kullanan kişisel projeler için yasal olarak sağlam zemindesiniz. Her zaman hız sınırlarına uyun ve Target sunucularını gereksiz yere zorlamayın.

Sonuç ve Önemli Çıkarımlar

Target.com, zorluk puanını hak ediyor. Basit Requests + BeautifulSoup yaklaşımı başarısız olur; çünkü Target ürün verilerini JavaScript ile render eder ve Akamai, siz yanıtı almadan önce bile TLS el sıkışmanızı parmak izine dönüştürür. Ancak doğru yöntemle veri çekmek gayet net.

Güvenilirliğe göre üç yöntem:

  1. Redsky API — toplu veri için en hızlı ve en güvenilir yöntem; temiz JSON döndürür. DevTools ile API uç noktalarını tersine mühendislik yapmayı gerektirir.
  2. Selenium / Playwright — JavaScript render’ını yönetir, sayfadaki her şeyi almanızı sağlar. Daha yavaş ama kapsamlıdır.
  3. Requests + BeautifulSoup — statik HTML ve gömülü __TGT_DATA__ JSON’u ile sınırlıdır. Hızlı ama eksiktir.

En büyük teknik kazanımlar:

  • Bot karşıtı aşmada 15 kat iyileşme için standart requests yerine curl_cffi kullanın
  • Residential proxy zorunludur — veri merkezi IP’leri anında işaretlenir
  • Her istekte Sec-Fetch-* başlıklarını ekleyin — eksik olmaları anında engelleme yaratır
  • Oturum ısındırma (önce ana sayfayı ziyaret etmek) başarı oranlarını ciddi biçimde artırır

Ve eğer kullanım durumunuz için Python buna değmeyecek kadar zahmetliyse, Thunderbit’in Chrome uzantısı JavaScript render’ını, bot karşıtı önlemleri ve veri dışa aktarmayı otomatik olarak halleder. Ücretsiz katmanı deneyin ve saatler yerine dakikalar içinde ihtiyacınızı karşılayıp karşılamadığına bakın.

Daha fazla kazıma rehberi ve veri çıkarma ipucu için Thunderbit blogunu veya YouTube kanalımızı inceleyin.

SSS

Sadece Python Requests ve BeautifulSoup ile Target.com kazıyabilir miyim?

Kısmen. Ürün sayfalarındaki __TGT_DATA__ script etiketlerinden ürün başlıklarını, URL’leri ve bazı gömülü JSON verilerini çıkarabilirsiniz. Ancak arama sonuç sayfalarındaki fiyatlar, puanlar, yorumlar ve stok durumu JavaScript ile render edilir ve statik HTTP isteklerinde görünmez. Eksiksiz veri için Selenium/Playwright ya da Redsky API kullanın.

Target.com kazıyıcım neden fiyatlar için None döndürüyor?

Target, fiyat verilerini ilk sayfa yüklemesinden sonra JavaScript ile yükler. requests.get() kullandığınızda, JavaScript çalışmadan önceki ön-render HTML kabuğunu alırsınız; ürün verisi DOM’a henüz enjekte edilmemiştir. Fiyat öğeleri yanıt içinde gerçekten yoktur. JavaScript’i render eden headless bir tarayıcı (Selenium veya Playwright) kullanın, JSON veri için Redsky API’yi doğrudan çağırın ya da render edilmiş tarayıcı sayfasından kazıma yapan Thunderbit gibi bir araç kullanın.

Target.com kazımak yasal mı?

Herkese açık verilerin kazınması, güncel ABD içtihatına göre genel olarak izinlidir (hiQ v. LinkedIn, Meta v. Bright Data). Target’ın robots.txt dosyası ürün ve kategori sayfalarının taranmasına izin verir. Ancak Target’ın Hizmet Şartları otomatik erişimi yasakladığı için gri bir alan vardır. Kamuya açık verilerle yapılan pazar araştırması ve fiyat karşılaştırması için makul bir hukuki zemindesiniz. Büyük ölçekli ticari operasyonlar için bir avukata danışın.

Target’ın Redsky API’si nedir ve nasıl erişirim?

Redsky, Target’ın ön yüz ürün verilerine güç veren dahili API’sidir. Kayıt olup API anahtarı aldığınız, belgeli bir açık API değildir — React uygulamalarının ürün sayfalarını oluşturmak için çağırdığı arka uçtur. Uç noktaları Chrome DevTools’u açıp Network sekmesini XHR/Fetch ile filtreleyerek ve redsky.target.com isteklerini bularak keşfedebilirsiniz. API anahtarı, istek URL’sine sorgu parametresi olarak gömülüdür. Target mühendisliği, API’nin kasıtlı olarak herkese açık olduğunu doğrulamıştır.

Target.com kazırken engellenmekten nasıl kaçınırım?

Tek başına en etkili değişiklik, tarayıcı TLS parmak izlerini taklit etmek için standart Python requests yerine curl_cffi kullanmaktır — bu tek başına başarı oranını yüzde 12’den yüzde 92’ye çıkarır. Bunun dışında: residential proxy kullanın (veri merkezi değil), User-Agent dizelerini değiştirin, istekler arasına 2–7 saniyelik rastgele gecikmeler ekleyin, tüm Sec-Fetch-* başlıklarını dahil edin ve önce ana sayfayı ziyaret ederek oturumları ısıtın. Alternatif olarak, bot karşıtı önlemleri herhangi bir yapılandırma gerektirmeden otomatik yöneten Thunderbit gibi bir araç kullanın.

Daha Fazla Öğrenin

Ke
Ke
Thunderbit’ta CTO | Kıdemli Veri Bilimci ve ML Uzmanı Makine öğrenimi ve veri bilimi alanında yaklaşık on yıllık deneyime sahip olan Ke Shen, Columbia University mezunu ve Walmart Labs’te eski Kıdemli Veri Bilimci’dir. Python, R, Java ve İstatistik konularında derin ve meslektaşları tarafından tanınan uzmanlığıyla, karmaşık yapay zekâ algoritmalarını teoriden üretim düzeyinde mimariye taşıma konusunda sahada test edilmiş içgörüler paylaşır.
İçindekiler

Sadece sorarak bir web sayfasını çek

Ne istediğini düz İngilizceyle söyle. Hatta daha iyisi, hiçbir şey söyleme.

Thunderbit’i dene ücretsiz
Yapay Zeka ile Veri Çıkar
Verileri Google Sheets, Airtable veya Notion’a kolayca aktar
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week