Amazon yorum kazıyıcım altı hafta boyunca sorunsuz çalıştı — sonra bir sabah 200 OK döndürdü ve içinde hiçbir şey olmayan bir sayfa geldi. Hata yok, CAPTCHA yok; yüzlerce yorumun bulunduğu yerde şimdi bomboş bir HTML vardı.
Bu sana tanıdık geliyorsa, yalnız değilsin. 2025’in sonlarına doğru Amazon, tam yorum sayfalarını giriş zorunluluğunun arkasına almaya başladı ve birçok Python scraping script’i bir gecede çalışmaz hâle geldi. Son birkaç ayımı Thunderbit ekibinde hem kendi AI scraper’ımızı geliştirerek hem de kişisel Python yorum hattımı ayakta tutmaya çalışarak geçirdim. Bu yüzden, script’im ilk kez bozulduğunda elimde olmasını istediğim rehberi yazmanın zamanı geldiğini düşündüm. Bu yazı, çalışan yöntemi adım adım anlatıyor: çerez tabanlı kimlik doğrulama, Amazon’un CSS karartmasını aşabilen stabil selector’lar, 10 sayfalık sayfalama sınırına karşı pratik çözümler, anti-bot savunmaları ve ham yorum metnini gerçek iş içgörülerine dönüştüren bonus bir duygu analizi bölümü. Eğer ortalara gelince “Bu kodların hepsini ben neden bakımda tutayım ki?” diye düşünürsen, Thunderbit ile aynı işi yaklaşık iki dakikada, Python’a hiç dokunmadan nasıl yaptığımı da göstereceğim.
Amazon Yorum Kazıma Nedir ve Neden Önemlidir?
Amazon yorum kazıma, müşteri yorum verilerini — yıldız puanı, yorum metni, yazar adı, tarih, doğrulanmış satın alma rozeti gibi bilgileri — Amazon ürün sayfalarından programatik olarak çekme işlemidir. Amazon, 2010’da Product Advertising API’sinden yorum içeriğini kaldırdığı ve bir daha geri getirmediği için, bu verilere programlı erişimin tek yolu web scraping’dir.
Rakamlar da bunu destekliyor. Alışveriş yapanların %95’i satın almadan önce yorum okuyor ve şirketlerin %94’ü Amazon’u ürün yorumu için bir numaralı kaynak olarak görüyor. Bir ürün sayfasında yalnızca 5 yorum göstermek dönüşümü %270 artırabiliyor. Yorum duyarlılığını sistematik şekilde analiz eden şirketler müşteri sadakatinde %15’e varan artış görebiliyor. Bu, soyut bir veri bilimi konusu değil; rekabet istihbaratı, ürün iyileştirme sinyalleri ve pazarlama dili, hepsi Amazon’un sunucularında düz metin olarak duruyor.
Neden Amazon Yorumlarını Python ile Kazıyalım?
Python bu iş için hâlâ en çok tercih edilen dil. 2024 Stack Overflow Developer Survey’de en çok istenen #1 dil ve requests, BeautifulSoup, pandas, Scrapy gibi ekosistemi sayesinde, tam zamanlı geliştirici olmayanlar için bile web scraping’i erişilebilir hâle getiriyor.
Farklı ekipler bu veriyi farklı amaçlarla kullanıyor:
| Ekip | Kullanım Senaryosu | Ne Çekerler |
|---|---|---|
| Ürün / Ar-Ge | Tekrarlayan şikayetleri belirleme, düzeltmeleri önceliklendirme | 1–2 yıldız yorum metni, anahtar kelime sıklığı |
| Satış | Rakip ürün algısını izleme | Puanlar, yorum hacmi trendleri |
| Pazarlama | Reklam metni için müşteri dilini toplama | Olumlu yorum ifadeleri, özellik atıfları |
| E-ticaret Operasyonları | Kendi ürün algısını zaman içinde takip etme | Yıldız dağılımı, doğrulanmış satın alma oranı |
| Pazar Araştırması | Kategori liderlerini özellik bazında karşılaştırma | Birden fazla ASIN içeren yorum veri setleri |
Bir mutfak gereçleri markası olumsuz yorumları analiz edip %22’sinde “yapışmaz kaplamanın aşındığı” şikayetini buldu, ürünü yeniden formüle etti ve 60 gün içinde #1 Best Seller konumunu geri aldı. Bir fitness takip cihazı şirketi yorum metinlerinden “bileklik tahrişi” sorununu ortaya çıkardı, latekse alerji sorununu tespit etti, hipoalerjenik bir varyant çıkardı ve iade oranını %40 düşürdü. Mühendislik emeğini değerli kılan ROI tam olarak bu tür bir şeydir.
Giriş Duvarı: Amazon Yorum Kazıyıcınız Neden Çalışmayı Bıraktı?
14 Kasım 2024’te Amazon, tam ürün yorum sayfasını görüntülemek için giriş yapmayı zorunlu kılmaya başladı. Bu değişiklik topluluk forumlarında ve scraping hizmeti bloglarında doğrulandı. /product-reviews/{ASIN}/ adresini gizli modda açarsan, yorum verisi yerine bir giriş sayfasına yönlendirilirsin.

