我如何用 Python 抓取 Craigslist(還不會被封鎖)

最後更新於 June 10, 2026
我如何用 Python 抓取 Craigslist(還不會被封鎖)

Craigslist 目前在約 700 個本地站點上,每月仍吸引大約 1.08 億次訪問——而且依然沒有公開 API。如果你想從那些租屋資訊、二手車、工作職缺或零工廣告中取得結構化資料,爬蟲幾乎是唯一選擇。

不過,Craigslist 自家的反機器人機制相當嚴格。它不用 Cloudflare 或 DataDome,而是採用自建的 nginx 速率限制系統,經過十多年持續打磨。只要操作不對,連第二口咖啡都還沒喝完,你就可能直接拿到 403。這篇指南就是我花了大量時間測試各種方法後整理出的成果:一份適用於 2025 年、可跨分類使用的 Python 教學,重點涵蓋 JSON-LD 抽取法(相較舊教程,這是最大的升級)、實際可行的防封鎖策略、法規與合規風險,以及一個不寫程式也能拿到資料的無程式碼替代方案。

用 Python 抓 Craigslist 是什麼意思?

用 Python 抓取 Craigslist,就是用程式自動造訪 Craigslist 頁面,擷取你需要的結構化資訊——像是標題、價格、描述、圖片、地點、刊登日期——再把它存進試算表、資料庫或 JSON 檔。

Python 之所以成為首選,是因為它的函式庫生態非常完整。結合 requestsBeautifulSouplxmlcurl_cffi,你可以在不到 100 行內做出一個可用的 Craigslist 爬蟲。社群規模也很大,所以當 Craigslist 改版時(這確實會發生),通常已經有人先找到解法。

最重要的一點是:Craigslist 不提供公開的讀取 API。它唯一正式的程式介面是 Bulk Posting Interface(BAPI),而且是只寫入不讀取——只允許已核准的付費刊登者提交內容,不能用來抓取列表。你在第三方平台看到的任何「Craigslist API」產品,本質上都是非官方爬蟲,而不是被授權的端點。想拿大量資料,就得自己爬。

為什麼要抓 Craigslist?實際應用場景

Craigslist 不只是拿來找二手沙發的地方,它其實是一個龐大、持續更新的多領域資料集。以下是實際會從中受益的族群:

應用場景受益對象可擷取內容
租屋與房價監控房地產經紀人、租客、PropTech 公司價格、坪數、房間數、社區、經緯度
二手車市場分析車商、消費者 App、研究人員價格、品牌、車型、年份、里程、車況
招聘市場研究招募人員、勞動經濟學者、人力分析師職稱、薪資、雇用類型、刊登日期
開發潛在客戶業務團隊、服務供應商聯絡資訊、公司名稱、服務區域
競品價格分析在地服務商、電商營運團隊服務價格、說明、服務範圍

最常被引用的學術案例之一是 Kaggle「Used Cars Dataset」——約 50 萬筆美國二手車刊登、共 26 個變數,成為數十篇論文的基礎,其中還包括一篇 2024 年的 ResearchGate 研究,分析美國二手車市場動態。對沖基金也曾購買彙整後的 Craigslist 租屋資料,用來研究租金趨勢。而業務團隊則經常抓取 services 和 gigs 分類來開發名單。

算起來其實很簡單:人工複製貼上 8 小時,和一個做得好的爬蟲只要大約 10 分鐘。

craigslist_stats_55285c3a34.png

用 Python 抓 Craigslist:不只車輛,所有分類都適用

我看過幾乎所有 Craigslist 爬取教學,很多都只講 cars-for-sale——這就像寫一篇 Google 教學,卻只教圖片搜尋。Craigslist 有數十個分類,而且每個分類的 URL 規則都不太一樣。

基本結構永遠是:https://{city}.craigslist.org/search/{category_slug}

只要換城市子網域和 slug,你就能抓到完全不同的分類。下面是最常見分類的參考表(已於 2025 年 4 月驗證):

分類URL Slug常見擷取欄位
公寓 / 房屋/search/apa價格、坪數、臥室數、地點、寵物政策
汽車與卡車/search/cta價格、品牌、車型、年份、里程
工作職缺/search/jjj標題、公司、薪資、雇用類型
服務/search/bbb標題、描述、電話、區域
零工/search/ggg標題、報酬、日期、分類
待售商品(一般)/search/sss標題、價格、車況、地點

你也可以搭配查詢參數做篩選:

