Python ile Craigslist Nasıl Kazınır (Ban Yemedan)

Son güncelleme: April 16, 2026
Python ile Craigslist Nasıl Kazınır (Ban Yemedan)

Craigslist hâlâ yaklaşık 108 milyon aylık ziyaret alıyor ve bunu yaklaşık 700 yerel site üzerinden yapıyor — üstelik hâlâ herkese açık bir API’si yok. İlanlardan, ikinci el arabalardan, iş ilanlarından ya da ek iş duyurularından yapılandırılmış veri çekmek istiyorsanız, scraping neredeyse tek seçeneğiniz.

Ama Craigslist’in özel anti-bot sistemi gerçekten acımasız. Cloudflare ya da DataDome kullanmıyor — bunun yerine 10 yılı aşkın süredir geliştirilen, nginx tabanlı kendi hız sınırlayıcısını çalıştırıyor. Yanlış hamle yaparsanız, ikinci kahvenizi bitirmeden 403 alırsınız. Craigslist’in korumalarına karşı farklı yöntemleri uzun süre test ettim ve bu rehber bunun sonucu: 2025’e güncel, kategori bağımsız bir Python anlatımı. İçinde JSON-LD ile veri çıkarma yöntemi (eski rehberlere göre en büyük gelişme), dürüst ban yememe stratejileri, hukuki çerçeve ve kod yazmadan veri almak isteyenler için no-code bir alternatif var.

Python ile Craigslist Kazımak Ne Demek?

Craigslist’i web scraping ile kazımak, Python script’leri kullanarak Craigslist sayfalarını programatik biçimde ziyaret etmek, ilgilendiğiniz yapılandırılmış verileri — başlıklar, fiyatlar, açıklamalar, görseller, konumlar, ilan tarihleri — çekmek ve bunları bir tabloya, veritabanına ya da JSON dosyasına kaydetmek demektir.

Python bu iş için en çok tercih edilen dil çünkü güçlü bir kütüphane ekosistemine sahip. requests, BeautifulSoup, lxml ve curl_cffi ile 100 satırın altında çalışan bir Craigslist kazıyıcı yazabilirsiniz. Topluluğu da çok büyük; bu yüzden Craigslist bir şey değiştirdiğinde (ki değiştiriyor), çözümü çoktan bulan biri oluyor.

Bilmeniz gereken en önemli nokta şu: Craigslist herkese açık bir okuma API’si sunmuyor. Tek resmi programatik arayüz Bulk Posting Interface (BAPI) ve bu yalnızca yazma işlemi için; onaylı ücretli ilan sahiplerinin içerik göndermesine izin veriyor, veri çekmeye değil. Üçüncü taraf platformlarda gördüğünüz her “Craigslist API” ürünü aslında resmi olmayan bir scraper’dır, onaylı bir uç nokta değil. Toplu veri istiyorsanız, kazımanız gerekir.

Neden Craigslist Kazınır? Gerçek Kullanım Senaryoları

Craigslist sadece ikinci el bir koltuk bulduğunuz yer değil. Birçok kategoride sürekli güncellenen dev bir veri kaynağı. İşte gerçekten kimlerin işine yaradığı:

Kullanım SenaryosuKimler İçin FaydalıNeler Çekilir
Daire ve kiralık fiyat takibiEmlakçılar, kiracılar, PropTech şirketleriFiyat, m², oda sayısı, mahalle, enlem/boylam
İkinci el araç piyasası analiziGaleriler, tüketici uygulamaları, araştırmacılarFiyat, marka, model, yıl, kilometre, durum
İş piyasası araştırmasıİK uzmanları, iş gücü ekonomistleri, iş analistleriBaşlık, ücret, çalışma tipi, ilan tarihi
Lead üretimiSatış ekipleri, hizmet sağlayıcılarıİletişim bilgileri, işletme adı, hizmet bölgesi
Rekabetçi fiyat analiziYerel hizmet sağlayıcılar, e-ticaret operasyonlarıHizmet fiyatı, açıklamalar, hizmet verilen bölgeler

En çok atıf alan akademik örneklerden biri Kaggle "Used Cars Dataset" — 26 değişken içeren yaklaşık 500.000 ABD ikinci el araç ilanı — ve bu veri, 2024’te ABD ikinci el araç piyasası dinamikleri üzerine yapılan bir ResearchGate çalışması da dahil olmak üzere onlarca akademik makalenin temeli oldu. Hedge fonlar, kira trendlerini incelemek için Craigslist kira verilerini toplu halde satın aldı. Satış ekipleri de hizmet ve gig kategorilerini düzenli olarak lead üretimi için kazıyor.