Belirtiler ince olabilir: script’in 200 OK yanıtı alır, ama HTML gövdesinde yorumlar yerine bir giriş formu (name="email", id="ap_password") vardır. Hata kodu yok. CAPTCHA yok. Sadece... işe yarar hiçbir şey yok.
Amazon bunu anti-bot ve bölgesel uyumluluk nedenleriyle yaptı. Uygulama zaman zaman tutarsız olabiliyor — bazen yeni açılmış bir tarayıcı penceresi, özellikle ilk sayfada, duvar devreye girmeden önce birkaç yorumu yükleyebiliyor — ancak ölçekli çalışan her scraper için duvarın her zaman aktif olduğunu varsaymalısın.
Farklı Amazon ülke alan adları (.de, .co.uk, .co.jp) bu duvarı birbirinden bağımsız olarak uygular. Bir forum kullanıcısının dediği gibi: “Her ülke için ayrı giriş gerekiyor.” .com çerezlerin .co.uk üzerinde işe yaramaz.
Öne Çıkan Yorumlar vs. Tüm Yorumlar: Giriş Yapmadan Neye Erişebilirsiniz?
Amazon ürün sayfaları (/dp/{ASIN}/ URL’si) hâlâ kimlik doğrulaması olmadan yaklaşık 8 “öne çıkan yorum” gösteriyor. Bunlar Amazon algoritmasının seçtiği yorumlardır ve hızlı bir duygu kontrolü için faydalıdır; ancak sıralanamaz, filtrelenemez veya sayfalanamaz.
Tam yorum sayfaları (/product-reviews/{ASIN}/) — en yeniye göre sıralama, yıldız puanına göre filtreleme ve yüzlerce yorum arasında sayfalama — giriş gerektirir.
Eğer hızlı bir nabız kontrolü için yalnızca birkaç yoruma ihtiyacın varsa, ürün sayfasını kazı. Yüzlerce hatta binlerce yorum gerekiyorsa, kimlik doğrulamayı çözmen gerekir.
Başlamadan Önce Gerekli Olanlar: Python Kurulumu ve Kütüphaneler
Kod yazmadan önce kurulum şu şekilde:
- Zorluk seviyesi: Orta (Python’a aşina, temel HTML bilgisi)
- Gereken süre: Tüm hat için yaklaşık 45 dakika; temel bir kazıma için yaklaşık 10 dakika
- İhtiyacın olacaklar: Python 3.8+, Chrome tarayıcı, geçerli bir Amazon hesabı
Temel kütüphaneleri yükle:
pip install requests beautifulsoup4 lxml pandas textblob
İsteğe bağlı (ileri seviye duygu analizi için):
pip install transformers torch
ASIN nedir? Amazon’un 10 karakterlik ürün kimliğidir. Bunu herhangi bir ürün URL’sinde bulabilirsin — örneğin amazon.com/dp/B0BCNKKZ91 içinde ASIN B0BCNKKZ91’dir. Yorum URL’sine ekleyeceğin anahtar budur.
Adım 1: Çerez Tabanlı Kimlik Doğrulama ile Giriş Duvarını Aşın
En güvenilir yöntem, Amazon’a tarayıcında giriş yapmak, oturum çerezlerini kopyalamak ve bunları Python requests.Session() içine enjekte etmektir. Böylece Selenium tabanlı giriş otomasyonunda sık görülen CAPTCHA ve SMS 2FA tetiklenmez.
Şu yedi çereze ihtiyacın var:
| Çerez Adı | Amaç |
|---|---|
session-id | Dönen oturum kimliği |
session-id-time | Oturum zaman damgası |
session-token | Dönen oturum belirteci |
ubid-main | Kullanıcı gezinme kimliği |
at-main | Birincil kimlik doğrulama belirteci |
sess-at-main | Oturuma özel kimlik doğrulama |
x-main | E-posta ile anahtarlanan tanımlayıcı |
Chrome DevTools’tan Çerezler Nasıl Çıkarılır?
- Chrome’da amazon.com hesabına giriş yap
- DevTools’u aç (F12 ya da sağ tık → İncele)
- Application → Storage → Cookies →
https://www.amazon.comyolunu izle - Tablodaki her çerez adını bul ve değerini kopyala
- Bunları Python için noktalı virgülle ayrılmış bir dize olarak biçimlendir
Oturumunu şöyle kur:
import requests
session = requests.Session()
# Çerez değerlerini buraya yapıştır
cookies = {
"session-id": "YOUR_SESSION_ID",
"session-id-time": "YOUR_SESSION_ID_TIME",
"session-token": "YOUR_SESSION_TOKEN",
"ubid-main": "YOUR_UBID_MAIN",
"at-main": "YOUR_AT_MAIN",
"sess-at-main": "YOUR_SESS_AT_MAIN",
"x-main": "YOUR_X_MAIN",
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
}
session.cookies.update(cookies)
session.headers.update(headers)
Önemli: Tüm isteklerinde aynı session nesnesini yeniden kullan. Bu, çerezlerin tutarlı kalmasını sağlar ve gerçek bir tarayıcı oturumunu taklit eder. Çerezler genellikle scraping yükü altında günler ile haftalar arasında geçerlidir; ancak yeniden giriş sayfasına düşmeye başlarsan, bunları tarayıcından yenile.
.com dışındaki pazar yerlerinde çerez adları biraz değişir — amazon.de at-main yerine at-acbde, amazon.co.uk ise at-acbuk kullanır ve benzeri. Her pazar yeri için ayrı ve bağımsız oturum gerekir.
Adım 2: İsteği Oluşturun ve Yorum HTML’ini BeautifulSoup ile Ayrıştırın
Amazon yorum URL’si şu yapıyı izler:
https://www.amazon.com/product-reviews/{ASIN}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1
Temel fonksiyon:
from bs4 import BeautifulSoup
import time, random
def get_soup(session, url):
time.sleep(random.uniform(2, 5)) # Nazik gecikme
response = session.get(url, timeout=15)
# Giriş duvarını tespit et
if "ap_email" in response.text or "Amazon Sign-In" in response.text:
raise Exception("Giriş duvarı tespit edildi — çerezlerini yenile")
if response.status_code != 200:
raise Exception(f"HTTP {response.status_code}")
return BeautifulSoup(response.text, "lxml")
İşe yarayan küçük bir hile: yorum sayfasına geçmeden önce önce ürün sayfasını ziyaret et. Bu, oturumunda doğal bir gezinme davranışı oluşturur.
# Önce ürün sayfasını ziyaret et (gerçek gezinmeyi taklit eder)
product_url = f"https://www.amazon.com/dp/{asin}"
session.get(product_url, timeout=15)
time.sleep(random.uniform(1, 3))
# Sonra yorum sayfasına git
reviews_url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber=1"
soup = get_soup(session, reviews_url)
Adım 3: Yorum Verisini Çıkarmak İçin Stabil Selector’lar Kullanın (CSS Sınıflarına Güvenmeyi Bırakın)
2022–2023 arasındaki çoğu rehberin dağıldığı yer tam da burası. Amazon CSS sınıf adlarını belirsizleştirir — bunlar periyodik olarak değişir ve bir forumda sinirlenen bir geliştiricinin dediği gibi: “span etiketlerinin sınıf adları için tek bir kalıp yoktu.”
Çözüm şu: Amazon, yorum öğelerinde data-hook özniteliklerini kullanır ve bunlar şaşırtıcı derecede stabildir. Bunlar Amazon’un kendi ön yüz kodunun dayandığı anlamsal tanımlayıcılardır, bu yüzden rastgeleleştirilmezler.
| Yorum Alanı | Stabil Selector (data-hook) | Kırılgan Selector (class) |
|---|---|---|
| Yorum metni | [data-hook="review-body"] | .review-text-content (değişir) |
| Yıldız puanı | [data-hook="review-star-rating"] | .a-icon-alt (belirsiz) |
| Yorum başlığı | [data-hook="review-title"] | .review-title (bazen) |
| Yazar adı | span.a-profile-name | Görece stabil |
| Yorum tarihi | [data-hook="review-date"] | .review-date (bölgeye bağlı) |
| Doğrulanmış satın alma | [data-hook="avp-badge"] | span.a-size-mini |
data-hook selector’larıyla çıkarım kodu:
import re
def extract_reviews(soup):
reviews = []
review_divs = soup.select('[data-hook="review"]')
for div in review_divs:
# Yıldız puanı
rating_el = div.select_one('[data-hook="review-star-rating"]')
rating = None
if rating_el:
rating_text = rating_el.get_text(strip=True)
match = re.search(r'(\d\.?\d?)', rating_text)
if match:
rating = float(match.group(1))
# Başlık
title_el = div.select_one('[data-hook="review-title"]')
title = title_el.get_text(strip=True) if title_el else ""
# Gövde
body_el = div.select_one('[data-hook="review-body"]')
body = body_el.get_text(strip=True) if body_el else ""
# Yazar
author_el = div.select_one('span.a-profile-name')
author = author_el.get_text(strip=True) if author_el else ""
# Tarih ve ülke
date_el = div.select_one('[data-hook="review-date"]')
date_text = date_el.get_text(strip=True) if date_el else ""
# Biçim: "Reviewed in the United States on January 15, 2025"
country_match = re.search(r'Reviewed in (.+?) on', date_text)
date_match = re.search(r'on (.+)$', date_text)
country = country_match.group(1) if country_match else ""
date = date_match.group(1) if date_match else ""
# Doğrulanmış satın alma
verified_el = div.select_one('[data-hook="avp-badge"]')
verified = bool(verified_el)
reviews.append({
"author": author,
"rating": rating,
"title": title,
"content": body,
"date": date,
"country": country,
"verified": verified,
})
return reviews
Bu selector setini aylardır birden fazla ASIN üzerinde çalıştırıyorum ve data-hook öznitelikleri bir kez bile değişmedi. CSS sınıfları ise aynı dönemde en az iki kez değişti.
Adım 4: Sayfalama ve Amazon’un 10 Sayfalık Sınırını Yönetin
Amazon, pageNumber parametresini her biri 10 yorum içeren 10 sayfa ile sınırlar — bu, filtre kombinasyonu başına yaklaşık 100 yorumluk sert bir tavan demektir. “Sonraki sayfa” düğmesi 10. sayfadan sonra kaybolur.
Temel sayfalama döngüsü:
all_reviews = []
for page in range(1, 11):
url = f"https://www.amazon.com/product-reviews/{asin}/ref=cm_cr_arp_d_viewopt_srt?sortBy=recent&pageNumber={page}"
soup = get_soup(session, url)
page_reviews = extract_reviews(soup)
if not page_reviews:
break # Bu sayfada artık yorum kalmadı
all_reviews.extend(page_reviews)
print(f"Sayfa {page}: {len(page_reviews)} yorum")
Amazon’da 10 Sayfadan Fazla Yoruma Nasıl Ulaşılır?
Çözüm, filtre bölümlendirmesidir. Her filterByStar ve sortBy kombinasyonu kendi 10 sayfalık bağımsız penceresine sahiptir.
Yıldız filtresi değerleri: one_star, two_star, three_star, four_star, five_star
Sıralama değerleri: recent, helpful (varsayılan)
5 yıldız filtresi × 2 sıralama düzenini birleştirerek ürün başına 100 sayfaya, yani 1.000 yoruma kadar erişebilirsin — ayrıca yıldız dağılımı dengesiz olan ürünlerde genellikle tam yorum setine oldukça yaklaşılır.
star_filters = ["one_star", "two_star", "three_star", "four_star", "five_star"]
sort_orders = ["recent", "helpful"]
all_reviews = []
seen_titles = set() # Basit tekrar önleme
for star in star_filters:
for sort in sort_orders:
for page in range(1, 11):
url = (
f"https://www.amazon.com/product-reviews/{asin}"
f"?filterByStar={star}&sortBy={sort}&pageNumber={page}"
)
soup = get_soup(session, url)
page_reviews = extract_reviews(soup)
if not page_reviews:
break
for review in page_reviews:
# Başlık + yazar kombinasyonuna göre tekrarları ayıkla
key = (review["title"], review["author"])
if key not in seen_titles:
seen_titles.add(key)
all_reviews.append(review)
print(f"[{star}/{sort}] Sayfa {page}: {len(page_reviews)} yorum")
print(f"Toplam benzersiz yorum sayısı: {len(all_reviews)}")
Bu bölümler arasında örtüşme olacaktır, bu yüzden tekrarları ayıklamak şarttır. Hızlı bir anahtar olarak yorum başlığı + yazar adı kombinasyonunu kullanıyorum — mükemmel değil ama tekrarların büyük çoğunluğunu yakalıyor.
Adım 5: Anti-Bot Savunmalarını Atlatın (Döndür, Yavaşlat, Tekrar Dene)
Amazon, AWS WAF Bot Control kullanıyor ve bu sistem ciddi biçimde sertleşti. Tek katmanlı önlemler (sadece User-Agent döndürmek, sadece gecikme eklemek gibi) artık yeterli değil.
| Teknik | Uygulama |
|---|---|
| Dönen User-Agent’lar | 10+ gerçek tarayıcı dizesi arasından rastgele seçim |
| Üstel geri çekilme | 503 durumlarında 2 sn → 4 sn → 8 sn yeniden deneme |
| İstek hız sınırı | Sayfalar arasında random.uniform(2, 5) saniye |
| Proxy dönüşümü | Residential proxy’ler arasında döngü |
| Oturum parmak izi | Her oturum için tutarlı çerezler + başlıklar |
| TLS taklidi | Üretimde stok requests yerine curl_cffi kullanın |
Üretime uygun bir tekrar deneme sarmalayıcısı:
import time, random
USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 15_7_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
]
def scrape_with_retries(session, url, max_retries=3):
for attempt in range(max_retries):
try:
session.headers["User-Agent"] = random.choice(USER_AGENTS)
time.sleep(random.uniform(2, 5))
response = session.get(url, timeout=15)
# Engelleri tespit et
if "validateCaptcha" in response.url or "Robot Check" in response.text:
wait = (2 ** attempt) * 5
print(f"CAPTCHA tespit edildi. {wait}s bekleniyor...")
time.sleep(wait)
continue
if response.status_code in (429, 503):
wait = (2 ** attempt) * 2
print(f"Hız sınırına takıldı ({response.status_code}). {wait}s bekleniyor...")
time.sleep(wait)
continue
if "ap_email" in response.text:
raise Exception("Giriş duvarı — çerezlerin süresi dolmuş")
return BeautifulSoup(response.text, "lxml")
except Exception as e:
if attempt == max_retries - 1:
raise
print(f"Deneme {attempt + 1} başarısız: {e}")
return None
Proxy’ler hakkında bir not: Amazon, bilinen veri merkezi IP aralıklarını (AWS, GCP, Azure, DigitalOcean) ağ seviyesinde kara listeye alır. Birkaç yüz sayfadan fazla scraping yapıyorsan, residential proxy’ler pratikte zorunludur — hacme bağlı olarak ayda 50–200+ dolar harcamayı bekle. Daha küçük projelerde (günde 100 isteğin altında), ev IP’nden dikkatli hız sınırlaması çoğu zaman yeterli olur.
Amazon ayrıca TLS parmak izlerini de inceler. Python’un standart requests kütüphanesi, WAF’ler tarafından önceden engellenen iyi bilinen bir JA3 hash’ine sahiptir. Üretim scraper’ları için gerçek tarayıcı TLS yığınlarını taklit eden curl_cffi’yi düşün. Eğitim düzeyinde scraping için (birkaç yüz sayfa), iyi başlıklarla birlikte requests genellikle yeterlidir.
Adım 6: Kazıdığınız Amazon Yorumlarını CSV veya Excel’e Aktarın
Yorumları topladıktan sonra, pandas ile bunları kullanılabilir bir formata dönüştürmek çok kolaydır:
import pandas as pd
df = pd.DataFrame(all_reviews)
df.to_csv("amazon_reviews.csv", index=False)
print(f"{len(df)} yorum amazon_reviews.csv dosyasına aktarıldı")
Örnek çıktı:
| author | rating | title | content | date | country | verified |
|---|---|---|---|---|---|---|
| Sarah M. | 5.0 | Bu yılın en iyi alışverişi | Pil bütün gün dayanıyor, ekran çok güzel... | January 15, 2025 | the United States | True |
| Mike T. | 2.0 | 2 hafta sonra hayal kırıklığı | Şarj portu çalışmayı durdurdu... | February 3, 2025 | the United States | True |
| Priya K. | 4.0 | Fiyatına göre harika | İhtiyacım olan her şeyi yapıyor, ağır uygulamalarda hafif gecikme var... | March 10, 2025 | the United States | False |
Excel’e aktarmak için: df.to_excel("amazon_reviews.xlsx", index=False) (openpyxl gerekir).
Google Sheets için gspread kütüphanesi çalışır ama 8+ adımlık Google Cloud yapılandırması ister — proje oluşturma, iki API’yi etkinleştirme, servis hesabı kimlik bilgileri üretme, sayfayı paylaşma. Bu kurulum sana gerçek scraping’den daha karmaşık geliyorsa, yanılmıyorsun. (Thunderbit gibi bir aracın Google Sheets’e tek tıkla aktarma sunması tam da bu noktada çok cazip görünmeye başlıyor.)
Bonus: Kazıdığınız Yorumlara 5 Satır Python ile Duygu Analizi Ekleyin
Çoğu scraping rehberi CSV aktarımında durur. Oysa duygu puanlama, ham veriyi iş kararlarına dönüştüren kısımdır.
En hızlı temel yaklaşım TextBlob kullanmaktır:
from textblob import TextBlob
df["sentiment"] = df["content"].apply(lambda x: TextBlob(str(x)).sentiment.polarity)
Bu, her yorum için -1.0 (çok negatif) ile +1.0 (çok pozitif) arasında bir polarite skoru verir. Örnek çıktı:
| content (kısaltılmış) | rating | sentiment | |---|---|---|---| | "Pil bütün gün dayanıyor, ekran çok güzel..." | 5.0 | 0.65 | | "Şarj portu birkaç gün sonra çalışmayı durdurdu..." | 2.0 | -0.40 | | "İhtiyacım olan her şeyi yapıyor, hafif gecikme var..." | 4.0 | 0.25 | | "Tam bir çöp. Hemen iade ettim." | 1.0 | -0.75 | | "Fena değil. Özel bir yanı yok ama çalışıyor." | 3.0 | 0.10 |
İlginç olan satırlar uyumsuzluklardır — pozitif dil içeren 3 yıldızlı bir yorum ya da negatif dil içeren 5 yıldızlı bir yorum gibi. Bu farklar, yalnızca yıldız puanlarının kaçırdığı nüanslı müşteri görüşlerini sık sık ortaya çıkarır.