參數用途範例
query全文關鍵字?query=studio
min_price / max_price價格區間&min_price=1500&max_price=3000
hasPic只顯示有圖片的刊登&hasPic=1
postedToday最近 24 小時&postedToday=1
sort排序方式&sort=priceasc
s分頁偏移量(每頁 120 筆)?s=120

因此,像 https://newyork.craigslist.org/search/apa?min_price=1500&max_price=3000&hasPic=1 這種網址,就能抓到紐約地區 1500 到 3000 美元、且有照片的公寓。這篇教學裡的 Python 爬蟲都適用於所有這些分類——你只需要替換 slug 即可。

2025 年 Craigslist HTML 選擇器:舊版 vs. 新版(以及 JSON 快捷法)

Craigslist 爬蟲最常壞掉的原因,就是 HTML 結構變動。如果你還在跟著 2022 年的教學,去抓 .result-row.result-info,那你的爬蟲基本上已經失效了。

Craigslist 在 2023–2024 年重寫了搜尋結果的標記結構。舊的 class 名稱雖然仍藏在新的外層容器裡,但如果你直接在 DOM 樹頂層抓它們,拿到的只會是空清單。變化如下:

元素舊版選擇器(2024 前)現行選擇器(2025)
刊登容器.result-info.cl-search-result
標題連結.result-title.posting-title a
價格.result-price.priceinfo
中繼資訊(區域).result-hood.meta

但真正關鍵的洞見,也是能把 2025 年可用爬蟲和其他方法拉開差距的核心:搜尋結果其實根本不需要解析 HTML。

Craigslist 現在會把每筆可見刊登,直接嵌在 <script id="ld_searchpage_results"> 標籤中,格式是結構化的 JSON-LD 資料。只要執行一次 requests.get(),你就能拿到整個 schema.org ItemList,裡面包含該頁所有刊登——標題、價格、幣別、地點、圖片 URL、詳細頁連結,全都在。不需要 JavaScript 渲染,也不怕 CSS 選擇器改版。

JSON-LD 方法更快、更穩,而且 Craigslist 只要微調介面,也不容易壞掉。這也是所有仍在維護中的 GitHub 專案會採用的方法,而我們在下方教學也會用它。

有一個例外:JSON-LD 區塊通常只會出現在有價格的分類中,例如 公寓apa)、待售商品(sss)、汽車(cta)、房屋(hhh)。工作(jjj)、零工(ggg)、社群(ccc)與服務(bbb)分類,因為沒有 schema.org/Offer 價格資訊,所以通常不會出現,或內容很少。這些分類就改回 .cl-search-result 的 HTML 路徑即可。

選擇你的 Python 技術棧:Requests + BS4、Selenium,還是 Playwright?

這是每個爬蟲論壇都會出現的問題:「我該用哪個函式庫?」對 Craigslist 來說,答案比大多數網站都更明確。

因素requests + BeautifulSoupSeleniumPlaywright
速度每秒 5–15 頁(受網路限制)每秒 0.3–1 頁每秒 0.5–2 頁
JS 渲染內容
記憶體占用約 30–60 MB約 400–700 MB約 300–500 MB
安裝複雜度
反機器人韌性低(需標頭 / Proxy)中(真實瀏覽器)中高
最適合的 Craigslist 用途搜尋結果(JSON-LD)含動態內容的詳細頁大規模非同步爬取
學習曲線適合初學者中等中等

Craigslist 的頁面是伺服器端渲染的。JSON-LD 資料塊已經出現在初始 HTML 裡。讀取路徑沒有 JavaScript 挑戰。所有仍在維護中的 Craigslist GitHub 爬蟲 幾乎都用 requests + BeautifulSoup 或 Scrapy,沒有用 Selenium 或 Playwright。這不是巧合——瀏覽器自動化框架會多吃數百 MB 記憶體、速度慢 10 到 100 倍,還會留下更明顯的指紋,但卻沒有實質好處。

我的建議:

  • requests + BS4:從這裡開始。它和 JSON-LD 抽取法完美搭配,足以處理 95% 的 Craigslist 爬取需求。
  • Selenium:只有在你需要操作特定詳細頁上的動態內容時才考慮使用(在 Craigslist 上這種情況很少)。
  • Playwright:如果你要用非同步併發擴展到數千頁,可以考慮;但老實說,Craigslist 的限制瓶頸在速率限制,不在你的函式庫吞吐量。

