Reddit, internetin en büyük tartışma platformlarından biri — ve veri ekipleri için altın madeni. Duygu analizi, trend takibi, marka monitörleme, meme araştırması… Ancak 2023'te Reddit'in API fiyatlandırmasını kökten değiştirmesiyle, maliyet duyarlı projeler için resmi API'nin yerini halka açık veri kazıma almaya başladı. Bu rehberde, Reddit veri kazıma işlemini proxy'lerle nasıl güvenli ve verimli hale getireceğinizi adım adım anlatacağız.
Önemli Uyarı: Bu rehber yalnızca halka açık verilere erişim için yazılmıştır. Reddit'in Hizmet Şartları'nı (Terms of Service), ABD'de CFAA'yı ve AB'de GDPR'ı ihlal eden kazıma faaliyetleri yasal risk taşır. Giriş gerektiren içerikleri kazımaktan kaçının ve her zaman resmi API'yi önce değerlendirin.
Reddit API Manzarası Neden Değişti?
Temmuz 2023'te Reddit, API fiyatlandırmasını devasa oranda artırdı: ücretsiz katmanın kaldırılmasının ardından, 100 milyon API isteği aylık yaklaşık 12.000 USD'ye denk geliyor. Üçüncü parti istemciler (Apollo, RIF vb.) kapandı; veri ekipleri ise bütçe dışı kaldı.
Resmi API'nin kota yapısı şöyle özetlenebilir:
- Ücretsiz katman: 100 istek/dakika (yalnızca OAuth akışı ile)
- Paid tier: Kullanım bazlı, büyük ekipler için aylık binlerce dolar
- Rate limit başlıkları:
x-ratelimit-remainingvex-ratelimit-resetile izlenir
Bu tablo, maliyet duyarlı projeleri iki yola itti: ya resmi API'yi terk edip halka açık HTML'yi kazımak, ya da veri toplama hacimlerini dramatik biçimde düşürmek. İlk seçenek — Reddit data scraping — doğru proxy stratejisiyle sürdürülebilir ve maliyet etkin olabilir.
Halka Açık Reddit Verileri: Neye Erişebilirsiniz?
Reddit'de giriş gerektirmeden erişilebilen veri türleri şunlardır:
Alt dizin (Subreddit) Akışları
Her subreddit'in /r/{subreddit}/ sayfası, gönderi listelerini JSON veya HTML olarak sunar. .json uzantısını URL'ye ekleyerek yapısal veri alabilirsiniz — ancak bu uç nokta da rate limit'e tabidir.
Gönderi Sayfaları ve Yorum İş Parçacıkları
/r/{sub}/comments/{id}/ URL'leri, gönderi metnini ve tüm yorumları içerir. .json soneki ile yapısal çıktı mümkündür.
Arama Sayfaları
/search.json?q=... uç noktası, anahtar kelime bazlı sonuçlar döndürür. Ancak arama sorguları özellikle sıkı rate limit'e tabidir.
Kullanıcı Profilleri
/user/{username}/ sayfaları, kullanıcının gönderi ve yorum geçmişini gösterir — yine giriş gerektirmez.
old.reddit.com: Kazıma Dostu Alternatif
old.reddit.com, Reddit'in eski arayüzüdür ve modern Reddit'e göre kazıma açısından önemli avantajlar sunar:
- Daha hafif HTML yapısı, JavaScript渲染 gerektirmez
- Daha az anti-bot koruması
- Sayfa başına daha fazla içerik
- Tutarlı ve öngörülebilir DOM yapısı
Veri kazıma projelerinde old.reddit.com tercih edilmesi, başarı oranını önemli ölçüde artırır.
Proxy Seçimi: Datacenter mı, Residential mı?
Reddit, IP başına rate limit uyguladığı için, yüksek hacimli kazıma işlemlerinde proxy kullanımı zorunludur. Hangi proxy türünü seçeceğiniz, projenizin ölçeğine bağlıdır.
| Özellik | Datacenter Proxy | Residential Proxy | Mobile Proxy |
|---|---|---|---|
| Hız | Yüksek | Orta | Düşük-Orta |
| Tespit Riski | Yüksek | Düşük | Çok düşük |
| Maliyet | Düşük | Orta | Yüksek |
| Reddit Uyumu | Düşük hacim için yeterli | Orta-yüksek hacim için ideal | Gerekli değil (aşırı) |
| IP Havuzu | Binlerce | Milyonlarca | On binlerce |
| Geo-hedefleme | Sınırlı | Ülke + şehir seviyesi | Ülke seviyesi |
Öneri: Günlük birkaç bin istek altında kalan projelerde datacenter proxy yeterli olabilir. Ancak subreddit'ler arası yaygın kazıma, duygu analizi veya trend takibi gibi yoğun iş yüklerinde Reddit residential proxies kaçınılmazdır. Residential IP'ler, gerçek İSS IP'lerinden geldiği için Reddit'in bot tespit sistemlerinden çok daha az etkilenir.
ProxyHat'ın residential havuzu, ülke ve şehir bazlı hedefleme sunar — bu, özellikle bölgesel subreddit'leri kazırken (ör. r/de, r/france) büyük avantaj sağlar. Desteklenen lokasyonları inceleyebilirsiniz.
Python ile Reddit Kazıma: Adım Adım Uygulama
Temel Yapı: old.reddit.com HTML Kazıma
Aşağıdaki örnek, old.reddit.com üzerinden bir subreddit'in gönderi başlıklarını çeker ve ProxyHat residential proxy havuzunu kullanır.
import requests
from bs4 import BeautifulSoup
import time
PROXY_URL = "http://user-country-US:PASSWORD@gate.proxyhat.com:8080"
HEADERS = {
"User-Agent": "ResearchBot/1.0 (+https://yourproject.com) Python/3.11",
"Accept": "text/html,application/xhtml+xml",
}
def fetch_subreddit(subreddit, sort="hot", limit=25):
"""Fetch post titles from old.reddit.com via rotating residential proxy."""
url = f"https://old.reddit.com/r/{subreddit}/{sort}/"
proxies = {"http": PROXY_URL, "https": PROXY_URL}
response = requests.get(url, headers=HEADERS, proxies=proxies, timeout=15)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
posts = []
for thing in soup.select("div.thing"):
title_el = thing.select_one("a.title")
if title_el:
posts.append({
"title": title_el.text.strip(),
"url": title_el["href"],
"score": thing.select_one("span.score").text if thing.select_one("span.score") else "0",
})
return posts[:limit]
# Kullanım
data = fetch_subreddit("python", sort="hot")
for post in data:
print(f"[{post['score']}] {post['title']}")
Sticky Session ile Yorum İş Parçacığı Kazıma
Yorum sayfaları daha büyük HTML yanıtları döndürür. Rate limit'ten kaçınmak için istekler arası bekleme ve sticky session (aynı IP'yi tutma) kullanmak önemlidir.
import requests
from bs4 import BeautifulSoup
import time
import random
# Sticky session: aynı IP'yi 10 dakika boyunca tut
PROXY_URL = "http://user-country-US-session-reddit01:PASSWORD@gate.proxyhat.com:8080"
HEADERS = {
"User-Agent": "ResearchBot/1.0 (+https://yourproject.com) Python/3.11",
"Accept": "text/html,application/xhtml+xml",
}
def scrape_post_comments(subreddit, post_id, max_comments=100):
"""Scrape comments from a Reddit post via old.reddit.com."""
url = f"https://old.reddit.com/r/{subreddit}/comments/{post_id}/"
proxies = {"http": PROXY_URL, "https": PROXY_URL}
response = requests.get(url, headers=HEADERS, proxies=proxies, timeout=20)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
post_title = soup.select_one("a.title").text.strip()
comments = []
for comment in soup.select("div.comment")[:max_comments]:
author_el = comment.select_one("a.author")
text_el = comment.select_one("div.md")
if text_el:
comments.append({
"author": author_el.text if author_el else "[deleted]",
"text": text_el.text.strip(),
})
return {"title": post_title, "comments": comments}
# Kullanım
result = scrape_post_comments("datascience", "abc123")
print(f"Post: {result['title']}")
print(f"Comments scraped: {len(result['comments'])}")
Rate Limit ve 429 Hata Yönetimi
Reddit, IP başına dakikada yaklaşık 60 istek limiti uygular. Bu limiti aşarsanız 429 Too Many Requests alırsınız. Sürekli aşım, 429'dan 403 Forbidden'a yükselir — yani IP'niz kalıcı olarak engellenir. Aşağıdaki desen bu sorunu yönetir:
import requests
import time
import random
PROXY_URL = "http://user-country-US:PASSWORD@gate.proxyhat.com:8080"
HEADERS = {
"User-Agent": "ResearchBot/1.0 (+https://yourproject.com) Python/3.11",
}
session = requests.Session()
session.proxies = {"http": PROXY_URL, "https": PROXY_URL}
def fetch_with_retry(url, max_retries=3, backoff_base=5):
"""Fetch URL with exponential backoff on rate limits."""
for attempt in range(max_retries):
try:
resp = session.get(url, headers=HEADERS, timeout=15)
# Rate limit kontrolü
remaining = resp.headers.get("x-ratelimit-remaining")
if remaining and int(remaining) < 5:
wait = int(resp.headers.get("x-ratelimit-reset", 60))
print(f"Rate limit yaklaşıyor. {wait}s bekleniyor...")
time.sleep(wait)
if resp.status_code == 200:
return resp
elif resp.status_code == 429:
wait = backoff_base * (2 ** attempt) + random.uniform(0, 1)
print(f"429 alındı. {wait:.1f}s bekleniyor (deneme {attempt+1})...")
time.sleep(wait)
elif resp.status_code == 403:
print("403 Forbidden — IP engellenmiş olabilir. Proxy döndürün.")
return None
else:
print(f"Beklenmeyen durum kodu: {resp.status_code}")
return None
except requests.RequestException as e:
print(f"İstek hatası: {e}")
time.sleep(backoff_base)
return None
# Kullanım
result = fetch_with_retry("https://old.reddit.com/r/python/hot/")
if result:
print(f"Sayfa alındı: {len(result.text)} karakter")
Node.js ile Reddit Kazıma
const axios = require('axios');
const cheerio = require('cheerio');
const PROXY_URL = 'http://user-country-US:PASSWORD@gate.proxyhat.com:8080';
const HEADERS = {
'User-Agent': 'ResearchBot/1.0 (+https://yourproject.com) Node/20',
'Accept': 'text/html,application/xhtml+xml',
};
async function fetchSubreddit(subreddit, sort = 'hot') {
const url = `https://old.reddit.com/r/${subreddit}/${sort}/`;
const resp = await axios.get(url, {
headers: HEADERS,
proxy: {
host: 'gate.proxyhat.com',
port: 8080,
auth: { username: 'user-country-US', password: 'PASSWORD' },
},
timeout: 15000,
});
const $ = cheerio.load(resp.data);
const posts = [];
$('div.thing').each((_, el) => {
const title = $(el).find('a.title').text().trim();
const score = $(el).find('span.score').text() || '0';
if (title) posts.push({ title, score });
});
return posts;
}
// Kullanım
fetchSubreddit('javascript').then(posts => {
posts.forEach(p => console.log(`[${p.score}] ${p.title}`));
}).catch(err => console.error('Hata:', err.message));
Rate Limit Stratejileri: 429'dan 403'e Geçişi Önlemek
Reddit'in rate limit mekanizması üç aşamalıdır ve bunu anlamak, scrape Reddit with proxies hedefinizde kritik önem taşır:
- Normal durum: Dakikada ~60 istek.
x-ratelimit-remainingbaşlığı ile izlenebilir. - 429 aşımı: Limit aşıldığında geçici blok. Exponential backoff ile yönetilebilir.
- 403 yükselimi: Tekrarlanan 429'lar sonrası kalıcı IP engeli. Proxy değiştirmek zorunda kalırsınız.
Kritik kural: 429 aldığınızda asla hemen tekrar istek göndermeyin. Bu, 403'e hızla dönüşür. Bunun yerine:
x-ratelimit-remainingdeğerini izleyin; 10'un altına düştüğünde proaktif olarak bekleyin- İstekler arası 1-2 saniye rastgele gecikme ekleyin
- Farklı alt dizinler arası geçişlerde kısa bekleme yapın
- Residential proxy havuzunda IP rotasyonu kullanın — ProxyHat'ın
user-country-USformatıyla her oturumda yeni IP alın
En İyi Uygulamalar
Gerçekçi User-Agent Belirleyin
Reddit, boş veya şüpheli User-Agent'ları agresif şekilde engeller. Format: UygulamaAdı/Sürüm (+İletişimURL) Dil/Sürüm. Asla tarayıcı User-Agent'ı taklit etmeyin — bu, bot tespitini tetikler.
Rate Limit'e Saygı Gösterin
Dakikada 30-40 istek, güvenli bir hedeftir. x-ratelimit-remaining başlıklarını izleyin ve limit yaklaştığında proaktif olarak bekleyin.
Agresif Önbellekleme Yapın
Aynı subreddit sayfasını tekrar tekrar kazımak yerine, sonuçları yerel olarak saklayın. Redis veya SQLite ile basit bir önbellek katmanı, gereksiz istekleri %50-70 oranında azaltabilir.
import hashlib
import json
import sqlite3
import time
CACHE_DB = "reddit_cache.db"
CACHE_TTL = 3600 # 1 saat
def init_cache():
conn = sqlite3.connect(CACHE_DB)
conn.execute("CREATE TABLE IF NOT EXISTS cache (key TEXT, data TEXT, ts REAL)")
conn.close()
def get_cached(url):
conn = sqlite3.connect(CACHE_DB)
row = conn.execute(
"SELECT data FROM cache WHERE key=? AND ts > ?",
(hashlib.md5(url.encode()).hexdigest(), time.time() - CACHE_TTL)
).fetchone()
conn.close()
return json.loads(row[0]) if row else None
def set_cached(url, data):
conn = sqlite3.connect(CACHE_DB)
conn.execute(
"INSERT OR REPLACE INTO cache (key, data, ts) VALUES (?, ?, ?)",
(hashlib.md5(url.encode()).hexdigest(), json.dumps(data), time.time())
)
conn.commit()
conn.close()
# Kullanım: fetch_with_retry çağrısından önce
init_cache()
cached = get_cached(url)
if cached:
return cached
Geo-Hedefleme Kullanın
Bölgesel subreddit'leri kazırken, o bölgenin IP'sini kullanmak başarı oranını artırır. ProxyHat ile user-country-DE veya user-country-DE-city-berlin formatıyla Alman IP'leri üzerinden r/de'yi kazımak, ABD IP'lerine göre çok daha güvenilirdir. SERP takibi ve bölgesel veri projelerinde bu kritik fark yaratır.
Veri Azaltma: Sadece Gerekenleri Çekin
Bir subreddit'in tüm yorumlarını kazımak yerine, gönderi başlıkları + puanları + ilk 10 yorum gibi hedefli bir strateji, hem istek hacmini azaltır hem de veri kalitesini korur.
Datacenter vs Residential: Ne Zaman Hangisi?
Küçük ölçekli projelerde (günlük <5.000 istek) datacenter proxy yeterli olabilir. Ancak şu senaryolarda Reddit residential proxies zorunludur:
- Birden fazla subreddit'i paralel kazıma
- Duygu analizi için yüksek hacimli yorum toplama
- Geo-dağıtık veri gerektiren pazar araştırması
- Uzun süreli trend takibi (günlük tekrarlayan kazıma)
ProxyHat'ın residential havuzu, esnek fiyatlandırma ile kullanımınıza göre ölçeklenir. Web kazıma kullanım senaryoları sayfamızda daha fazla detay bulabilirsiniz.
Etik Kazıma ve Resmi API Ne Zaman Kullanılmalı?
Her kazıma projesi, etik sınırlar içinde kalmalıdır. İşte dikkat etmeniz gerekenler:
- robots.txt'e saygı: Reddit'in
robots.txtdosyasını kontrol edin.old.reddit.com/robots.txtbazı botları engeller — bunu dikkate alın. - Hizmet Şartları: Reddit ToS, kazımayı kısıtlayabilir. Halka açık veriler bile ToS kapsamında değerlendirilmelidir.
- GDPR ve gizlilik: Kullanıcı adları ve kişisel veriler, GDPR kapsamında işlenmelidir. Veri anonimleştirme, hukuki yükümlülüktür.
- Rate limit'e saygı: Aşırı istek, Reddit'in altyapısını zorlar ve tüm kullanıcıları etkiler.
Resmi API Ne Zaman Tercih Edilmeli?
Kazıma her zaman ilk seçenek olmamalıdır. Aşağıdaki durumlarda resmi Reddit API'yi kullanın:
- Yapısal JSON veriye ihtiyacınız varsa ve ücretsiz katman yeterliyse
- Gerçek zamanlı akış (WebSocket) gerekiyorsa
- Özel erişim gerektiren içeriklere (moderatör araçları vb.) ihtiyacınız varsa
- Bütçe izin veriyorsa ve uzun vadeli kararlılık önemliyse
Resmi API ile kazıma arasındaki seçim, projenizin bütçesi, hacmi ve kararlılık gereksinimlerine bağlıdır. Düşük bütçeli araştırma projeleri için kazıma; kurumsal düzeyde kararlılık için API daha uygun olabilir.
Temel Çıkarımlar
- 2023 API değişiklikleri, maliyet duyarlı projeleri halka açık veri kazımaya yönlendirdi — ancak bu, etik ve yasal sınırlar içinde yapılmalıdır.
- old.reddit.com, modern arayüze göre kazıma dostudur: hafif HTML, tutarlı DOM, daha az anti-bot koruması.
- Datacenter proxy düşük hacim için yeterli; residential proxy yoğun kazıma için zorunludur.
- Rate limit yönetimi kritiktir:
x-ratelimit-remaining'i izleyin, 429'dan 403'e geçişi önlemek için proaktif bekleyin. - Önbellekleme ve hedefli veri çekme, gereksiz istekleri %50-70 azaltabilir.
- Etik kazıma kuralı: robots.txt'e saygı, ToS'u dikkate al, GDPR'a uyum sağla, resmi API'yi önce değerlendir.
Reddit veri kazıma projeniz için güvenilir bir proxy altyapısına mı ihtiyacınız var? ProxyHat fiyatlandırmasını inceleyin ve residential havuzumuzla hemen başlayın.