Matematik basit: 8 saatlik manuel kopyala-yapıştır ile iyi kurulmuş bir scraper kullanarak yaklaşık 10 dakika.

craigslist_stats_55285c3a34.png

Python ile Craigslist Kazıma: Sadece Arabalar Değil, Tüm Kategoriler

Bulabildiğim Craigslist kazıma rehberlerinin neredeyse hepsi sadece satılık araçları anlatıyor — bu da Google eğitimi yazıp yalnızca görsel aramayı anlatmak gibi. Craigslist’te onlarca kategori var ve URL yapıları her biri için farklı.

Yapı her zaman şu şekilde: https://{city}.craigslist.org/search/{category_slug}

Şehir alt alan adını ve slug’ı değiştirince bambaşka bir sektörü kazıyor olursunuz. İşte en popüler kategoriler için referans tablo (Nisan 2025’te doğrulandı):

KategoriURL SlugGenellikle Çekilen Alanlar
Daire / Konut/search/apaFiyat, m², yatak odası, konum, evcil hayvan kuralı
Arabalar ve Kamyonetler/search/ctaFiyat, marka, model, yıl, kilometre
İşler/search/jjjBaşlık, şirket, maaş, çalışma tipi
Hizmetler/search/bbbBaşlık, açıklama, telefon numarası, bölge
Ek işler/search/gggBaşlık, ücret, tarih, kategori
Satılık ürünler (genel)/search/sssBaşlık, fiyat, durum, konum

Filtreleme için sorgu parametrelerini de ekleyebilirsiniz:

ParametreAmacıÖrnek
queryTam metin anahtar kelime?query=studio
min_price / max_priceFiyat aralığı&min_price=1500&max_price=3000
hasPicSadece görsel içeren ilanlar&hasPic=1
postedTodaySon 24 saat&postedToday=1
sortSıralama&sort=priceasc
sSayfalama ofseti (sayfa başına 120)?s=120

Yani https://newyork.craigslist.org/search/apa?min_price=1500&max_price=3000&hasPic=1 gibi bir URL, New York’taki 1.500–3.000 dolar arası, görselli daireleri verir. Bu rehberdeki tüm Python scraper’ları bu kategorilerin hepsinde çalışır — tek yapmanız gereken slug’ı değiştirmek.

2025 Craigslist HTML Seçicileri: Eski ve Yeni (ve JSON Kısayolu)

Craigslist scraper’larının bozulmasının bir numaralı nedeni HTML yapısındaki değişikliklerdir. 2022’den kalma ve .result-row ya da .result-info hedeflemenizi söyleyen bir rehber izliyorsanız, scraper’ınız çoktan ölmüştür.

Craigslist 2023–2024 arasında arama sonuçlarının markup yapısını yeniden yazdı. Eski class adları yeni sarmalayıcıların içinde hâlâ var, ancak DOM ağacının en üstünden onları hedeflemek boş bir liste döndürüyor. İşte değişenler:

ÖğeEski Seçici (2024 öncesi)Güncel Seçici (2025)
İlan kapsayıcısı.result-info.cl-search-result
Başlık bağlantısı.result-title.posting-title a
Fiyat.result-price.priceinfo
Meta veri (bölge).result-hood.meta

Ama asıl kritik nokta — ve 2025’e uygun bir scraper’ı diğerlerinden ayıran şey — şu: arama sonuçları için HTML ayrıştırmanız gerekmiyor.

Craigslist artık görünür her ilanı <script id="ld_searchpage_results"> etiketi içinde yapılandırılmış JSON-LD verisi olarak gömüyor. Tek bir requests.get() çağrısı, sayfadaki tüm ilanlar için schema.org ItemList yapısını döndürüyor — başlık, fiyat, para birimi, konum, görsel URL’si, detay sayfası bağlantısı. JavaScript render etmeye gerek yok. CSS seçici kırılganlığı da yok.

JSON-LD yaklaşımı daha hızlı, daha stabil ve Craigslist arayüzü değiştiğinde bozulma ihtimali çok daha düşük. Aktif olarak bakımı yapılan her GitHub reposunun kullandığı yöntem bu; aşağıdaki rehberde de bunu kullanacağız.

Bir not: JSON-LD bloğu fiyat içeren kategorilerde bulunur — daireler (apa), satılık ürünler (sss), arabalar (cta), konut (hhh). İşler (jjj), ek işler (ggg), topluluk (ccc) ve hizmetler (bbb) için çoğu zaman yoktur ya da sınırlıdır; çünkü bu ilanlarda schema.org/Offer fiyat bilgisi bulunmaz. Bu kategorilerde .cl-search-result HTML yoluna dönün.