如果你想看更完整的比較,我們另外寫了 Playwright vs. Puppeteer最佳 Python 網頁爬蟲工具 的整理文章。

不用寫 Python 也能抓 Craigslist Get Started Free

無程式碼替代方案:不用寫 Python 也能抓 Craigslist

在進入程式碼之前先岔開一下——這一段是寫給不想當工程師的人看的。房地產經紀人、業務團隊、營運經理——如果你只想要資料,不想寫 Python,那其實有更快的路。

Thunderbit 是一個 AI 網頁爬蟲,作為 Chrome 擴充功能運作。它大約只要點兩下,就能抓 Craigslist,而且完全不需要程式碼。流程如下:

  1. 打開任一 Craigslist 搜尋結果頁(公寓、汽車、工作——任何分類都可以)。
  2. 在 Thunderbit 側邊欄點擊 「AI 建議欄位」。AI 會讀取頁面,自動辨識像標題、價格、地點和連結這些欄位。
  3. 點擊 「爬取」——資料會在幾秒內完成擷取。
  4. 使用 子頁爬取 進入每筆刊登的詳細頁,補充完整描述、電話、圖片與屬性。
  5. 直接匯出到 Google Sheets、Excel、Airtable 或 Notion——完全免費。

如果你有固定需求,例如每天監控租金,或每週抓一次職缺快照,Thunderbit 的 排程爬蟲 可以讓你用自然語言描述排程,然後自動執行。不需要 cron job,也不用自己架伺服器。

Thunderbit 還能透過雲端爬取模式處理反機器人機制,所以你不用自己管理輪換代理或手動設計標頭。如果你想試試看,可以安裝 Thunderbit Chrome 擴充功能 實際體驗。

如果你想要完全掌控與高度客製化,那就繼續看下面的 Python 逐步教學。

逐步教學:如何用 Python 抓 Craigslist(完整指南)

  • 難度: 中等
  • 所需時間: 約 30 分鐘(安裝 + 第一次抓取)
  • 你需要準備: Python 3.8+、Chrome 瀏覽器(用來檢查頁面)、終端機

步驟 1:設定 Python 環境

安裝必要函式庫:

pip install requests beautifulsoup4 lxml

lxml 不是必裝,但能明顯加快 BeautifulSoup 的解析速度。如果之後遇到 TLS 指紋辨識問題(後面的防封鎖章節會談到),你也可以安裝 curl_cffi

pip install curl_cffi

你的 import 區塊如下:

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

現在你應該已經有一個乾淨、依賴都安裝完成的 Python 環境了。

步驟 2:為任一分類建立 Craigslist URL

用城市 + 分類 slug + 可選篩選條件,動態組出目標網址:

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)}"

# 範例:紐約公寓,1500–3000 美元,含照片
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" 換成 "cta"(汽車)、"jjj"(工作)、"bbb"(服務),或上面分類表中的任一 slug。把 "newyork" 換成 "sfbay""chicago""losangeles" 等等都可以。

步驟 3:抓取頁面並擷取內嵌 JSON

送出 GET 請求並帶上正確標頭,接著解析 JSON-LD 區塊:

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": []}

如果 tagNone,代表該分類沒有 JSON-LD 區塊——那就改用 HTML 解析(參考前面的選擇器表)。對公寓、汽車與待售商品分類來說,JSON-LD 區塊通常都很穩定地存在。

步驟 4:把刊登資料解析成結構化紀錄

迭代 JSON 項目,擷取你需要的欄位:

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"Found {len(listings)} listings")

你應該會看到像是「Found 120 listings」這樣的輸出(Craigslist 每頁顯示 120 筆結果)。有些刊登如果沒有填價格,price 可能會是 None——後續邏輯要記得妥善處理。

步驟 5:抓詳細頁,取得更豐富的資料

搜尋結果只提供摘要資訊。若要取得完整描述、屬性(臥室數、坪數、寵物政策)、經緯度與圖片,你需要逐一造訪每筆刊登的詳細頁 URL。

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))  # 關鍵:防封鎖抖動

time.sleep(random.uniform(3, 6)) 不是可有可無的。若省略它,幾十次請求內就很容易遇到 403。詳細頁是伺服器端渲染,且選擇器相對穩定(#titletextonly#postingbody#map),這些元素自 2017 年前後以來幾乎沒變——算是 Craigslist 少數真正可靠的部分。

步驟 6:處理分頁,抓完整結果

Craigslist 用 ?s=120 這個偏移參數做分頁。每頁顯示 120 筆,最大偏移通常是 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))