Üretim düzeyinde doğruluk için önerilen yaklaşım Hugging Face Transformers’tır. VADER tweet’ler üzerinde eğitildi, ürün yorumları üzerinde değil ve transformer modelleri yorum sınıflandırmada %98’in üzerinde doğruluk elde edebiliyor; bu da sözlük tabanlı araçlardan çok daha iyi. nlptown/bert-base-multilingual-uncased-sentiment modeli 1–5 yıldız derecelendirmesini doğrudan tahmin edebiliyor:
from transformers import pipeline
clf = pipeline("sentiment-analysis",
model="nlptown/bert-base-multilingual-uncased-sentiment")
df["predicted_stars"] = df["content"].apply(
lambda x: int(clf(str(x)[:512])[0]["label"][0])
)
Amazon yorumları J şeklinde bir dağılım gösterir — 5 yıldızda büyük bir zirve, 1 yıldızda daha küçük bir zirve ve ortada bir çukur. Bu yüzden ortalama yıldız puanı çoğu zaman gerçek ürün kalitesinin zayıf bir göstergesidir. 1 yıldız kümesini segmentlere ayır ve tekrar eden temaları çıkar — genellikle tek bir düzeltilebilir kusur orada saklıdır.
Dürüst Karşılaştırma: Kendin Yap Python vs. Ücretli Scraping API’leri vs. Thunderbit
Amazon için Python scraper’ları yönettim ve dürüst olayım: bozuluyorlar. Selector’lar değişiyor, çerezlerin süresi doluyor, Amazon yeni bir bot algılama katmanı yayımlıyor ve birden bire cumartesi sabahın veri analiz etmek yerine scraper debug etmeye gidiyor. Forum kullanıcıları da aynı hayal kırıklığını yaşıyor — “geçen ay çalışan” DIY script’ler şimdi sürekli yama istiyor.
Üç ana yaklaşımın karşılaştırması şöyle:
| Kriter | Kendin Yap Python (BS4/Selenium) | Ücretli Scraping API | Thunderbit (Kod Yazmadan) |
|---|---|---|---|
| Kurulum süresi | 1–3 saat | 30 dk (API anahtarı) | 2 dakika |
| Maliyet | Ücretsiz (+ proxy maliyeti) | Ayda 50–200+ dolar | Ücretsiz plan mevcut |
| Giriş duvarı yönetimi | Manuel çerez yönetimi | Genellikle ele alınır | Otomatik yönetilir |
| Bakım | Yüksek (selector’lar bozulur) | Düşük (sağlayıcı bakım yapar) | Sıfır (AI uyum sağlar) |
| Sayfalama | Özel kod gerekir | Dahili | Dahili |
| Çok ülkeli destek | Alan adı başına ayrı oturum | Genellikle desteklenir | Tarayıcı tabanlı = yerel bölgen |
| Duygu analizi | Kendi kodunu eklemen gerekir | Bazen dahil | Sheets’e aktar, istediğin yerde analiz et |
| En uygun kullanım | Öğrenme, tam kontrol | Ölçekli/üretim hatları | Hızlı veri çekme, geliştirici olmayan ekipler |
Python sana tam kontrol sağlar ve web scraping’in kaput altında nasıl çalıştığını öğrenmenin gerçekten en iyi yoludur. Ücretli API’ler (ScrapingBee, Oxylabs, Bright Data) çalışma süresinin maliyetten daha önemli olduğu üretim hatları için anlamlıdır. Ve geliştirme yükü olmadan yorum verisine ihtiyaç duyan ekipler için — rakip ürünlerini haftalık izleyen e-ticaret operasyonları, reklam metni için müşteri dili toplayan pazarlama ekipleri gibi — üçüncü bir yol daha var.
Thunderbit ile Amazon Yorumları Nasıl Kazınır? (Kodsuz, Bakımsız)
Thunderbit tam da Python scraper bakımının aşırı zahmetli geldiği senaryolar için tasarlandı. İş akışı şöyle:
- Thunderbit Chrome Eklentisini yükle
- Tarayıcında Amazon ürün yorum sayfasına git (zaten giriş yapmış olacaksın, yani giriş duvarı sorun olmaz)
- “AI Suggest Fields”’a tıkla — Thunderbit sayfayı okur ve Author, Rating, Title, Review Text, Date, Verified Purchase gibi sütunlar önerir
- “Scrape”’e tıkla — veri, yerleşik sayfalama ile anında çekilir
- Excel, Google Sheets, Airtable veya Notion’a dışa aktar
Buradaki en büyük avantaj, Thunderbit’in AI’sinin sayfa yapısını her seferinde yeniden okumasıdır. Bakım gerektiren CSS selector’ları yok, çerez yönetimi yok, anti-bot kodu yok. Amazon HTML’ini değiştirdiğinde AI uyum sağlar. Programatik erişim isteyen ama tam DIY yapmak istemeyen okuyucular için Thunderbit ayrıca bir Extract API de sunar — AI destekli alan tespitiyle yapılandırılmış veri çıkarımı, selector bakımı olmadan.
Amazon verisi hakkında daha derin incelemeler için Amazon ürün ve yorumlarını nasıl kazıyacağınıza ve Amazon satış verilerini çıkarıp analiz etmeye dair rehberlerimize göz atın.
Python ile Ölçekte Amazon Yorumları Kazımak İçin İpuçları
Birden fazla ASIN boyunca yorum kazıyorsan, birkaç uygulama seni ciddi baş ağrısından kurtarır:
- ASIN’leri toplu işleyin ve ürünler arasında gecikme koyun (yalnızca sayfalar arasında değil). Ben ASIN’ler arasında 10–15 saniyelik duraklamalar kullanıyorum.
- Tekrarları agresif biçimde ayıklayın. Birden fazla yıldız filtresi ve sıralama kombinasyonunu birleştirirken örtüşen yorumlar alırsın.
(title, author, date)demetlerini tekrar önleme anahtarı olarak kullan. - Başarısızlıkları kaydet. Hangi ASIN + sayfa + filtre kombinasyonlarının başarısız olduğunu izle; böylece her şeyi yeniden kazımadan sadece onları yeniden deneyebilirsin.
- Büyük projelerde veriyi veritabanında sakla. Basit bir SQLite veritabanı, büyüyen CSV dosyalarına göre çok daha ölçeklenebilirdir:
import sqlite3
conn = sqlite3.connect("reviews.db")
df.to_sql("reviews", conn, if_exists="append", index=False)
- Tekrarlayan kazımaları planla. Sürekli izleme için bir cron job kur veya Thunderbit’in Scheduled Scraper özelliğini kullan — URL’yi ve zamanlamayı tanımla, gerisini sunucuya ihtiyaç duymadan o halleder.
Ek yaklaşımlar için en iyi otomatik web scraping araçları ve web sitelerinden Excel’e veri çekme yazılarımız ek seçenekleri anlatıyor.
Hukuki ve Etik Hususlara Kısa Bir Not
Amazon’un Kullanım Koşulları, Amazon hizmetlerine erişmek için “herhangi bir robot, spider, scraper veya başka otomatik yöntem” kullanımını açıkça yasaklıyor. Bununla birlikte, son ABD içtihatları kamu verisini kazıyanlar açısından olumlu oldu. Meta Platforms v. Bright Data (Ocak 2024) davasında federal mahkeme, genel erişime açık verinin kazınmasının, scraper giriş yapmış bir “kullanıcı” değilse, hizmet şartlarını ihlal etmediğine hükmetti.
Buradaki ince nokta şu: giriş arkasındaki scraping (bu rehberin kapsadığı şey) seni sözleşme hukuku alanına taşır; çünkü hesabını oluştururken Amazon’un ToS’unu kabul etmiş olursun. Kamuya açık öne çıkan yorumları kazımak, giriş duvarının arkasındaki veriyi kazımaktan daha düşük hukuki risk taşır.
Pratik yönergeler: kazınan veriyi ticari olarak yeniden dağıtma, kamuya açık olandan öte kişisel kullanıcı verilerini çekme, robots.txt’ye saygı göster ve büyük ölçekli ya da ticari kullanım için hukuk danışmanına başvur. Bu hukuki tavsiye değildir. Hukuki çerçeve hakkında daha fazla bilgi için web scraping’in hukuki etkileri genel bakışımıza göz at.
Sonuç: Amazon Yorumlarını Python ile Kazıyın ya da Kodu Tamamen Atlayın
Bu rehberde neler anlattığımızın kısa özeti:
- Giriş duvarı gerçek, ama çerez tabanlı kimlik doğrulama ile aşılabilir — tarayıcından 7 çerezi kopyalayıp
requests.Session()içine ekle - İki haftada bir bozulmayan çıkarım için CSS sınıfları yerine
data-hookselector’larını kullan - 10 sayfalık sayfalama sınırını aşmak ve ürün başına 500+ yoruma erişmek için yıldız filtrelerini ve sıralama düzenlerini birleştir
- Hızlı bir temel için TextBlob ile, üretim doğruluğu için Hugging Face Transformers ile duygu analizi ekle
- Anti-bot savunmalarını sürdür: hız sınırlama, User-Agent dönüşümü, üstel geri çekilme ve ölçek için residential proxy’ler
Python sana tam kontrol verir ve kaput altında ne olduğunu anlamanın en iyi yoludur. Ama kullanım senaryon “Cuma gününe kadar rakip yorum verisine bir tablo içinde ihtiyacım var” ise, “üretim veri hattı kurmak istiyorum” değilse, özel bir scraper’ın bakım yükü buna değmeyebilir.
Thunderbit, kimlik doğrulama, selector’lar, sayfalama ve dışa aktarmayı tek tıklarla halleder — ücretsiz planı dene ve iş akışına uyup uymadığına bak. Amazon anti-bot önlemlerini giderek sıkılaştırdıkça, gerçek zamanlı uyum sağlayan AI destekli araçlar artık hoş bir ekstra değil, zorunluluk hâline gelecek.
Ayrıca scraping iş akışlarının video anlatımları için Thunderbit YouTube Kanalı sayfamızı da inceleyebilirsin.
SSS
1. Giriş yapmadan Amazon yorumları kazınabilir mi?
Evet, ancak yalnızca ürün detay sayfasında (/dp/{ASIN}/) görünen yaklaşık 8 “öne çıkan yorum” için. Sıralama, filtreleme ve sayfalama içeren tam yorum sayfaları, 2024 sonu itibarıyla kimlik doğrulaması gerektiriyor. Çoğu iş senaryosunda giriş duvarını aşman gerekir.
2. Amazon yorumlarını kazımak yasal mı?
Amazon’un Hizmet Şartları otomatik kazımayı yasaklar. Ancak son ABD içtihatları (Meta v. Bright Data, 2024; hiQ v. LinkedIn) genel erişime açık verinin kazınmasını destekliyor. Giriş arkasındaki scraping daha yüksek hukuki risk taşır çünkü Amazon’un ToS’unu kabul etmiş olursun. Ticari kullanım için hukuk danışmanına başvur.
3. Ürün başına kaç Amazon yorumu kazıyabilirim?
Amazon, her sıralama düzeni ve yıldız filtresi kombinasyonu için yorum sayfalarını 10 ile sınırlar. 5 yıldız filtresinin tamamını × 2 sıralama düzenini kullanarak ürün başına 100 sayfaya kadar (yaklaşık 1.000 yorum) erişebilirsin. Anahtar kelime filtreleriyle teorik tavan çok daha yüksektir, ancak tekrar miktarı da önemli ölçüde artar.
4. Amazon yorumlarını kazımak için en iyi Python kütüphanesi hangisidir?
Statik HTML ayrıştırma için requests + BeautifulSoup en yaygın ve güvenilir kombinasyondur. JavaScript render gerektiğinde Selenium faydalıdır. Giriş duvarlarını ve sayfalama işlemini otomatik yöneten kodsuz bir alternatif için Thunderbit dene.
5. Amazon kazıma sırasında nasıl engellenmem?
10+ gerçek tarayıcı dizesinden User-Agent döndür, istekler arasında 2–5 saniye rastgele gecikme ekle, 503/429 hatalarında üstel geri çekilme uygula, ölçek için residential proxy’ler kullan (veri merkezi IP’leri önceden kara listeye alınır) ve istekler arasında tutarlı oturum çerezleri koru. Sıfır bakım isteyen bir yaklaşım için Thunderbit, anti-bot savunmalarını tarayıcı oturumun üzerinden otomatik olarak yönetir.
Daha Fazla Bilgi


