Craigslist kerää yhä arviolta 108 miljoonaa käyntiä kuukaudessa noin 700 paikallisella sivustolla — eikä sillä edelleenkään ole julkista APIa. Jos haluat jäsenneltyä dataa asuntolistoista, käytetyistä autoista, työpaikkailmoituksista tai keikkailmoituksista, kaapiminen on käytännössä ainoa vaihtoehto.
Craigslistin oma anti-bot-järjestelmä on kuitenkin armoton. Se ei käytä Cloudflarea tai DataDomea — vaan omaa nginx-pohjaista rate limiteriä, jota on hiottu yli vuosikymmenen ajan. Jos osut siihen väärin, saat suoran 403:n ennen kuin toinen kahvikuppi ehtii jäähtyä. Olen testannut Craigslistin puolustuksia monilla eri tavoilla, ja tämä opas on sen työn tulos: ajantasainen vuoden 2025 Python-opas, joka toimii kategoriasta riippumatta. Mukana ovat JSON-LD-poimintatapa (selvästi suurin parannus vanhentuneisiin oppaisiin verrattuna), rehelliset eston kiertämisen välttämisen keinot, juridinen näkökulma sekä no-code-vaihtoehto niille, jotka haluavat vain datan ilman että kirjoittavat riviäkään koodia.
Mitä Craigslistin kaappaaminen Pythonilla tarkoittaa?
Web-scraping Craigslistista tarkoittaa sitä, että Python-skripteillä vieraillaan ohjelmallisesti Craigslist-sivuilla, poimitaan kiinnostava jäsennelty data — otsikot, hinnat, kuvaukset, kuvat, sijainnit, julkaisupäivät — ja tallennetaan se taulukkoon, tietokantaan tai JSON-tiedostoon.
Python on tähän suosittu kieli ennen kaikkea sen kirjastoekosysteemin takia. requests-, BeautifulSoup-, lxml- ja curl_cffi-kirjastoilla saat toimivan Craigslist-kaapurin kasaan alle 100 rivillä. Yhteisö on valtava, joten kun Craigslist muuttaa jotain (niin se tekee), joku on yleensä jo löytänyt ratkaisun.
Tärkein asia on tämä: Craigslist ei tarjoa julkista luku-APIa. Ainoa virallinen ohjelmallinen rajapinta on Bulk Posting Interface (BAPI), joka on vain kirjoittamista varten — se sallii hyväksyttyjen maksavien julkaisijoiden lisätä ilmoituksia, ei hakea niitä. Kaikki kolmannen osapuolen palveluissa näkyvät "Craigslist API" -tuotteet ovat epävirallisia kaapureita, eivät virallisia päätepisteitä. Jos haluat massadataa, kaadat sen itse.
Miksi Craigslistiä kannattaa kaapata? Käytännön käyttötapaukset
Craigslist ei ole vain paikka löytää käytetty sohva. Se on valtava, jatkuvasti päivittyvä tietoaineisto kymmenillä eri osa-alueilla. Tässä on, keitä kaapiminen oikeasti hyödyttää:
| Käyttötapaus | Hyötyjät | Mitä poimitaan |
|---|---|---|
| Asunto- ja vuokrahintojen seuranta | Kiinteistönvälittäjät, vuokralaiset, PropTech-yritykset | Hinta, neliöt, makuuhuoneet, kaupunginosa, lat/long |
| Käytettyjen autojen markkina-analyysi | Autoliikkeet, kuluttajasovellukset, tutkijat | Hinta, merkki, malli, vuosimalli, mittarilukema, kunto |
| Työmarkkinatutkimus | Rekrytoijat, työmarkkinataloustieteilijät, henkilöstöanalyytikot | Otsikko, palkkaus, työsuhteen tyyppi, julkaisupäivä |
| Liidien hankinta | Myyntitiimit, palveluntarjoajat | Yhteystiedot, yrityksen nimi, palvelualue |
| Kilpailijaseuranta hinnoittelussa | Paikalliset palveluyritykset, verkkokauppaoperaatiot | Palveluhinnat, kuvaukset, toiminta-alueet |
Usein siteerattu akateeminen esimerkki on Kaggle "Used Cars Dataset" — noin 500 000 yhdysvaltalaista käytettyjen autojen ilmoitusta, joissa on 26 muuttujaa. Aineisto on ollut pohjana kymmenille tutkimuksille, mukaan lukien vuoden 2024 ResearchGate-tutkimus Yhdysvaltain käytettyjen autojen markkinadynamiikasta. Hedge fundit ovat ostaneet Craigslistin vuokra-aineistoa vuokratrendien tutkimiseen. Ja myyntitiimit kaapivat säännöllisesti services- ja gigs-kategorioita liidien keräämiseen.
Matematiikka on yksinkertainen: 8 tuntia käsin kopioimista ja liittämistä vastaan noin 10 minuuttia hyvin rakennetulla kaapurilla.