不要試著在短時間內狂抓數千頁。Craigslist 的速率限制是以 IP 為單位,無論你用哪個函式庫,單一 IP 的可持續吞吐量大約都只有每秒 0.3–0.5 個請求。這個上限是 Craigslist 設定的,不是 Python 的問題。

步驟 7:把 Craigslist 資料匯出為 CSV、JSON 或 Google Sheets

儲存你的結果:

# 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)

如果你想直接省略匯出程式碼,Thunderbit 可以直接從瀏覽器免費匯出到 Google Sheets、Excel、Airtable 或 Notion。不過在 Python 工作流程中,CSV 和 JSON 仍是標準輸出格式。你也可以把資料直接丟進 pandas 做分析,或透過 sqlite3 存入資料庫。

用 Python 抓 Craigslist 時,如何避免被封鎖

很多教程對這一段都講得很輕描淡寫。Craigslist 的反機器人系統是自行開發的,不是現成套件,而且有一些特定特徵要特別注意。

craigslist_antibot_ae9ddc3f54.png

使用逼真的請求標頭

Craigslist 會驗證標頭的順序與完整性。如果請求缺少 Sec-Fetch-Dest,或 User-Agent 太舊,就可能在內容回傳前被標記。上面步驟 3 展示的完整 Chrome 120+ 標頭組合,是最低要求。你可以在每個 session 之間,從 5–10 組最近的 Chrome / Firefox 桌面版字串中輪換 User-Agent——但不要在同一個 session 中途更換,因為那看起來很不自然。

缺少 Sec-Fetch-* 標頭,是第一次做爬蟲的人最常被瞬間封鎖的原因。

在每次請求之間加入隨機延遲

根據 多個來源(ScrapingBee、Scraperly、Oxylabs、Multilogin)的共同經驗,搜尋頁之間建議維持 隨機 2–5 秒,詳細頁之間則為 3–6 秒。固定間隔很像機器人。請用 time.sleep(random.uniform(2, 5))——千萬不要寫成 time.sleep(2)

視情況輪換代理 IP

Craigslist 會先封鎖整個 AWS、GCP 和 Azure 的 IP 區段。資料中心代理通常一開始就失效。只要超過幾百頁,你就需要 住宅型輪換代理,並且每 20–30 次請求輪換一次。行動代理的偵測風險最低,但費用也最高,大約是 $8–30/GB。

代理類型在 Craigslist 上的偵測風險費用(2025)
資料中心代理非常高——通常第一個請求就被擋$0.50–2/GB
住宅型輪換代理低——建議使用$5–15/GB
行動代理最低$8–30/GB

如果你不想自己管理這些,Thunderbit 的雲端爬取模式會自動處理代理輪換。

妥善處理 CAPTCHA

Craigslist 的 CAPTCHA 在讀取頁面時其實很少出現——大多發生在發文或回覆流程。如果真的出現:至少退避 60 秒、輪換 IP、清除 cookies,並降低速度。持續出現 CAPTCHA 通常代表你的節奏太激進,不是要靠解題器硬闖的謎題。

尊重速率限制並實作退避機制

當你碰到速率限制時,Craigslist 會回傳 403(不是 429)。403 代表目前 IP 已經被列入拒絕名單——不要盲目重試。請輪換 IP、更換 UA,然後等待。

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 秒
    status_forcelist=[429, 500, 502, 503, 504],
    allowed_methods={"GET"},
    respect_retry_after_header=True,
)
adapter = HTTPAdapter(max_retries=retry)
session.mount("https://", adapter)

再補一個技巧:社群回報一致指出,目標城市當地時間凌晨 2 點到 6 點 是最安全的抓取時段,封鎖率比白天低約 30–40%。

TLS 指紋辨識——最隱性的陷阱

Craigslist 的 bot 層會檢查 TLS ClientHello。Python 的 requests 函式庫(基於 OpenSSL)所產生的 JA3 指紋,和任何真實瀏覽器都不完全一致。即使你把 User-Agent 設得很完美,只要 TLS 指紋不像瀏覽器,仍然會被識別出來。解法是使用 curl_cffi 並設定 impersonate="chrome124",模擬 Chrome 的 TLS 握手:

from curl_cffi import requests as cffi_requests

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

如果你在乾淨的住宅 IP、正確標頭都已設定好的情況下,仍然遇到無法解釋的 403,那幾乎可以判定是 TLS 指紋辨識造成的。