Python Stack Seçimi: Requests + BS4 mi, Selenium mu, Playwright mı?

Scraping forumlarında en sık çıkan soru şudur: “Hangi kütüphaneyi kullanmalıyım?” Craigslist özelinde cevap, çoğu siteye kıyasla çok daha nettir.

Kriterrequests + BeautifulSoupSeleniumPlaywright
Hız5–15 sayfa/sn (ağ bağımlı)0.3–1 sayfa/sn0.5–2 sayfa/sn
JS ile render edilen içerikHayırEvetEvet
Bellek~30–60 MB~400–700 MB~300–500 MB
Kurulum karmaşıklığıDüşükOrtaOrta
Anti-bot dayanıklılığıDüşük (header/proxy gerekir)Orta (gerçek tarayıcı)Orta-Yüksek
Craigslist için en iyi kullanımArama sonuçları (JSON-LD)Dinamik içerikli detay sayfalarıBüyük ölçekli asenkron scraping
Öğrenme eğrisiBaşlangıç dostuOrtaOrta

Craigslist sayfaları sunucu tarafında render edilir. JSON-LD bloğu ilk HTML içinde gelir. Okuma tarafında JavaScript engeli yoktur. GitHub’daki aktif Craigslist scraper’larının hepsi requests + BeautifulSoup ya da Scrapy kullanır. Selenium veya Playwright kullanan yok denecek kadar azdır. Bu tesadüf değil — tarayıcı otomasyon çerçevesi yüzlerce MB bellek, 10–100 kat hız kaybı ve daha görünür bir parmak izi getirir; üstelik karşılığında pek bir şey kazandırmaz.

Benim önerim:

  • requests + BS4: Buradan başlayın. JSON-LD çıkarma yöntemiyle kusursuz uyum sağlar ve Craigslist scraping ihtiyaçlarının %95’ini karşılar.
  • Selenium: Yalnızca belirli detay sayfalarında dinamik içerikle etkileşime girmeniz gerekiyorsa kullanın (Craigslist’te nadir).
  • Playwright: Binlerce sayfaya asenkron eşzamanlılıkla ölçeklenecekseniz — ama dürüst olmak gerekirse, darboğaz kütüphaneniz değil Craigslist’in hız sınırlayıcısıdır.

İsterseniz Playwright vs. Puppeteer karşılaştırmamıza ve en iyi Python web scraping araçları derlememize de ayrı yazılardan bakabilirsiniz.

Python yazmadan Craigslist kazıyın Get Started Free

No-Code Alternatif: Python Yazmadan Craigslist Kazıma

Koda geçmeden önce kısa bir sapak — bu bölüm geliştirici olmayan herkes için. Emlakçılar, satış ekipleri, operasyon yöneticileri — sadece veriyi istiyorsanız ve Python yazmakla uğraşmak istemiyorsanız, daha hızlı bir yol var.

Thunderbit, Chrome uzantısı olarak çalışan bir AI web scraper’dır. Craigslist’i yaklaşık 2 tıkta, kod yazmadan kazıyabilir. İş akışı şöyle:

  1. Herhangi bir Craigslist arama sonuçları sayfasına gidin (daireler, arabalar, işler — herhangi bir kategori).
  2. Thunderbit kenar çubuğunda “AI Alanları Öner” seçeneğine tıklayın. AI sayfayı okur ve ilan başlığı, fiyat, konum ve bağlantı gibi sütunları otomatik algılar.
  3. “Kazı” düğmesine tıklayın — veri saniyeler içinde çekilir.
  4. Her ilanın detay sayfasına gitmek ve verinizi tam açıklamalar, telefon numaraları, görseller ve özelliklerle zenginleştirmek için Alt Sayfa Kazıma özelliğini kullanın.
  5. Sonuçları doğrudan Google Sheets, Excel, Airtable veya Notion’a ücretsiz olarak aktarın.

Tekrarlayan ihtiyaçlar için — örneğin günlük daire fiyat takibi ya da haftalık iş ilanı anlık görüntüleri — Thunderbit’in Scheduled Scraper özelliğiyle planı düz İngilizceyle tarif edersiniz, sistem otomatik çalışır. Cron işi yok, sunucu kurulumu yok.

Thunderbit ayrıca Cloud Scraping modu sayesinde anti-bot önlemlerini de yönetir; böylece dönen proxy’ler ya da özel header’larla uğraşmanız gerekmez. Denemek isterseniz Thunderbit Chrome Extension bağlantısından kurup deneyebilirsiniz.

Tam kontrol ve özelleştirme istiyorsanız, Python adım adım anlatımına devam edin.