Kaavi Craigslist Pythonilla: kaikki kategoriat, ei vain autot
Lähes kaikki löytämäni Craigslist-kaappausoppaat käsittelevät vain myytäviä autoja — vähän kuin kirjoittaisi Googlen oppaan, joka kattaa vain kuvahaun. Craigslistissa on kymmeniä kategorioita, ja URL-rakenne vaihtelee niissä.
Rakenne on aina: https://{kaupunki}.craigslist.org/search/{category_slug}
Vaihda kaupungin alidomain ja slug, niin olet kaapannut täysin eri kategorian. Tässä on viitetaulukko suosituimmista kategorioista (tarkistettu huhtikuussa 2025):
| Kategoria | URL-slug | Tyypilliset poimittavat kentät |
|---|---|---|
| Asunnot / asuminen | /search/apa | Hinta, neliöt, makuuhuoneet, sijainti, lemmikkisäännöt |
| Autot ja kuorma-autot | /search/cta | Hinta, merkki, malli, vuosimalli, mittarilukema |
| Työpaikat | /search/jjj | Otsikko, yritys, palkka, työsuhteen tyyppi |
| Palvelut | /search/bbb | Otsikko, kuvaus, puhelinnumero, alue |
| Keikat | /search/ggg | Otsikko, korvaus, päivämäärä, kategoria |
| Myytävät (yleinen) | /search/sss | Otsikko, hinta, kunto, sijainti |
Voit myös yhdistää hakuehtoja suodatukseen:
| Parametri | Tarkoitus | Esimerkki |
|---|---|---|
query | Tekstihaku | ?query=studio |
min_price / max_price | Hintahaarukka | &min_price=1500&max_price=3000 |
hasPic | Vain ilmoitukset, joissa on kuvia | &hasPic=1 |
postedToday | Viimeiset 24 tuntia | &postedToday=1 |
sort | Järjestys | &sort=priceasc |
s | Sivutuksen offset (120 per sivu) | ?s=120 |
Joten URL kuten https://newyork.craigslist.org/search/apa?min_price=1500&max_price=3000&hasPic=1 antaa sinulle New Yorkin asunnot, joiden hinta on 1 500–3 000 dollaria ja joissa on kuvat. Kaikki tämän oppaan Python-kaapurit toimivat kaikissa näissä kategorioissa — sinun tarvitsee vain vaihtaa slug.
Craigslistin HTML-valitsimet vuonna 2025: vanha vs. uusi (ja JSON-oikotie)
Ykkössyy siihen, miksi Craigslist-kaapurit rikkoutuvat, on HTML-rakenteen muutokset. Jos seuraat vuoden 2022 opasta, jossa kehotetaan kohdistamaan .result-row tai .result-info-luokkiin, kaapurisi on jo käytännössä kuollut.
Craigslist uudisti hakutulosten merkintärakenteen vuosina 2023–2024. Vanhat luokkanimet ovat edelleen uusien wrapperien sisällä, mutta niiden kohdistaminen DOM-puun ylimmästä tasosta palauttaa tyhjän listan. Tässä on, mikä muuttui:
| Elementti | Vanha valitsin (ennen 2024) | Nykyinen valitsin (2025) |
|---|---|---|
| Ilmoituksen säiliö | .result-info | .cl-search-result |
| Otsikkolinkki | .result-title | .posting-title a |
| Hinta | .result-price | .priceinfo |
| Metatieto (alue) | .result-hood | .meta |
Mutta tässä on se oikea oivallus — ja samalla ero vuoden 2025 ajantasaisen kaapurin ja muiden välillä: hakutuloksia varten HTML:ää ei tarvitse parsia lainkaan.
Craigslist upottaa nyt jokaisen näkyvän ilmoituksen <script id="ld_searchpage_results"> -tageihin jäsenneltynä JSON-LD-datana. Yksi requests.get()-kutsu palauttaa koko schema.orgin ItemList-rakenteen kaikkine sivun ilmoituksineen — otsikko, hinta, valuutta, sijainti, kuvan URL, linkki tietosivulle. JavaScript-renderöintiä ei tarvita. CSS-valitsimimien hauraudesta ei tarvitse kärsiä.
JSON-LD-lähestymistapa on nopeampi, vakaampi ja huomattavasti vähemmän altis rikkoutumiselle, kun Craigslist hienosäätää käyttöliittymäänsä. Sitä käyttävät kaikki aktiivisesti ylläpidetyt GitHub-repot, ja sitä käytämme myös alla olevassa opetusosassa.
Yksi huomio: JSON-LD-lohko on olemassa kategorioissa, joissa on hinnoittelu — asunnot (apa), myytävät (sss), autot (cta), asuminen (hhh). Sitä ei usein ole lainkaan tai se on hyvin niukka jobs (jjj), gigs (ggg), community (ccc) ja services (bbb) -kategorioissa, koska näissä ilmoituksissa ei ole schema.org/Offer-hinnoittelua. Näissä kategorioissa kannattaa palata .cl-search-result-HTML-polkuun.
Python-pinon valinta: Requests + BS4 vs. Selenium vs. Playwright
Tämä on kysymys, joka nousee esiin jokaisessa scraping-foorumissa: "Mitä kirjastoa minun pitäisi käyttää?" Craigslistin kohdalla vastaus on useimmissa muissa sivustoissa nähtyä selkeämpi.
| Tekijä | requests + BeautifulSoup | Selenium | Playwright |
|---|---|---|---|
| Nopeus | 5–15 sivua/s (verkosta riippuva) | 0,3–1 sivua/s | 0,5–2 sivua/s |
| JS-renderöity sisältö | Ei | Kyllä | Kyllä |
| Muisti | ~30–60 MB | ~400–700 MB | ~300–500 MB |
| Asennuksen monimutkaisuus | Matala | Keskitaso | Keskitaso |
| Anti-bot-kestävyys | Matala (tarvitsee headerit/proxyt) | Keskitaso (oikea selain) | Keskitaso–korkea |
| Paras Craigslist-käyttötapaus | Hakutulokset (JSON-LD) | Dynaamisen sisällön ilmoitussivut | Suuriin määriin skaalattu asynkroninen kaapiminen |
| Oppimiskäyrä | Aloittelijaystävällinen | Kohtalainen | Kohtalainen |
Craigslistin sivut renderöidään palvelimella. JSON-LD-lohko on jo alkuperäisessä HTML:ssä. Lukupolulla ei ole JavaScript-haastetta. Kaikki aktiivisesti ylläpidetyt Craigslist-kaapurit GitHubissa käyttävät requests + BeautifulSoupia tai Scrapyä. Yksikään ei käytä Seleniumia tai Playwrightia. Se ei ole sattumaa — selainautomaatio tuo mukanaan satoja megatavuja muistia, 10–100-kertaisen hidastumisen ja näkyvämmän sormenjäljen ilman hyötyä.
Suositukseni:
- requests + BS4: Aloita tästä. Se sopii täydellisesti JSON-LD-poimintaan ja kattaa 95 % Craigslist-kaappauksen tarpeista.
- Selenium: Vain jos sinun täytyy olla vuorovaikutuksessa dynaamisen sisällön kanssa tietyillä ilmoitussivuilla (harvinaista Craigslistissa).
- Playwright: Jos skaalat tuhansiin sivuihin asynkronisella rinnakkaisuudella — mutta rehellisesti sanottuna Craigslistin rate limiter on pullonkaula, ei kirjastosi läpimeno.
Olemme käsitelleet erillisissä kirjoituksissa Playwright vs. Puppeteer -vertailun sekä yhteenvedon parhaista Python-web-scraping-työkaluista, jos haluat koko erittelyn.
Kaavi Craigslist ilman Pythonin kirjoittamista Get Started Free
No-code-vaihtoehto: kaavi Craigslist ilman Pythonia
Pieni sivupolku ennen koodia — tämä osio on kaikille, jotka eivät ole kehittäjiä. Kiinteistönvälittäjät, myyntitiimit, operatiiviset päälliköt — jos haluat vain datan etkä välitä Pythonin kirjoittamisesta, on olemassa nopeampi reitti.
Thunderbit on AI-web-scraper, joka toimii Chrome-laajennuksena. Se voi kaapia Craigslistin noin kahdella klikkauksella, ilman koodia. Työvaiheet ovat nämä:
- Avaa mikä tahansa Craigslistin hakutulossivu (asunnot, autot, työpaikat — mikä tahansa kategoria).
- Klikkaa Thunderbit-sivupalkista "AI Suggest Fields". Tekoäly lukee sivun ja tunnistaa automaattisesti sarakkeet, kuten ilmoituksen otsikon, hinnan, sijainnin ja linkin.
- Klikkaa "Scrape" — data poimitaan sekunneissa.
- Käytä Subpage Scraping -toimintoa vieraillaksesi jokaisen ilmoituksen omalla sivulla ja rikastaaksesi dataa täydellisillä kuvauksilla, puhelinnumeroilla, kuvilla ja ominaisuuksilla.
- Vie tiedot suoraan Google Sheetiin, Exceliin, Airtableen tai Notioniin — täysin ilmaiseksi.
Toistuvia tarpeita varten — esimerkiksi päivittäistä asuntohintojen seurantaa tai viikoittaisia työpaikkalistoja — Thunderbitin Scheduled Scraper antaa sinun kuvata aikataulun tavallisella kielellä, ja se toimii automaattisesti. Ei cron-tehtäviä, ei palvelinviritystä.
Thunderbit hoitaa myös anti-bot-suojaukset Cloud Scraping -tilan kautta, joten sinun ei tarvitse huolehtia proxyjen kierrätyksestä tai headerien rakentamisesta. Jos haluat kokeilla, lataa Thunderbit Chrome Extension ja katso itse.
Jos haluat täyden hallinnan ja räätälöinnin, jatka lukemista Pythonin vaiheittaiseen ohjeeseen.
Vaihe vaiheelta: näin kaivat Craigslistin Pythonilla (täysi opas)
- Vaikeustaso: Keskitaso
- Aikaa kuluu: noin 30 minuuttia (asennus + ensimmäinen kaappaus)
- Tarvitset: Python 3.8+, Chrome-selaimen (sivujen tarkasteluun), terminaalin
Vaihe 1: Asenna Python-ympäristö
Asenna tarvittavat kirjastot:
pip install requests beautifulsoup4 lxml
lxml on valinnainen, mutta nopeuttaa BeautifulSoup-parsintaa selvästi. Jos myöhemmin törmäät TLS-sormenjälkiin liittyviin ongelmiin (lisää tästä eston välttämisen osiossa), voit asentaa myös curl_cffi-kirjaston:
pip install curl_cffi
Tuo import-lohko:
import requests
from bs4 import BeautifulSoup
import json
import csv
import time
import random
Sinulla pitäisi nyt olla siisti Python-ympäristö, jossa kaikki riippuvuudet ovat asennettuna.
Vaihe 2: Rakenna Craigslist-URL mihin tahansa kategoriaan
Muodosta kohde-URL dynaamisesti kaupungin, category slugin ja valinnaisten suodattimien avulla:
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)}"
# Esimerkki: New Yorkin asunnot, 1500–3000 dollaria, kuvat mukana
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
Vaihda "apa" kohtaan "cta" (autot), "jjj" (työpaikat), "bbb" (palvelut) tai mikä tahansa yllä olevan kategoriataulukon slug. Vaihda "newyork" kohtaan "sfbay", "chicago", "losangeles" jne.
Vaihe 3: Hae sivu ja poimi upotettu JSON
Lähetä GET-pyyntö oikeilla headereilla ja pura sitten JSON-LD-lohko:
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": []}
Jos tag on None, JSON-LD-lohkoa ei ole kyseisessä kategoriassa — silloin kannattaa palata HTML-parsintaan (katso yllä oleva valitsintaulukko). Asunnoissa, autoissa ja myytävissä kategorioissa JSON-LD-lohko on yleensä luotettavasti mukana.
Vaihe 4: Jäsennä ilmoitukset rakenteellisiksi tietueiksi
Käy läpi JSON-alkiot ja poimi tarvitsemasi kentät:
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"Löydetty {len(listings)} ilmoitusta")
Näet jotain tyyliin "Löydetty 120 ilmoitusta" (Craigslist näyttää 120 tulosta per sivu). Joissakin ilmoituksissa hinta voi olla None, jos julkaisija ei ole sitä lisännyt — käsittele tämä siististi myöhemmässä logiikassa.
Vaihe 5: Kaavi tarkemmat tiedot ilmoitussivuilta
Hakutulokset antavat vain yhteenvedon. Täydellisiä kuvauksia, ominaisuuksia (makuuhuoneet, neliöt, lemmikkisäännöt), lat/long-koordinaatteja ja kuvia varten sinun täytyy vierailla jokaisen ilmoituksen omalla sivulla.
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)) # tärkeä: anti-bot-hajonta
time.sleep(random.uniform(3, 6)) ei ole valinnainen. Jos ohitat sen, saat 403:n muutamassa kymmenessä pyynnössä. Ilmoitussivut ovat palvelinrenderöityjä ja niissä on vakaat valitsimet (#titletextonly, #postingbody, #map), jotka eivät ole muuttuneet käytännössä sitten vuoden 2017 — yksi harvoista Craigslistin luotettavista asioista.
Vaihe 6: Käsittele sivutus, jotta saat kaikki tulokset
Craigslist käyttää sivutukseen ?s=120-offset-parametria. Jokaisella sivulla on 120 tulosta, ja suurin offset on yleensä 2999.
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))
Älä yritä kaapata tuhansia sivuja nopeasti peräjälkeen. Craigslistin rate limiter toimii IP-kohtaisesti, ja kestävä läpimeno yhdellä IP:llä on noin 0,3–0,5 pyyntöä sekunnissa kirjastosta riippumatta. Tämän katon asettaa Craigslist, ei Python.
Vaihe 7: Vie Craigslist-data CSV-, JSON- tai Google Sheets -muotoon
Tallenna tuloksesi:
# 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)
Jos haluat mieluummin jättää vientikoodin kokonaan väliin, Thunderbit tarjoaa ilmaisen viennin Google Sheetiin, Exceliin, Airtableen tai Notioniin suoraan selaimesta. Python-putkissa CSV ja JSON ovat kuitenkin standardimuodot. Voit myös siirtää datan suoraan pandasiin analyysiä varten tai tietokantaan sqlite3:lla.
Näin vältät bannin, kun kaivat Craigslistiä Pythonilla
Useimmat oppaat sivuuttavat tämän kohdan nopeasti. Craigslistin anti-bot-järjestelmä on itse rakennettu, ei valmisratkaisu, ja siinä on muutamia omia erikoisuuksia.