Craigslist robots.txt、服務條款與道德爬取

大多數教程不是直接略過這一段,就是在 FAQ 裡用一句話帶過。考量 Craigslist 曾經在與爬蟲相關的爭議中,對 RadPad 贏得一筆 $6,050 萬判決(2017),這部分值得更完整地說明。

Craigslist 的 robots.txt 到底寫了什麼

robots.txt 檔案 出乎意料地簡短。它只有一個 User-agent: * 區塊,並且只禁止了七個路徑:

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

這七個全都是互動式或會改變狀態的端點:回覆、檢舉、推薦、寄給朋友等。刊登頁面(/search/...、單筆貼文 URL)並沒有被禁止。 雖然沒有 Crawl-delay 指令,但 Craigslist 仍會透過 IP 封鎖自行限制。

城市子網域也會提供 sitemap,例如 https://newyork.craigslist.org/sitemap/index.xml,這是官方可被搜尋引擎發現的刊登路徑。

法律先例:哪些案件真正重要

Craigslist v. 3Taps(2013,2015 和解): 3Taps 抓取 Craigslist 刊登並轉售。當 Craigslist 發出停止通知並封鎖他們的 IP 後,3Taps 改用輪換代理繞過封鎖。法院認定,在明確撤銷授權後仍繞過 IP 封鎖,屬於 CFAA 下的「未經授權」。3Taps 最終 以 100 萬美元和解

Meta v. Bright Data(2024): 較新的判決認為,Meta 的 TOS 不能禁止對公開可得資料進行登出狀態的爬取。法院指出,未登入的爬蟲「與一般訪客處於同樣的位置」。這對 2024–2025 年的爬蟲最重要——如果你從不建立 Craigslist 帳號、不登入,只存取公開可見頁面,服務條款未必能以合約方式對你生效。

實務上的結論: 在 Van Buren(2021)與 hiQ v. LinkedIn(2022)之後,針對公開可存取頁面的 CFAA 風險大幅降低。但州法層級的侵權主張(動產侵入、非法挪用)仍然存在——這也是 3Taps 和 RadPad 6,050 萬美元判決背後的關鍵。

以上僅供資訊參考,不構成法律建議。如果你要商業化地抓取 Craigslist,請先諮詢律師。

實用的道德爬取檢查清單

  • ✅ 遵守 robots.txt 的每一條 Disallow,尤其是那七個動作端點
  • ✅ 每個 IP 在 24 小時內保持遠低於 1,000 頁(Craigslist 的 TOS 規定超過此門檻後,每頁 $0.25 可視為約定損害賠償)
  • ✅ 保持登出狀態——不要為了爬蟲去建立 Craigslist 帳號
  • ✅ 在明確封鎖後,不要再用代理繞過 IP 禁止(這正是 3Taps 失敗的原因)
  • ✅ 請求之間加入延遲——至少 2–5 秒
  • ✅ 不要抓取個人聯絡資訊用來發垃圾訊息
  • ✅ 不要重新散布原始 Craigslist 資料,或把它包裝成自己的平台內容
  • ✅ 資料用途應以合法研究、分析或個人使用為主
  • ✅ 在可行時,優先使用已公開的 sitemap,而不是暴力爬取
  • ✅ 如果你要儲存資料,請在匯入時去除個資(電子郵件、電話號碼)

如果你想更深入了解,我們也寫了一篇關於 網頁爬取法律影響 的完整指南。

Python vs. 無程式碼:哪種方式更適合你?

因素Python(requests + BS4)Thunderbit(無程式碼)
設定時間30–60 分鐘(安裝、寫程式)2 分鐘(安裝 Chrome 擴充功能)
需要的技術能力中階 Python不需要
客製化程度完全掌控邏輯、欄位與流程AI 自動偵測欄位;使用者可調整
擴展性幾乎無上限(搭配代理與排程)可用排程爬蟲處理重複任務
防封鎖處理手動(標頭、延遲、代理、TLS)內建(雲端爬取)
匯出選項CSV、JSON(自行寫程式)Google Sheets、Excel、Airtable、Notion——免費
最適合誰開發者、資料科學家、客製化管線業務團隊、房地產經紀人、營運經理

如果你需要完全客製化、打算把資料串進更大的資料管線,或者想清楚知道底層到底怎麼運作,就用 Python。若你想快速得到結果,不想寫或維護程式,就用 Thunderbit。兩者都合理,重點在於你的使用情境,以及你想花時間在終端機還是瀏覽器裡。

