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

最後更新於 April 16, 2026

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

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

用 Python 抓 Craigslist 是什麼意思?

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

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

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

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

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

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

最常被引用的學術案例之一是 ——約 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 挑戰。所有仍在維護中的 幾乎都用 requests + BeautifulSoup 或 Scrapy,沒有用 Selenium 或 Playwright。這不是巧合——瀏覽器自動化框架會多吃數百 MB 記憶體、速度慢 10 到 100 倍,還會留下更明顯的指紋,但卻沒有實質好處。

我的建議:

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

如果你想看更完整的比較,我們另外寫了 的整理文章。

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

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

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

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

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

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

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

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

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

步驟 1:設定 Python 環境

安裝必要函式庫:

1pip install requests beautifulsoup4 lxml

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

1pip install curl_cffi

你的 import 區塊如下:

1import requests
2from bs4 import BeautifulSoup
3import json
4import csv
5import time
6import random

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

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

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

1from urllib.parse import urlencode
2BASE = "https://{city}.craigslist.org/search/{slug}"
3def build_url(city, slug, **params):
4    return f"{BASE.format(city=city, slug=slug)}?{urlencode(params)}"
5# 範例:紐約公寓,1500–3000 美元,含照片
6url = build_url("newyork", "apa", min_price=1500, max_price=3000, hasPic=1)
7print(url)
8# 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 區塊:

1HEADERS = {
2    "User-Agent": (
3        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
4        "AppleWebKit/537.36 (KHTML, like Gecko) "
5        "Chrome/124.0.0.0 Safari/537.36"
6    ),
7    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
8    "Accept-Language": "en-US,en;q=0.9",
9    "Accept-Encoding": "gzip, deflate, br",
10    "Referer": "https://www.craigslist.org/",
11    "Sec-Fetch-Dest": "document",
12    "Sec-Fetch-Mode": "navigate",
13    "Sec-Fetch-Site": "same-origin",
14    "Upgrade-Insecure-Requests": "1",
15}
16session = requests.Session()
17r = session.get(url, headers=HEADERS, timeout=20)
18r.raise_for_status()
19soup = BeautifulSoup(r.text, "html.parser")
20tag = soup.select_one("script#ld_searchpage_results")
21data = json.loads(tag.text) if tag else {"itemListElement": []}

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

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

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

1listings = []
2for entry in data["itemListElement"]:
3    item = entry["item"]
4    offers = item.get("offers", {}) or {}
5    addr = (offers.get("availableAtOrFrom") or {}).get("address", {})
6    listings.append({
7        "name":     item.get("name"),
8        "url":      offers.get("url"),
9        "price":    offers.get("price"),
10        "currency": offers.get("priceCurrency"),
11        "locality": addr.get("addressLocality"),
12        "region":   addr.get("addressRegion"),
13        "image":    item.get("image"),
14    })
15print(f"Found {len(listings)} listings")

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

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

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

1def fetch_detail(url, session):
2    r = session.get(url, headers=HEADERS, timeout=20)
3    r.raise_for_status()
4    s = BeautifulSoup(r.text, "html.parser")
5    body = s.select_one("#postingbody")
6    mp = s.select_one("#map")
7    return {
8        "description": body.get_text("\n", strip=True) if body else None,
9        "attributes":  [x.get_text(" ", strip=True) 
10                        for x in s.select("p.attrgroup span, div.attrgroup .attr")],
11        "lat": mp.get("data-latitude") if mp else None,
12        "lng": mp.get("data-longitude") if mp else None,
13        "images": [img["src"] for img in s.select("div.gallery img")],
14    }
15for item in listings:
16    item.update(fetch_detail(item["url"], session))
17    time.sleep(random.uniform(3, 6))  # 關鍵:防封鎖抖動

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

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

Craigslist 用 ?s=120 這個偏移參數做分頁。每頁顯示 120 筆,最大偏移通常是 2999。

1def iter_all(city, slug, max_pages=25, **filters):
2    for page in range(max_pages):
3        offset = page * 120
4        url = build_url(city, slug, s=offset, **filters)
5        r = session.get(url, headers=HEADERS, timeout=20)
6        r.raise_for_status()
7        soup = BeautifulSoup(r.text, "html.parser")
8        tag = soup.select_one("script#ld_searchpage_results")
9        if not tag:
10            break
11        data = json.loads(tag.text)
12        items = data.get("itemListElement", [])
13        if not items:
14            break
15        for entry in items:
16            item = entry["item"]
17            offers = item.get("offers", {}) or {}
18            yield {
19                "name": item.get("name"),
20                "url": offers.get("url"),
21                "price": offers.get("price"),
22            }
23        time.sleep(random.uniform(2.5, 5.0))

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

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

儲存你的結果:

1# CSV
2with open("craigslist.csv", "w", newline="", encoding="utf-8") as f:
3    w = csv.DictWriter(f, fieldnames=listings[0].keys())
4    w.writeheader()
5    w.writerows(listings)
6# JSON
7with open("craigslist.json", "w", encoding="utf-8") as f:
8    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,然後等待。

1from requests.adapters import HTTPAdapter
2from urllib3.util.retry import Retry
3retry = Retry(
4    total=5,
5    backoff_factor=1.5,  # 1.5、3、6、12、24 秒
6    status_forcelist=[429, 500, 502, 503, 504],
7    allowed_methods={"GET"},
8    respect_retry_after_header=True,
9)
10adapter = HTTPAdapter(max_retries=retry)
11session.mount("https://", adapter)

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

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

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

1from curl_cffi import requests as cffi_requests
2r = cffi_requests.get(url, headers=HEADERS, impersonate="chrome124")

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

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

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

Craigslist 的 robots.txt 到底寫了什麼

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

1Disallow: /reply
2Disallow: /fb/
3Disallow: /suggest
4Disallow: /flag
5Disallow: /mf
6Disallow: /mailflag
7Disallow: /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 最終

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 規定超過此門檻後,每頁 可視為約定損害賠償)
  • ✅ 保持登出狀態——不要為了爬蟲去建立 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。若你想快速得到結果,不想寫或維護程式,就用 。兩者都合理,重點在於你的使用情境,以及你想花時間在終端機還是瀏覽器裡。

結語

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

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

如果你想完全跳過程式碼, 只要點幾下,就能抓取任何 Craigslist 分類並直接匯出到你偏好的試算表或資料庫。如果你想更深入,我們的 也會更完整地介紹基礎概念。

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

常見問題

抓取 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
CTO @ Thunderbit. Ke is the person everyone pings when data gets messy. He's spent his career turning tedious, repetitive work into quiet little automations that just run. If you've ever wished a spreadsheet could fill itself in, Ke has probably already built the thing that does it.
目錄

試試 Thunderbit

只要 2 次點擊,就能抓取潛在客戶與其他資料。AI 驅動。

取得 Thunderbit 免費使用
用 AI 擷取資料
輕鬆將資料轉移到 Google Sheets、Airtable 或 Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week