Adım Adım: Python ile Craigslist Nasıl Kazınır? (Tam Rehber)

  • Zorluk seviyesi: Orta
  • Gerekli süre: ~30 dakika (kurulum + ilk kazıma)
  • Gerekenler: Python 3.8+, Chrome tarayıcı (sayfaları incelemek için), terminal

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

Gerekli kütüphaneleri yükleyin:

pip install requests beautifulsoup4 lxml

lxml isteğe bağlıdır ama BeautifulSoup ayrıştırmasını belirgin biçimde hızlandırır. Sonradan TLS fingerprinting sorunları yaşarsanız (ban yememe bölümünde buna tekrar değineceğim), curl_cffi de kurabilirsiniz:

pip install curl_cffi

Import bloğunuz:

import requests
from bs4 import BeautifulSoup
import json
import csv
import time
import random

Artık tüm bağımlılıkları kurulmuş temiz bir Python ortamınız var.

Adım 2: Her Kategori İçin Craigslist URL’sini Oluşturun

Hedef URL’yi şehir + kategori slug + isteğe bağlı filtrelerle dinamik biçimde oluşturun:

from urllib.parse import urlencode

BASE = "https://{city}.craigslist.org/search/{slug}"

def build_url(city, slug, **params):
    return f"{BASE.format(city=city, slug=slug)}?{urlencode(params)}"

# Örnek: New York daireleri, 1500-3000 dolar arası, görselli
url = build_url("newyork", "apa", min_price=1500, max_price=3000, hasPic=1)
print(url)
# https://newyork.craigslist.org/search/apa?min_price=1500&max_price=3000&hasPic=1

"apa" yerine "cta" (arabalar), "jjj" (işler), "bbb" (hizmetler) ya da yukarıdaki kategori tablosundaki herhangi bir slug’ı koyabilirsiniz. "newyork" yerine "sfbay", "chicago", "losangeles" vb. kullanabilirsiniz.

Adım 3: Sayfayı Çekin ve Gömülü JSON’u Çıkarın

Doğru header’larla GET isteği gönderin, ardından JSON-LD bloğunu ayrıştırın:

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",
    "Accept-Encoding": "gzip, deflate, br",
    "Referer": "https://www.craigslist.org/",
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "same-origin",
    "Upgrade-Insecure-Requests": "1",
}

session = requests.Session()
r = session.get(url, headers=HEADERS, timeout=20)
r.raise_for_status()

soup = BeautifulSoup(r.text, "html.parser")
tag = soup.select_one("script#ld_searchpage_results")
data = json.loads(tag.text) if tag else {"itemListElement": []}

Eğer tag None ise, o kategoride JSON-LD bloğu yok demektir — HTML ayrıştırmaya geri dönün (yukarıdaki seçici tablosuna bakın). Daireler, arabalar ve satılık ürünler için JSON-LD bloğu güvenilir biçimde bulunur.

Adım 4: İlan Verilerini Yapılandırılmış Kayıtlara Dönüştürün

JSON içindeki öğeleri dolaşıp ihtiyacınız olan alanları çıkarın:

listings = []
for entry in data["itemListElement"]:
    item = entry["item"]
    offers = item.get("offers", {}) or {}
    addr = (offers.get("availableAtOrFrom") or {}).get("address", {})
    listings.append({
        "name":     item.get("name"),
        "url":      offers.get("url"),
        "price":    offers.get("price"),
        "currency": offers.get("priceCurrency"),
        "locality": addr.get("addressLocality"),
        "region":   addr.get("addressRegion"),
        "image":    item.get("image"),
    })

print(f"{len(listings)} ilan bulundu")

"120 ilan bulundu" gibi bir çıktı görmelisiniz (Craigslist sayfa başına 120 sonuç gösterir). Bazı ilanlarda fiyat girilmemiş olabilir ve None dönebilir — bunu aşağı akış mantığınızda düzgün yönetin.

Adım 5: Daha Zengin Veri İçin Detay Sayfalarını Kazıyın

Arama sonuçları size sadece özet bilgi verir. Tam açıklamalar, özellikler (yatak odası sayısı, m², evcil hayvan kuralı), enlem/boylam koordinatları ve görseller için her ilanın detay URL’sine gitmeniz gerekir.

def fetch_detail(url, session):
    r = session.get(url, headers=HEADERS, timeout=20)
    r.raise_for_status()
    s = BeautifulSoup(r.text, "html.parser")
    body = s.select_one("#postingbody")
    mp = s.select_one("#map")
    return {
        "description": body.get_text("\n", strip=True) if body else None,
        "attributes":  [x.get_text(" ", strip=True) 
                        for x in s.select("p.attrgroup span, div.attrgroup .attr")],
        "lat": mp.get("data-latitude") if mp else None,
        "lng": mp.get("data-longitude") if mp else None,
        "images": [img["src"] for img in s.select("div.gallery img")],
    }