結語

Craigslist 是一個涵蓋房屋、汽車、工作、服務、零工等多個領域、持續更新的豐富資料來源——而且因為沒有公開 API,爬取幾乎是唯一能大規模取得結構化資料的方法。2025 年真正有效的做法是:從搜尋結果中擷取內嵌 JSON-LD(而不是脆弱的 CSS 選擇器),使用 requests + BeautifulSoup(而不是 Selenium),加入帶有 Sec-Fetch-* 的真實標頭、隨機化延遲,若要抓幾百頁以上,則使用住宅型代理。

JSON-LD 方法是相較於舊教程最大的進步。它更快、更能抵抗版面變動,也完全不需要 JavaScript 渲染。把它和上面的防封鎖策略搭配起來,你就能避開大多數爬蟲最常遇到的 403 問題。

如果你想完全跳過程式碼,Thunderbit Chrome 擴充功能 只要點幾下,就能抓取任何 Craigslist 分類並直接匯出到你偏好的試算表或資料庫。如果你想更深入,我們的 如何用 Python 做網頁爬蟲網頁爬蟲最佳實務 也會更完整地介紹基礎概念。

試用 Thunderbit 抓取 Craigslist

試用 AI 網頁爬蟲抓取 Craigslist 資料 Get Started Free

常見問題

抓取 Craigslist 合法嗎?

Craigslist 的服務條款禁止自動化爬取,並包含約定損害賠償條款(每天超過 1,000 頁後,每頁 $0.25)。不過,近期法院判決——尤其是 Meta v. Bright Data(2024)與 hiQ v. LinkedIn(2022)——已縮小對公開可得資料、且未登入狀態下爬取的 CFAA 責任。州法層級的侵權主張(例如動產侵入)仍然存在,特別是商業重分發時。請遵守 robots.txt、保持登出、加入延遲,且不要散布原始資料。以上僅為一般資訊,不是法律建議。

Craigslist 有公開 API 嗎?

沒有。Craigslist 只提供給已核准付費刊登者使用的只寫入 Bulk Posting Interface(BAPI)。沒有公開的讀取 API、沒有開發者入口,也沒有可用於資料擷取的分級方案。你在第三方平台看到的所有「Craigslist API」產品,本質上都是非官方爬蟲。

為什麼我的 Craigslist 爬蟲一直壞掉?

幾乎都是因為 HTML 結構變了。Craigslist 在 2023–2024 年重寫了搜尋結果標記,像 .result-row.result-info 這類舊選擇器已經不再適用。請改用內嵌 JSON-LD 方法(解析 script#ld_searchpage_results),會穩定得多。另外也要確認你的標頭包含 Sec-Fetch-*,少了它們很容易立刻被封鎖。

不用 Python 也能抓 Craigslist 嗎?

可以。Thunderbit 的 AI 網頁爬蟲 Chrome 擴充功能可用於任何 Craigslist 頁面——公寓、汽車、工作、服務都行。點擊「AI 建議欄位」可自動偵測欄位,點擊「爬取」即可擷取資料,並可免費匯出到 Google Sheets、Excel、Airtable 或 Notion。無需寫程式、無需設定、也不用管理代理。

我多久抓一次 Craigslist 才不會被封?

若使用單一住宅 IP,並在頁面之間加入隨機 2–5 秒延遲,較可持續的吞吐量大約是每秒 0.3–0.5 次請求。每個 IP 在 24 小時內保持低於 1,000 頁,可同時避免封鎖和 Craigslist TOS 的約定損害賠償門檻。在離峰時段(目標城市當地時間凌晨 2–6 點)抓取,可將封鎖率降低約 30–40%。若量更大,請每 20–30 次請求輪換一次住宅代理。

延伸閱讀

Ke
Ke
Thunderbit 技術長|資深資料科學家與機器學習專家 Ke Shen 在機器學習與資料科學領域擁有近十年經驗,畢業於哥倫比亞大學,曾任 Walmart Labs 資深資料科學家。他精通 Python、R、Java 與統計學,且具備深受同儕認可的深厚專業,分享如何將複雜的 AI 演算法從理論落實到可投入生產的架構的實戰見解。
目錄

只要提問,就能抓取網頁

用白話告訴它你要什麼,或者更好,什麼都不用說。

立即體驗 Thunderbit free
使用 AI 擷取資料
輕鬆將資料轉移到 Google Sheets、Airtable 或 Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week