Craigslist 目前在約 700 個本地站點上,每月仍吸引大約 ——而且依然沒有公開 API。如果你想從那些租屋資訊、二手車、工作職缺或零工廣告中取得結構化資料,爬蟲幾乎是唯一選擇。
不過,Craigslist 自家的反機器人機制相當嚴格。它不用 Cloudflare 或 DataDome,而是採用自建的 nginx 速率限制系統,經過十多年持續打磨。只要操作不對,連第二口咖啡都還沒喝完,你就可能直接拿到 403。這篇指南就是我花了大量時間測試各種方法後整理出的成果:一份適用於 2025 年、可跨分類使用的 Python 教學,重點涵蓋 JSON-LD 抽取法(相較舊教程,這是最大的升級)、實際可行的防封鎖策略、法規與合規風險,以及一個不寫程式也能拿到資料的無程式碼替代方案。
用 Python 抓 Craigslist 是什麼意思?
用 Python 抓取 Craigslist,就是用程式自動造訪 Craigslist 頁面,擷取你需要的結構化資訊——像是標題、價格、描述、圖片、地點、刊登日期——再把它存進試算表、資料庫或 JSON 檔。
Python 之所以成為首選,是因為它的函式庫生態非常完整。結合 requests、BeautifulSoup、lxml 和 curl_cffi,你可以在不到 100 行內做出一個可用的 Craigslist 爬蟲。社群規模也很大,所以當 Craigslist 改版時(這確實會發生),通常已經有人先找到解法。
最重要的一點是:Craigslist 。它唯一正式的程式介面是 Bulk Posting Interface(BAPI),而且是只寫入不讀取——只允許已核准的付費刊登者提交內容,不能用來抓取列表。你在第三方平台看到的任何「Craigslist API」產品,本質上都是非官方爬蟲,而不是被授權的端點。想拿大量資料,就得自己爬。
為什麼要抓 Craigslist?實際應用場景
Craigslist 不只是拿來找二手沙發的地方,它其實是一個龐大、持續更新的多領域資料集。以下是實際會從中受益的族群:
| 應用場景 | 受益對象 | 可擷取內容 |
|---|---|---|
| 租屋與房價監控 | 房地產經紀人、租客、PropTech 公司 | 價格、坪數、房間數、社區、經緯度 |
| 二手車市場分析 | 車商、消費者 App、研究人員 | 價格、品牌、車型、年份、里程、車況 |
| 招聘市場研究 | 招募人員、勞動經濟學者、人力分析師 | 職稱、薪資、雇用類型、刊登日期 |
| 開發潛在客戶 | 業務團隊、服務供應商 | 聯絡資訊、公司名稱、服務區域 |
| 競品價格分析 | 在地服務商、電商營運團隊 | 服務價格、說明、服務範圍 |
最常被引用的學術案例之一是 ——約 50 萬筆美國二手車刊登、共 26 個變數,成為數十篇論文的基礎,其中還包括一篇 2024 年的 ResearchGate 研究,分析美國二手車市場動態。對沖基金也曾購買彙整後的 Craigslist 租屋資料,用來研究租金趨勢。而業務團隊則經常抓取 services 和 gigs 分類來開發名單。
算起來其實很簡單:人工複製貼上 8 小時,和一個做得好的爬蟲只要大約 10 分鐘。

用 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 + BeautifulSoup | Selenium | Playwright |
|---|---|---|---|
| 速度 | 每秒 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,而且完全不需要程式碼。流程如下:
- 打開任一 Craigslist 搜尋結果頁(公寓、汽車、工作——任何分類都可以)。
- 在 Thunderbit 側邊欄點擊 「AI 建議欄位」。AI 會讀取頁面,自動辨識像標題、價格、地點和連結這些欄位。
- 點擊 「爬取」——資料會在幾秒內完成擷取。
- 使用 子頁爬取 進入每筆刊登的詳細頁,補充完整描述、電話、圖片與屬性。
- 直接匯出到 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": []}
如果 tag 是 None,代表該分類沒有 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 會驗證標頭的順序與完整性。如果請求缺少 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 分類並直接匯出到你偏好的試算表或資料庫。如果你想更深入,我們的 與 也會更完整地介紹基礎概念。
常見問題
抓取 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 次請求輪換一次住宅代理。
延伸閱讀