for item in listings:
    item.update(fetch_detail(item["url"], session))
    time.sleep(random.uniform(3, 6))  # kritik: anti-ban jitter

time.sleep(random.uniform(3, 6)) isteğe bağlı değildir. Bunu atlayın, birkaç düzine istek içinde 403 alırsınız. Detay sayfaları, ~2017’den beri değişmeyen sabit seçicilerle (#titletextonly, #postingbody, #map) sunucu tarafında render edilir — Craigslist ile ilgili güvenilir olan az sayıdaki şeyden biridir.

Adım 6: Tüm Sonuçları Kazımak İçin Sayfalama Ekleyin

Craigslist sayfalama için ?s=120 ofset parametresini kullanır. Her sayfa 120 sonuç gösterir ve maksimum ofset genellikle 2999’dur.

def iter_all(city, slug, max_pages=25, **filters):
    for page in range(max_pages):
        offset = page * 120
        url = build_url(city, slug, s=offset, **filters)
        r = session.get(url, headers=HEADERS, timeout=20)
        r.raise_for_status()
        soup = BeautifulSoup(r.text, "html.parser")
        tag = soup.select_one("script#ld_searchpage_results")
        if not tag:
            break
        data = json.loads(tag.text)
        items = data.get("itemListElement", [])
        if not items:
            break
        for entry in items:
            item = entry["item"]
            offers = item.get("offers", {}) or {}
            yield {
                "name": item.get("name"),
                "url": offers.get("url"),
                "price": offers.get("price"),
            }
        time.sleep(random.uniform(2.5, 5.0))

Binlerce sayfayı hızlı hızlı kazımaya çalışmayın. Craigslist’in hız sınırlayıcısı IP bazlıdır ve tek bir IP üzerinden sürdürülebilir performans, hangi kütüphaneyi kullandığınıza bakmaksızın yaklaşık 0.3–0.5 istek/saniye civarında tıkanır. Bu tavanı Python değil, Craigslist belirler.

Adım 7: Craigslist Verinizi CSV, JSON veya Google Sheets’e Aktarın

Sonuçları kaydedin:

# CSV
with open("craigslist.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.DictWriter(f, fieldnames=listings[0].keys())
    w.writeheader()
    w.writerows(listings)

# JSON
with open("craigslist.json", "w", encoding="utf-8") as f:
    json.dump(listings, f, indent=2, ensure_ascii=False)

Export kodunu tamamen atlamak istiyorsanız, Thunderbit veriyi doğrudan tarayıcı içinden Google Sheets, Excel, Airtable veya Notion’a ücretsiz aktarabilir. Ancak Python akışlarında CSV ve JSON standart çıktılardır. Veriyi analiz için doğrudan pandas’a da aktarabilir ya da sqlite3 ile veritabanına yazabilirsiniz.

Python ile Craigslist Kazırken Ban Yemekten Nasıl Kaçınılır?

Çoğu rehber bu kısmı geçiştirir. Craigslist’in anti-bot sistemi hazır alınmış bir çözüm değil, özel olarak geliştirilmiş bir yapı ve kendine özgü bazı ayrıntıları var.

craigslist_antibot_ae9ddc3f54.png

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

Craigslist header sırasını ve eksiksizliğini kontrol eder. Sec-Fetch-Dest eksikse ya da User-Agent eskiyse, içerik gelmeden istek işaretlenir. Adım 3’te gösterilen tam Chrome 120+ header seti minimum gereksinimdir. User-Agent’ı oturum başına 5–10 güncel Chrome/Firefox masaüstü dizisi arasında değiştirin — ama oturum ortasında değiştirmeyin, bu yapay görünür.

Sec-Fetch-* header’larının eksik olması, ilk kez scraper yazanların anında engellenmesinin en yaygın nedenidir.

İstekler Arasına Rastgele Gecikmeler Ekleyin

Birden fazla kaynaktan (ScrapingBee, Scraperly, Oxylabs, Multilogin) gelen ortak görüş, arama sayfaları arasında 2–5 saniye, detay sayfaları arasında ise 3–6 saniye rastgele beklemektir. Sabit aralıklar bot gibi görünür. time.sleep(2) kullanmayın; time.sleep(random.uniform(2, 5)) kullanın.

Proxy Döndürün (Ölçek Büyüdüyse)

Craigslist, AWS, GCP ve Azure IP aralıklarının tamamını önceden bloklar. Veri merkezi proxy’leri çoğu zaman daha ilk istekte ölür. Birkaç yüz sayfanın ötesine geçiyorsanız, her 20–30 istekte bir dönen residential rotating proxy’lere ihtiyacınız olur. Mobil proxy’ler en düşük tespit riskine sahiptir ama maliyeti 8–30$/GB civarındadır.

Proxy TürüCraigslist’te Tespit RiskiMaliyet (2025)
Veri merkeziÇok yüksek — çoğu zaman ilk istekte engellenir0.50–2$/GB
Residential rotatingDüşük — önerilen seçenek5–15$/GB
MobilEn düşük8–30$/GB

Thunderbit’in Cloud Scraping modu, bunu kendiniz yönetmek istemiyorsanız proxy döndürmeyi otomatik olarak yapar.

CAPTCHA’ları Sakin Şekilde Ele Alın

Craigslist’te CAPTCHA’lar okuma akışında nadirdir — çoğunlukla ilan verme veya yanıt verme akışlarında görünür. Bir CAPTCHA çıkarsa en az 60 saniye geri çekilin, IP değiştirin, çerezleri temizleyin ve hızı düşürün. Sürekli CAPTCHA görmek, çözülmesi gereken bir bulmaca değil, hızınızın fazla agresif olduğunun işaretidir.

Hız Sınırlarına Saygı Gösterin ve Backoff Uygulayın

Craigslist hız sınırına takıldığınızda 403 (429 değil) döner. 403, mevcut IP’nin yasak listesine alındığı anlamına gelir — körlemesine tekrar denemeyin. IP değiştirin, UA’yı değiştirin ve bekleyin.

from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

retry = Retry(
    total=5,
    backoff_factor=1.5,  # 1.5, 3, 6, 12, 24s
    status_forcelist=[429, 500, 502, 503, 504],
    allowed_methods={"GET"},
    respect_retry_after_header=True,
)
adapter = HTTPAdapter(max_retries=retry)
session.mount("https://", adapter)

Bir ipucu daha: topluluk raporları, en güvenli kazıma zamanının hedef şehrin yerel saatine göre 02:00–06:00 arası olduğunu ve gündüze kıyasla engelleme oranlarının yaklaşık %30–40 daha düşük olduğunu sürekli belirtiyor.

TLS Fingerprinting — Gizli Tuzak

Craigslist’in bot katmanı TLS ClientHello’yu inceler. Python’un requests kütüphanesi (OpenSSL tabanlı) gerçek bir tarayıcıyla eşleşmeyen bir JA3 parmak izine sahiptir. Mükemmel bir User-Agent başlığı, tarayıcı olmayan bir TLS parmak iziyle birleşince tespit edilebilir bir uyumsuzluk oluşur. Çözüm, impersonate="chrome124" ile Chrome’un TLS el sıkışmasını taklit eden curl_cffi kullanmaktır:

from curl_cffi import requests as cffi_requests

r = cffi_requests.get(url, headers=HEADERS, impersonate="chrome124")

Temiz residential IP’ler ve doğru header’lar kullanmanıza rağmen açıklanamayan 403’ler alıyorsanız, büyük olasılıkla sebep TLS fingerprinting’dir.

Craigslist robots.txt, Kullanım Şartları ve Etik Scraping

Çoğu rehber bunu tamamen atlıyor ya da SSS’ye tek cümle sıkıştırıyor. Craigslist’in bir scraper’a karşı 60,5 milyon dolarlık hüküm kazandığı düşünüldüğünde (RadPad, 2017), bu konunun dipnot olmaktan fazlasını hak ettiği açık.

Craigslist’in robots.txt Dosyası Aslında Ne Diyor?

robots.txt dosyası şaşırtıcı derecede kısa. Sadece yedi yasaklı yol içeren tek bir User-agent: * bloğu var:

Disallow: /reply
Disallow: /fb/
Disallow: /suggest
Disallow: /flag
Disallow: /mf
Disallow: /mailflag
Disallow: /eaf

Bu yedi yolun tamamı etkileşimli/değiştirici uç noktalardır: reply, flag, suggest, email-a-friend. İlan sayfaları (/search/..., tekil ilan URL’leri) yasaklı değildir. Crawl-delay yönergesi yok, ancak Craigslist bunu yine de IP bloklarıyla uygular.

Şehir alt alan adları sitemap yayımlar — örneğin https://newyork.craigslist.org/sitemap/index.xml — ve bu, ilanlara ulaşmanın resmi olarak keşfedilebilir yoludur.

Hukuki Emsal: Önemli Davalar

Craigslist v. 3Taps (2013, 2015’te uzlaştı): 3Taps, Craigslist ilanlarını kazıyıp yeniden sattı. Craigslist bir ihtar gönderip IP’lerini engelledikten sonra, 3Taps bloklamayı dönen proxy’lerle aşmaya çalıştı. Mahkeme, açıkça geri alınmış erişim sonrası IP bloklarını aşmayı CFAA kapsamında “yetkisiz” saydı. 3Taps 1 milyon dolar ödeyerek uzlaştı.

Meta v. Bright Data (2024): Daha yeni bir karar, Meta’nın kullanım şartlarının herkese açık verilerin oturum kapalı şekilde kazınmasını yasaklayamayacağını ortaya koydu. Mahkeme, oturum kapalı bir scraper’ın “bir ziyaretçiyle aynı konumda” olduğunu söyledi. Bu, 2024–2025 scraping uygulamaları için en önemli kararlardan biridir — Craigslist hesabı açmaz, giriş yapmaz ve yalnızca herkese açık sayfaları ziyaret ederseniz, kullanım şartları sözleşme olarak size karşı uygulanmayabilir.

Pratik sonuç: CFAA riski, herkese açık sayfalar için Van Buren (2021) ve hiQ v. LinkedIn (2022) sonrası belirgin biçimde azaldı. Ancak eyalet hukuku kapsamındaki haksız fiil iddiaları (chattels’e müdahale, misappropriation) hâlâ geçerlidir — 3Taps uzlaşmasını ve 60,5 milyon dolarlık RadPad hükmünü doğuran da buydu.

Bu bölüm bilgilendirme amaçlıdır, hukuki tavsiye değildir. Craigslist’i ticari olarak kazıyorsanız bir avukata danışın.

Uygulamalı Etik Scraping Kontrol Listesi

  • ✅ robots.txt içindeki her Disallow kuralına uyun — özellikle yedi işlem uç noktasına
  • ✅ IP başına 24 saat içinde 1.000 sayfanın oldukça altında kalın (Craigslist’in şartları bu eşiğin üstünde sayfa başına $0.25 likidite edilmiş zarar uygular)
  • ✅ Oturum kapalı kalın — scraping için asla Craigslist hesabı açmayın
  • ✅ Açık bir bloktan sonra proxy kullanarak IP yasağını aşmaya çalışmayın (3Taps’in başını bu yaktı)
  • ✅ İstekler arasına gecikme ekleyin — en az 2–5 saniye
  • ✅ Kişisel iletişim bilgilerini spam için kazımayın
  • ✅ Ham Craigslist verisini yeniden dağıtmayın veya kendi platformunuz gibi sunmayın
  • ✅ Veriyi meşru araştırma, analiz veya kişisel kullanım amaçları için kullanın
  • ✅ Mümkünse kaba kuvvet tarama yerine yayımlanmış sitemap’leri tercih edin
  • ✅ Veri depoluyorsanız, alım sırasında PII’yi (e-posta, telefon numarası) ayıklayın

Web scraping’in hukuki sonuçları hakkında daha derin bir rehber de hazırladık; tam resmi görmek isterseniz bakabilirsiniz.

Python mı No-Code mu: Hangi Yaklaşım Size Uygun?

KriterPython (requests + BS4)Thunderbit (No-Code)
Kurulum süresi30–60 dk (kurulum, kod yazma)2 dk (Chrome uzantısı kurulumu)
Gerekli teknik bilgiOrta seviye PythonYok
ÖzelleştirmeMantık, alanlar ve akış üzerinde tam kontrolAI alanları otomatik algılar; kullanıcı isterse düzenler
ÖlçekSınırsız (proxy, zamanlama ile)Tekrarlayan işler için Scheduled Scraper
Ban önlemeManuel (header, gecikme, proxy, TLS)Dahili (Cloud Scraping)
Dışa aktarma seçenekleriCSV, JSON (kendiniz kodlarsınız)Google Sheets, Excel, Airtable, Notion — ücretsiz
En uygun kullanıcıGeliştiriciler, veri bilimciler, özel veri akışlarıSatış ekipleri, emlakçılar, operasyon yöneticileri

Tam özelleştirme istiyorsanız, daha büyük bir veri hattına entegre edecekseniz ya da sistemin içinde tam olarak ne olduğunu bilmek istiyorsanız Python kullanın. Hızlı sonuç almak ve kod yazıp bakım yapmak istemiyorsanız Thunderbit kullanın. İkisi de geçerli; karar kullanım senaryonuza ve terminalde mi yoksa tarayıcıda mı vakit geçirmek istediğinize bağlı.

Sonuç

Craigslist; konut, araba, iş, hizmet, ek iş ve daha fazlası için sürekli güncellenen zengin bir veri kaynağıdır — ve herkese açık API’si olmadığı için yapılandırılmış veriyi ölçekli şekilde almanın tek yolu scraping’dir. 2025’te gerçekten çalışan yöntem şudur: arama sonuçlarından gömülü JSON-LD’yi çıkarın (kırılgan CSS seçicileri değil), requests + BeautifulSoup kullanın (Selenium değil), Sec-Fetch-* alanlarıyla gerçekçi header’lar ekleyin, gecikmeleri rastgeleleştirin ve birkaç yüz sayfayı aşacaksanız residential proxy’ler kullanın.

JSON-LD yöntemi, eski rehberlere göre en büyük sıçramadır. Daha hızlıdır, düzen değişikliklerine daha dayanıklıdır ve JavaScript render etmeye hiç ihtiyaç duymaz. Yukarıdaki ban yememe stratejileriyle birleştirirseniz, çoğu scraper’ı düşüren 403 hatalarından kaçınabilirsiniz.

Kodu tamamen atlamak isterseniz, Thunderbit Chrome Extension birkaç tıkla her Craigslist kategorisini kazıyabilir ve veriyi doğrudan tercih ettiğiniz tabloya ya da veritabanına aktarabilir. Daha derine inmek isterseniz, Python ile web scraping nasıl yapılır ve web scraping en iyi uygulamaları rehberlerimiz temelleri daha ayrıntılı anlatıyor.

Craigslist Kazıma için Thunderbit’i Deneyin

Craigslist Verisi İçin AI Web Scraper’ı Deneyin Get Started Free

SSS

Craigslist’i kazımak yasal mı?

Craigslist’in Kullanım Şartları otomatik scraping’i yasaklar ve likide edilmiş zarar maddesi içerir (günde 1.000 sayfanın üstünde sayfa başına $0.25). Ancak son mahkeme kararları — özellikle Meta v. Bright Data (2024) ve hiQ v. LinkedIn (2022) — herkese açık verilerin oturum kapalı kazınması için CFAA sorumluluğunu daraltmıştır. Eyalet hukuku kapsamındaki haksız fiil iddiaları (trespass-to-chattels) özellikle ticari yeniden dağıtımda hâlâ risk oluşturur. robots.txt’ye uyun, oturum kapalı kalın, gecikme ekleyin ve ham veriyi yeniden dağıtmayın. Bu genel bilgilendirmedir, hukuki tavsiye değildir.

Craigslist’in herkese açık bir API’si var mı?

Hayır. Craigslist yalnızca onaylı ücretli ilan sahipleri için yazma amaçlı Bulk Posting Interface (BAPI) sunar. Herkese açık bir okuma API’si, geliştirici portalı ya da veri çekimi için ayrı bir limitli katman yoktur. Üçüncü taraf platformlarda gördüğünüz her “Craigslist API” ürünü resmi olmayan bir scraper’dır.

Craigslist scraper’ım neden sürekli bozuluyor?

Neredeyse her zaman HTML yapısı değiştiği içindir. Craigslist 2023–2024 arasında search results markup’ını yeniden yazdı ve .result-row ya da .result-info gibi eski seçicileri kullanan rehberler artık çalışmıyor. Daha dayanıklı bir yaklaşım için gömülü JSON-LD yöntemine (script#ld_searchpage_results ayrıştırması) geçin. Ayrıca header’larınızda Sec-Fetch-* alanlarının bulunduğunu kontrol edin — eksikse anında bloklanırsınız.

Python olmadan Craigslist kazıyabilir miyim?

Evet. Thunderbit’in AI web scraper Chrome uzantısı herhangi bir Craigslist sayfasında çalışır — daireler, arabalar, işler, hizmetler. Sütunları otomatik algılamak için “AI Alanları Öner”e tıklayın, veriyi çekmek için “Kazı”ya tıklayın ve sonuçları ücretsiz olarak Google Sheets, Excel, Airtable veya Notion’a aktarın. Kod yok, kurulum yok, proxy yönetimi yok.

Ban yemeden Craigslist’i ne sıklıkla kazıyabilirim?

Tek bir residential IP ile sürdürülebilir hız, sayfalar arasında rastgele 2–5 saniyelik gecikmelerle yaklaşık 0.3–0.5 istek/saniyedir. Hem ban yememek hem de Craigslist’in şartlarındaki likidite edilmiş zarar eşiğine takılmamak için IP başına 24 saat içinde 1.000 sayfanın altında kalın. Yoğun olmayan saatlerde (hedef şehrin yerel saatiyle 02:00–06:00) scraping yapmak blok oranlarını yaklaşık %30–40 azaltır. Daha yüksek hacimler için residential proxy’leri her 20–30 istekte bir döndürün.

Daha Fazla Bilgi

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