Käytä uskottavia request-headereita
Craigslist tarkistaa headerien järjestyksen ja täydellisyyden. Pyyntö, josta puuttuu Sec-Fetch-Dest tai jossa on vanhentunut User-Agent, voidaan liputtaa jo ennen kuin se osuu sisältöön. Täysi Chrome 120+ -header-setti (näytetty yllä vaiheessa 3) on vähimmäistaso. Voit kierrättää User-Agentia istuntojen välillä 5–10 tuoreen Chrome/Firefox-työpöytämerkkijonon välillä — mutta älä vaihda sitä kesken istunnon, koska se näyttää epäluonnolliselta.
Sec-Fetch-*-headerien puuttuminen on yleisin syy siihen, että ensikertalainen kaapuri estetään heti.
Lisää satunnaiset viiveet pyyntöjen väliin
Yhteisön konsensus useista lähteistä (ScrapingBee, Scraperly, Oxylabs, Multilogin) suosittelee satunnaista 2–5 sekunnin viivettä hakusivujen noudon välissä ja 3–6 sekunnin viivettä ilmoitussivujen välillä. Tasaiset aikavälit näyttävät bottimaisilta. Käytä time.sleep(random.uniform(2, 5)) — älä koskaan time.sleep(2).
Kierrätä proxyt, jos kaapat mittakaavassa
Craigslist estää ennakkoon kokonaisia AWS-, GCP- ja Azure-IP-alueita. Datacenter-proxyt ovat usein kuolleita jo ensimmäisessä pyynnössä. Jos käsittelet yli muutaman sadan sivun määriä, tarvitset residential rotating proxyjä, joita vaihdetaan 20–30 pyynnön välein. Mobiiliproxyt ovat vähiten havaittavissa, mutta maksavat 8–30 $/GB.
| Proxy-tyyppi | Havaitsemisriski Craigslistissa | Kustannus (2025) |
|---|---|---|
| Datacenter | Erittäin korkea — usein estetään heti ensimmäisessä pyynnössä | $0.50–2/GB |
| Residential rotating | Matala — suositeltu | $5–15/GB |
| Mobiili | Matalin | $8–30/GB |
Thunderbitin Cloud Scraping -tila hoitaa proxyjen kierrätyksen automaattisesti, jos et halua hallita tätä itse.
Käsittele CAPTCHA:t järkevästi
Craigslistin CAPTCHA:t ovat lukupoluilla harvinaisia — ne näkyvät lähinnä postaus- ja vastausvirroissa. Jos sellainen ilmestyy: pidä vähintään 60 sekunnin tauko, vaihda IP, tyhjennä evästeet ja hidasta tahtia. Toistuvat CAPTCHA:t kertovat siitä, että rytmisi on liian aggressiivinen, eivätkä ne ole pulma, joka ratkaistaan pakottamalla.
Kunnioita rate limitejä ja toteuta backoff
Craigslist palauttaa 403:n (ei 429:ää), kun osut rate limitiin. 403 tarkoittaa, että nykyinen IP on deny-listalla — älä yritä uudelleen sokkona. Vaihda IP, vaihda UA ja odota.
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
retry = Retry(
total=5,
backoff_factor=1.5, # 1.5, 3, 6, 12, 24 s
status_forcelist=[429, 500, 502, 503, 504],
allowed_methods={"GET"},
respect_retry_after_header=True,
)
adapter = HTTPAdapter(max_retries=retry)
session.mount("https://", adapter)
Yksi lisävinkki: yhteisöraportit mainitsevat johdonmukaisesti kello 2–6 aamulla kohdekaupungin paikallista aikaa turvallisimpana kaapimisaikana, jolloin estojen määrä on noin 30–40 % pienempi kuin päiväsaikaan.
TLS-sormenjälki — piilossa oleva ansa
Craigslistin bottikerros tarkistaa TLS ClientHello -viestin. Pythonin requests-kirjastolla (OpenSSL-pohjainen) on JA3-sormenjälki, joka ei vastaa mitään oikeaa selainta. Täydellinen User-Agent-header yhdistettynä ei-selaimen TLS-sormenjälkeen on havaittava ristiriita. Kiertotie on curl_cffi ja impersonate="chrome124", joka emuloi Chromen TLS-kättelyä:
from curl_cffi import requests as cffi_requests
r = cffi_requests.get(url, headers=HEADERS, impersonate="chrome124")
Jos saat selittämättömiä 403-virheitä puhtailla residential-IP:illä ja oikeilla headereilla, TLS-sormenjälki on lähes varmasti syy.
Craigslistin robots.txt, käyttöehdot ja eettinen kaapiminen
Useimmat oppaat joko ohittavat tämän kokonaan tai piilottavat yhden rivin usein kysyttyihin kysymyksiin. Kun Craigslist on voittanut $60,5 miljoonan tuomion kaapuria vastaan (RadPad, 2017), aihe ansaitsee enemmän kuin alaviitteen.
Mitä Craigslistin robots.txt oikeasti sanoo
robots.txt-tiedosto on yllättävän lyhyt. Siinä on yksi User-agent: * -lohko ja vain seitsemän estettyä polkua:
Disallow: /reply
Disallow: /fb/
Disallow: /suggest
Disallow: /flag
Disallow: /mf
Disallow: /mailflag
Disallow: /eaf
Kaikki seitsemän ovat interaktiivisia tai muuttavia päätepisteitä: reply, flag, suggest, email-a-friend. Ilmoitussivut (/search/..., yksittäiset postaus-URLit) eivät ole estettyjä. Crawl-delay-määritystä ei ole, vaikka Craigslist käytännössä pakottaa sellaisen IP-estojen kautta.
Kaupungin alidomainit julkaisevat myös sitemapit — esimerkiksi https://newyork.craigslist.org/sitemap/index.xml — jotka ovat virallisesti löydettävä reitti ilmoituksiin.
Oikeudellinen ennakkotapaus: tapaukset, joilla on merkitystä
Craigslist v. 3Taps (2013, sovittu 2015): 3Taps kaapi Craigslist-ilmoituksia ja myi niitä edelleen. Kun Craigslist lähetti cease-and-desist -kirjeen ja esti heidän IP:nsä, 3Taps kiersi eston vaihtuvilla proxyeilla. Oikeus katsoi, että IP-estojen kiertäminen nimenomaisen luvan peruutuksen jälkeen oli CFAA:n mukaan "ilman lupaa". 3Taps sovittiin 1 miljoonalla dollarilla.
Meta v. Bright Data (2024): Tuoreempi ratkaisu totesi, ettei Metan käyttöehdoilla voida kieltää uloskirjautuneena tapahtuvaa julkisesti saatavilla olevan datan kaapimista. Oikeus katsoi, että uloskirjautunut kaapuri oli "samassa asemassa kuin vierailija". Tämä on tärkein vuoden 2024–2025 kaapureita koskeva ratkaisu — jos et koskaan luo Craigslist-tiliä, et koskaan kirjaudu sisään ja käytät vain julkisesti näkyviä sivuja, käyttöehtoja ei ehkä voida panna täytäntöön sinua vastaan sopimuksena.
Käytännön johtopäätös: CFAA-riski on huomattavasti pienempi Van Burenin (2021) ja hiQ v. LinkedInin (2022) jälkeen julkisesti saatavilla olevien sivujen osalta. Mutta osavaltiotason vahingonkorvausvaatimukset (trespass-to-chattels, misappropriation) ovat edelleen olemassa — ne johtivat sekä 3Tapsin sovintoon että RadPadin 60,5 miljoonan dollarin tuomioon.
Tämä on yleistä tietoa, ei oikeudellista neuvontaa. Jos kaapat Craigslistiä kaupallisesti, keskustele asianajajan kanssa.
Käytännöllinen eettisen kaapimisen tarkistuslista
- ✅ Noudata kaikkia robots.txt:n
Disallow-määräyksiä — erityisesti seitsemää toiminnallista päätepistettä - ✅ Pysy selvästi alle 1 000 sivun 24 tunnin jaksoa kohden per IP (Craigslistin käyttöehdoissa määritellään $0.25 per sivu tämän rajan yli likvidoituna vahingonkorvauksena)
- ✅ Pysy uloskirjautuneena — älä koskaan luo Craigslist-tiliä kaappaamista varten
- ✅ Älä koskaan kierrä IP-estoa proxyeilla nimenomaisen eston jälkeen (siihen 3Taps kaatui)
- ✅ Lisää viiveitä pyyntöjen väliin — vähintään 2–5 sekuntia
- ✅ Älä kaavi henkilökohtaisia yhteystietoja spämmäykseen
- ✅ Älä jaa raakaa Craigslist-dataa eteenpäin tai esitä sitä omana alustana
- ✅ Käytä dataa lailliseen tutkimukseen, analyysiin tai omaan käyttöön
- ✅ Suosi julkaistuja sitemappeja brute force -crawlaamisen sijaan aina kun mahdollista
- ✅ Poista PII-tiedot (sähköpostit, puhelinnumerot) jo sisäänlukiessa, jos tallennat dataa
Olemme kirjoittaneet syvemmän oppaan web-scrapingin oikeudellisista vaikutuksista, jos haluat kokonaiskuvan.
Python vs. no-code: mikä lähestymistapa sopii sinulle?
| Tekijä | Python (requests + BS4) | Thunderbit (No-Code) |
|---|---|---|
| Asennusaika | 30–60 min (asennus, koodin kirjoittaminen) | 2 min (Chrome-laajennuksen asennus) |
| Tarvittava tekninen osaaminen | Keskitasoinen Python | Ei mitään |
| Räätälöinti | Täysi hallinta logiikasta, kentistä ja kulusta | Tekoäly tunnistaa kentät automaattisesti; käyttäjä voi säätää |
| Skaala | Rajaton (proxyilla, ajoituksella) | Scheduled Scraper toistuviin tehtäviin |
| Estojen käsittely | Manuaalinen (headerit, viiveet, proxyt, TLS) | Sisäänrakennettu (Cloud Scraping) |
| Vientivaihtoehdot | CSV, JSON (koodattava itse) | Google Sheets, Excel, Airtable, Notion — ilmaiseksi |
| Paras kenelle | Kehittäjille, data-analyytikoille, mukautetuille putkille | Myyntitiimeille, kiinteistönvälittäjille, ops-päälliköille |
Käytä Pythonia, jos tarvitset täyttä räätälöintiä, aiot integroida kaappauksen laajempaan dataputkeen tai haluat ymmärtää tarkasti, mitä taustalla tapahtuu. Käytä Thunderbit, jos haluat tuloksia nopeasti ilman koodin kirjoittamista tai ylläpitoa. Molemmat ovat täysin järkeviä vaihtoehtoja. Kyse on käyttötapauksesta ja siitä, haluatko viettää aikasi terminaalissa vai selaimessa.
Yhteenveto
Craigslist on rikas, jatkuvasti päivittyvä datalähde asumisen, autojen, työpaikkojen, palvelujen, keikkojen ja muun ympärillä — ja koska julkista APIa ei ole, kaapiminen on ainoa tapa saada jäsenneltyä dataa mittakaavassa. Vuoden 2025 lähestymistapa, joka oikeasti toimii: pura hakutuloksista upotettu JSON-LD (älä hauraita CSS-valitsimia), käytä requests + BeautifulSoupia (älä Seleniumia), lisää uskottavat headerit Sec-Fetch-*-kentillä, satunnaista viiveet ja käytä residential-proxyjä, jos menet muutamaa sataa sivua pidemmälle.
JSON-LD-menetelmä on selvästi suurin parannus vanhentuneisiin oppaisiin verrattuna. Se on nopeampi, kestävämpi ulkoasumuutoksia vastaan ja ei vaadi lainkaan JavaScript-renderöintiä. Yhdistä se yllä kuvattuihin eston välttämistä ehkäiseviin käytäntöihin, niin vältät ne 403-virheet, joihin useimmat kaapurit kompastuvat.
Jos haluat jättää koodin kokonaan väliin, Thunderbit Chrome Extension voi kaapia minkä tahansa Craigslist-kategorian parilla klikkauksella ja viedä tiedot suoraan haluamaasi taulukkoon tai tietokantaan. Jos haluat mennä syvemmälle, oppaamme web-scrapingin tekemisestä Pythonilla ja web-scrapingin parhaista käytännöistä avaavat perusteet tarkemmin.
Kokeile Thunderbitia Craigslist-kaappaukseen
Kokeile AI-web-scraperia Craigslist-datalle Get Started Free
Usein kysytyt kysymykset
Onko Craigslistin kaapiminen laillista?
Craigslistin käyttöehdot kieltävät automaattisen kaapimisen ja sisältävät likvidoidun vahingonkorvauslausekkeen (0,25 $/sivu yli 1 000 sivua päivässä). Tuoreet oikeuden ratkaisut — erityisesti Meta v. Bright Data (2024) ja hiQ v. LinkedIn (2022) — ovat kuitenkin kaventaneet CFAA-vastuuta julkisesti saatavilla olevan datan kaappaamisessa uloskirjautuneena. Osavaltiotason vahingonkorvausvaatimukset (trespass-to-chattels) ovat silti mahdollinen riski, etenkin kaupallisessa uudelleenjakelussa. Noudata robots.txt:tä, pysy uloskirjautuneena, lisää viiveitä äläkä jaa raakaa dataa eteenpäin. Tämä on yleistä tietoa, ei oikeudellista neuvontaa.
Onko Craigslistillä julkista APIa?
Ei. Craigslist tarjoaa vain kirjoittamiseen tarkoitetun Bulk Posting Interface (BAPI) -rajapinnan hyväksytyille maksaville julkaisijoille. Julkista luku-APIa, kehittäjäportaalia tai datan noutoon tarkoitettua rajoitettua tasoa ei ole. Kaikki kolmannen osapuolen palveluissa näkyvät "Craigslist API" -tuotteet ovat epävirallisia kaapureita.
Miksi Craigslist-kaapurini hajoaa jatkuvasti?
Lähes aina syynä ovat HTML-rakenteen muutokset. Craigslist uudisti hakutulosten merkinnät vuosina 2023–2024, eikä vanhoja valitsimia kuten .result-row tai .result-info enää voi käyttää. Vaihda upotettuun JSON-LD-menetelmään (script#ld_searchpage_results) saadaksesi huomattavasti kestävämmän ratkaisun. Tarkista myös, että headereissa on Sec-Fetch-*-kentät — niiden puuttuminen johtaa usein välittömään estoon.
Voinko kaapia Craigslistiä ilman Pythonia?
Kyllä. Thunderbitin AI-web-scraper Chrome-laajennus toimii millä tahansa Craigslist-sivulla — asunnot, autot, työpaikat, palvelut. Klikkaa "AI Suggest Fields" automaattiseen saraketunnistukseen, sitten "Scrape" datan poimimiseen, ja vie tiedot Google Sheetiin, Exceliin, Airtableen tai Notioniin ilmaiseksi. Ei koodausta, ei asennusrumbaa, ei proxyjen hallintaa.
Kuinka usein voin kaapata Craigslistiä joutumatta estetyksi?
Yhdellä residential-IP:llä kestävä läpimeno on noin 0,3–0,5 pyyntöä sekunnissa, kun sivujen välissä on satunnaiset 2–5 sekunnin viiveet. Pysy alle 1 000 sivussa 24 tunnin aikana per IP, jotta vältät sekä estot että Craigslistin käyttöehtojen likvidoidun vahingonkorvauksen kynnyksen. Kaappaaminen hiljaisina aikoina (klo 2–6 aamulla kohdekaupungin paikallista aikaa) vähentää estojen määrää noin 30–40 %. Suuremmille määrille kierrätä residential-proxyjä 20–30 pyynnön välein.
Lue lisää
- Kuinka tehdä web-scrapingia ilman estetyksi joutumista Pythonilla
- Miten käyttää Craigslist-kaapuria datatehokkuuden parantamiseen
- Kuinka kirjoittaa web-kaapuri Pythonilla: alusta loppuun
- Python-web-scraping: vältä estot fiksulla proxyjen käytöllä
- Web-scrapingin vaiheet: näin kaivat verkkoa Pythonilla helposti


