איך אני מחלץ נתונים מ-Craigslist עם Python (בלי להיחסם)

עודכן לאחרונה ב- April 16, 2026
איך אני מחלץ נתונים מ-Craigslist עם Python (בלי להיחסם)

Craigslist עדיין מושך בערך 108 מיליון כניסות בחודש דרך כ־700 אתרים מקומיים — ועדיין אין לו API ציבורי. אם אתם רוצים נתונים מובְנים מתוך מודעות דירות, רכבים יד שנייה, משרות או גיגים, scraping הוא כמעט תמיד הפתרון היחיד.

אבל מערכת ההגנה המותאמת של Craigslist נגד בוטים היא אגרסיבית במיוחד. היא לא משתמשת ב-Cloudflare או ב-DataDome — אלא במנגנון rate limiting משלה מבוסס nginx, ששופר במשך יותר מעשור. אם תפגעו בו לא נכון, תקבלו 403 עוד לפני שתספיקו לשתות את הקפה של הבוקר. הקדשתי לא מעט זמן לבדיקת גישות שונות מול ההגנות של Craigslist, והמדריך הזה הוא התוצאה: מדריך Python מעודכן ל-2025, שמתאים לכל קטגוריה, כולל שיטת החילוץ דרך JSON-LD (השיפור המשמעותי ביותר לעומת מדריכים ישנים), אסטרטגיות אמיתיות להימנעות מחסימה, סקירה משפטית, וגם חלופה ללא קוד למי שרוצה רק את הנתונים בלי לכתוב שורת קוד אחת.

מה זה אומר לגרד את Craigslist עם Python?

Web scraping של Craigslist אומר להשתמש בסקריפטים ב-Python כדי לבקר אוטומטית בעמודי Craigslist, לחלץ את הנתונים המובְנים שמעניינים אתכם — כותרות, מחירים, תיאורים, תמונות, מיקומים, תאריכי פרסום — ולשמור אותם בגיליון אלקטרוני, מסד נתונים או קובץ JSON.

Python הוא השפה המועדפת לזה בזכות האקוסיסטם העשיר של הספריות שלו. עם requests, BeautifulSoup, lxml ו-curl_cffi, אפשר לבנות scraper עובד ל-Craigslist בפחות מ־100 שורות. הקהילה עצומה, כך שכאשר Craigslist משנה משהו (וזה קורה), כמעט תמיד כבר יש מישהו שמצא את הפתרון.

הנקודה החשובה ביותר: ל-Craigslist אין API ציבורי לקריאה. הממשק הרשמי היחיד הוא Bulk Posting Interface (BAPI), והוא מיועד לכתיבה בלבד — הוא מאפשר למפרסמים מאושרים להעלות מודעות, לא לשלוף אותן. כל מוצר "Craigslist API" שתראו בפלטפורמות צד שלישי הוא למעשה scraper לא רשמי, לא endpoint מורשה. אם אתם צריכים נתונים בהיקף גדול — מגרדים.

למה לגרד Craigslist? שימושים אמיתיים

Craigslist הוא לא רק מקום למצוא ספה משומשת. זהו מאגר נתונים עצום שמתעדכן כל הזמן בעשרות תחומים. הנה מי באמת יכול להרוויח מחילוץ הנתונים ממנו:

שימושמי מרוויחמה מחלצים
מעקב אחר מחירי דירות ושכירותסוכני נדל"ן, שוכרים, חברות PropTechמחיר, שטח, מספר חדרי שינה, שכונה, קואורדינטות
ניתוח שוק הרכב המשומשסוכנויות רכב, אפליקציות צרכניות, חוקריםמחיר, יצרן, דגם, שנה, ק"מ, מצב הרכב
מחקר שוק העבודהמגייסים, כלכלני עבודה, אנליסטים של כוח אדםכותרת, שכר, סוג העסקה, תאריך פרסום
יצירת לידיםצוותי מכירות, נותני שירותפרטי קשר, שמות עסקים, אזור שירות
תמחור תחרותיספקי שירות מקומיים, תפעול ecommerceתמחור שירותים, תיאורים, אזורי שירות

הדוגמה האקדמית הכי מצוטטת היא Kaggle "Used Cars Dataset" — בערך 500,000 מודעות רכב משומש מארה"ב עם 26 משתנים, ששימשה בסיס לעשרות מאמרים, כולל מחקר ב-ResearchGate מ-2024 על דינמיקת שוק הרכב המשומש בארה"ב. קרנות גידור רוכשות נתוני שכירות מאוחדים מ-Craigslist לצורך מחקר מגמות שכר דירה. וגם צוותי מכירות מגרדים בקביעות את קטגוריות השירותים והגיגים לצורך יצירת לידים.

החישוב פשוט: 8 שעות של העתקה והדבקה ידנית מול בערך 10 דקות עם scraper בנוי היטב.

craigslist_stats_55285c3a34.png

לגרד את Craigslist עם Python: כל קטגוריה, לא רק רכבים

כמעט כל מדריך שמצאתי לגרידת Craigslist עוסק רק במכירת רכבים — כמו לכתוב מדריך ל-Google שמכסה רק חיפוש תמונות. ל-Craigslist יש עשרות קטגוריות, ומבנה ה-URL שונה בין אחת לשנייה.

המבנה תמיד הוא: https://{city}.craigslist.org/search/{category_slug}

מחליפים את תת-הדומיין של העיר ואת ה-slug, ומקבלים תחום אחר לגמרי. הנה טבלת עזר של הקטגוריות הפופולריות ביותר (נבדק באפריל 2025):

קטגוריהSlug ב-URLשדות נפוצים לחילוץ
דירות / דיור/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
postedToday24 השעות האחרונות&postedToday=1
sortמיון&sort=priceasc
sהיסט עימוד (120 לעמוד)?s=120

לכן URL כמו https://newyork.craigslist.org/search/apa?min_price=1500&max_price=3000&hasPic=1 מחזיר דירות בניו יורק במחיר שבין 1,500 ל-3,000 דולר עם תמונות. כל סקריפט Python במדריך הזה עובד על כל הקטגוריות האלה — פשוט מחליפים את ה-slug.

סלקטורים ל-HTML של Craigslist ב-2025: ישן מול חדש (והקיצור דרך של JSON)

הסיבה מספר אחת לכך שסקריפטים ל-Craigslist נשברים היא שינוי במבנה ה-HTML. אם אתם עוקבים אחרי מדריך מ-2022 שמבקש מכם לכוון ל-.result-row או .result-info, הסקריפט שלכם כבר לא רלוונטי.

Craigslist כתב מחדש את מבנה תוצאות החיפוש שלו ב-2023–2024. שמות המחלקות הישנים עדיין מקוננים בתוך wrappers חדשים, אבל כיוון אליהם בראש עץ ה-DOM מחזיר רשימה ריקה. הנה מה השתנה:

אלמנטסלקטור ישן (לפני 2024)סלקטור נוכחי (2025)
מיכל של המודעה.result-info.cl-search-result
קישור הכותרת.result-title.posting-title a
מחיר.result-price.priceinfo
מטא־דאטה (אזור).result-hood.meta

אבל הנה התובנה האמיתית — זו שמבדילה scraper עדכני ל-2025 מכל השאר: לא צריך בכלל לפענח HTML בתוצאות החיפוש.

Craigslist מטמיע עכשיו כל מודעה גלויה בתוך תגית <script id="ld_searchpage_results"> כנתוני JSON-LD מובְנים. קריאה אחת של requests.get() מחזירה את כל ה-schema.org ItemList עם כל המודעות בעמוד — כותרת, מחיר, מטבע, מיקום, URL לתמונה, וקישור לעמוד המלא. בלי רינדור JavaScript. בלי שבריריות של CSS selectors.

הגישה של JSON-LD מהירה יותר, יציבה יותר, ופחות מועדת להישבר כש-Craigslist משנה את ה-UI. זה מה שכל מאגר GitHub שמתחזק כיום משתמש בו, וזה גם מה שנשתמש בו במדריך למטה.

שימו לב: בלוק ה-JSON-LD קיים בקטגוריות עם מחירים — דירות (apa), למכירה (sss), רכבים (cta), דיור (hhh). הוא לרוב חסר או דל בקטגוריות משרות (jjj), גיגים (ggg), קהילה (ccc) ושירותים (bbb), כי למודעות האלה אין schema.org/Offer עם מחיר. בקטגוריות האלה כדאי לחזור לנתיב HTML של .cl-search-result.

בחירת סטאק 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
מורכבות התקנהנמוכהבינוניתבינונית
עמידות נגד בוטיםנמוכה (צריך headers/proxies)בינונית (דפדפן אמיתי)בינונית-גבוהה
שימוש אידיאלי ב-Craigslistתוצאות חיפוש (JSON-LD)עמודי פירוט עם תוכן דינמיגרידה אסינכרונית בהיקף גדול
עקומת למידהידידותי למתחיליםבינוניתבינונית

העמודים של Craigslist נבנים בצד השרת. בלוק ה-JSON-LD כבר נמצא ב-HTML הראשוני. אין אתגר JavaScript במסלולי קריאה. כל scraper פעיל ומתוחזק של Craigslist ב-GitHub משתמש ב-requests + BeautifulSoup או Scrapy. אפס שימוש ב-Selenium או ב-Playwright. זה לא במקרה — framework לאוטומציית דפדפן מוסיף מאות מגה־בייט של זיכרון, האטה של פי 10–100, וטביעת אצבע בולטת יותר, בלי כל תועלת.

ההמלצה שלי:

  • requests + BS4: להתחיל כאן. זה משתלב מצוין עם שיטת החילוץ של JSON-LD ומכסה 95% מצרכי הגרידה של Craigslist.
  • Selenium: רק אם צריך אינטראקציה עם תוכן דינמי בעמודי פירוט מסוימים (נדיר ב-Craigslist).
  • Playwright: אם אתם מגדילים להיקפים של אלפי עמודים עם concurrency אסינכרוני — אבל בכנות, צוואר הבקבוק הוא ה-rate limiter של Craigslist, לא התפוקה של הספרייה.

כיסינו בנפרד גם את ההשוואה בין Playwright ל-Puppeteer ואת הסיכום של כלי ה-web scraping הטובים ביותר ל-Python אם תרצו פירוט מלא.

גרדו את Craigslist בלי לכתוב Python Get Started Free

החלופה ללא קוד: לגרד את Craigslist בלי לכתוב Python

לפני שנכנסים לקוד — הסעיף הזה מיועד למי שאינו מפתח. סוכני נדל"ן, צוותי מכירות, מנהלי תפעול — אם אתם רק רוצים את הנתונים ולא רוצים להתעסק בכתיבת Python, יש מסלול מהיר יותר.

Thunderbit הוא AI web scraper שפועל כהרחבת Chrome. הוא יכול לגרד את Craigslist בכ־2 קליקים, בלי צורך בקוד. כך זה עובד:

  1. נכנסים לכל עמוד תוצאות של Craigslist (דירות, רכבים, משרות — כל קטגוריה).
  2. לוחצים על "AI Suggest Fields" בסרגל הצד של Thunderbit. ה-AI קורא את הדף ומזהה אוטומטית עמודות כמו כותרת המודעה, מחיר, מיקום וקישור.
  3. לוחצים על "Scrape" — הנתונים נשלפים תוך שניות.
  4. משתמשים ב-Subpage Scraping כדי להיכנס לכל עמוד פירוט ולהעשיר את הנתונים עם תיאורים מלאים, מספרי טלפון, תמונות ותכונות.
  5. מייצאים ישירות ל-Google Sheets, Excel, Airtable או Notion — בחינם לגמרי.

לצרכים חוזרים — למשל מעקב יומי אחרי מחירי דירות או צילום שבועי של מודעות משרות — ה-Scheduled Scraper של Thunderbit מאפשר לתאר את לוח הזמנים בשפה פשוטה, והוא פועל אוטומטית. בלי cron jobs, בלי הקמת שרת.

Thunderbit גם מטפל באמצעי ההגנה נגד בוטים דרך מצב Cloud Scraping, כך שאין צורך להסתבך עם proxies מסתובבים או בניית headers ידנית. אם תרצו לנסות, התקינו את Thunderbit Chrome Extension ותראו בעצמכם.

אם אתם כן רוצים שליטה מלאה והתאמה אישית, המשיכו לקרוא להדרכה צעד-אחר-צעד ב-Python.

שלב אחר שלב: איך לגרד את Craigslist עם Python (מדריך מלא)

  • רמת קושי: בינונית
  • זמן נדרש: כ־30 דקות (התקנה + גרידה ראשונה)
  • מה צריך: Python 3.8+, דפדפן Chrome (לבדיקת עמודים), טרמינל

שלב 1: הקמת סביבת Python

התקינו את הספריות הנדרשות:

pip install requests beautifulsoup4 lxml

lxml הוא אופציונלי, אבל מאיץ משמעותית את parsing של BeautifulSoup. אם בהמשך תיתקלו בבעיות TLS fingerprinting (עוד על כך בסעיף ההימנעות מחסימה), אפשר להתקין גם curl_cffi:

pip install curl_cffi

בלוק ה-import שלכם:

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

עכשיו אמורה להיות לכם סביבת Python נקייה עם כל התלויות מותקנות.

שלב 2: בניית URL של 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 עם headers מתאימים, ואז פרסו את בלוק ה-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": []}

אם tag הוא None, בלוק ה-JSON-LD לא קיים עבור אותה קטגוריה — חזרו ל-parsing של 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"נמצאו {len(listings)} מודעות")

אמור להופיע משהו כמו "נמצאו 120 מודעות" (Craigslist מציג 120 תוצאות לעמוד). ייתכן שלחלק מהמודעות יהיה None במחיר אם המפרסם לא הזין מחיר — כדאי לטפל בזה בעדינות בהמשך.

שלב 5: גרידת עמודי פירוט עבור נתונים עשירים יותר

תוצאות החיפוש נותנות רק סיכום. לתיאורים מלאים, מאפיינים (חדרי שינה, שטח, מדיניות חיות מחמד), קואורדינטות lat/long ותמונות — צריך להיכנס לעמוד הפירוט של כל מודעה.

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))  # קריטי: jitter נגד חסימה

ה-time.sleep(random.uniform(3, 6)) הוא לא אופציונלי. אם תדלגו עליו, תיתקלו ב-403 תוך כמה עשרות בקשות. עמודי הפירוט נבנים בצד השרת עם סלקטורים יציבים (#titletextonly, #postingbody, #map) שלא השתנו בערך מאז 2017 — אחד הדברים הבודדים ב-Craigslist שבאמת נשארו עקביים.

שלב 6: טיפול בעימוד כדי לגרד את כל התוצאות

Craigslist משתמש בפרמטר היסט ?s=120 לעימוד. כל עמוד מציג 120 תוצאות, וה-offset המקסימלי הוא בדרך כלל 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))

אל תנסו לגרד אלפי עמודים ברצף מהיר. ה-rate limiter של 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.

איך להימנע מחסימה כשמגרדים את Craigslist עם Python

רוב המדריכים מדלגים על החלק הזה או מרפרפים עליו. מערכת האנטי-בוט של Craigslist בנויה בהתאמה אישית, לא מוצר מדף, ויש לה כמה מאפיינים ייחודיים.

craigslist_antibot_ae9ddc3f54.png

להשתמש ב-Request Headers שנראים אמיתיים

Craigslist מאמת גם את סדר ה-headers וגם את השלמות שלהם. בקשה שחסר בה Sec-Fetch-Dest או שיש בה User-Agent ישן תסומן עוד לפני שהיא מגיעה לתוכן. סט ה-headers המלא של Chrome 120+ (שמופיע בשלב 3) הוא המינימום. מומלץ להחליף User-Agent לכל session מבין 5–10 מחרוזות עדכניות של Chrome/Firefox לדסקטופ — אבל לא לשנות באמצע session, כי זה נראה לא טבעי.

חוסר ב-headers מסוג Sec-Fetch-* הוא הסיבה הנפוצה ביותר לכך שסקריפטים חדשים נחסמים מיד.

להוסיף השהיות אקראיות בין בקשות

הקונצנזוס מהקהילה וממקורות רבים (ScrapingBee, Scraperly, Oxylabs, Multilogin) מתכנס ל-2–5 שניות אקראיות בין שליפות של עמודי חיפוש ו-3–6 שניות בין עמודי פירוט. מרווחים קבועים נראים כמו בוט. השתמשו ב-time.sleep(random.uniform(2, 5)) — לעולם לא ב-time.sleep(2).

להחליף Proxies אם עובדים בהיקף גדול

Craigslist חוסם מראש טווחי IP שלמים של AWS, GCP ו-Azure. פרוקסי של data center לעיתים קרובות מתים כבר מהבקשה הראשונה. לכל דבר מעבר לכמה מאות עמודים, תצטרכו residential rotating proxies, ולסובב אותם כל 20–30 בקשות. פרוקסי סלולריים הם בעלי הסיכון הנמוך ביותר לזיהוי, אבל עולים $8–30 לכל GB.

סוג Proxyסיכון זיהוי ב-Craigslistעלות (2025)
Datacenterגבוה מאוד — לעיתים נחסם כבר בבקשה הראשונה$0.50–2/GB
Residential rotatingנמוך — מומלץ$5–15/GB
Mobileהנמוך ביותר$8–30/GB

מצב Cloud Scraping של Thunderbit מטפל בסיבוב proxies אוטומטית אם אתם מעדיפים לא לנהל את זה בעצמכם.

לטפל ב-CAPTCHA בצורה נכונה

CAPTCHA ב-Craigslist נדירים במסלולי קריאה — הם מופיעים בעיקר בתהליכי פרסום/תגובה. אם אחד מופיע: עצרו לפחות ל-60 שניות, החליפו IP, נקו cookies והאטו. CAPTCHA חוזרים הם סימן לכך שהקצב שלכם אגרסיבי מדי, לא חידה שצריך לפרוץ בכוח עם solver.

לכבד Rate Limits וליישם Backoff

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 Fingerprinting — המלכודת הנסתרת

שכבת האנטי-בוט של Craigslist בודקת את ה-TLS ClientHello. ספריית requests של Python (שמבוססת על OpenSSL) מייצרת JA3 fingerprint שלא תואם לדפדפן אמיתי. User-Agent מושלם בשילוב fingerprint TLS לא-דפדפני הוא חוסר התאמה שניתן לזהות. הפתרון הוא curl_cffi עם impersonate="chrome124", שמדמה את handshake של Chrome:

from curl_cffi import requests as cffi_requests

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

אם אתם מקבלים 403 לא מוסברים עם IP-ים residential נקיים ו-headers נכונים — סביר מאוד שזה ה-TLS fingerprinting.

robots.txt של Craigslist, תנאי השימוש, וגרידה אתית

רוב המדריכים או מדלגים על זה לגמרי, או קוברים שורה אחת ב-FAQ. בהתחשב בכך ש-Craigslist זכתה בפסק דין של 60.5 מיליון דולר נגד scraper (RadPad, 2017), זה ראוי ליותר מהערת שוליים.

מה באמת כתוב ב-robots.txt של Craigslist

קובץ ה-robots.txt קצר באופן מפתיע. יש בו בלוק יחיד של User-agent: * עם שבעה נתיבים חסומים בלבד:

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

כל השבעה הם endpoints אינטראקטיביים/משני-מצב: reply, flag, suggest, email-a-friend. עמודי המודעות (/search/..., כתובות של פוסטים בודדים) אינם חסומים. אין הוראת Crawl-delay, אף ש-Craigslist אוכף בפועל מגבלה כזו באמצעות חסימות IP.

תתי-הדומיין של הערים כן מפרסמים sitemaps — למשל https://newyork.craigslist.org/sitemap/index.xml — שהם המסלול הרשמי לגילוי מודעות.

תקדימים משפטיים: המקרים החשובים

Craigslist v. 3Taps (2013, הסתיים בפשרה ב-2015): 3Taps גרדו מודעות מ-Craigslist ומכרו אותן מחדש. כש-Craigslist שלחה התראה והחסימה את ה-IP-ים שלהם, 3Taps עקפו את החסימה באמצעות proxies מסתובבים. בית המשפט קבע שעקיפת חסימות IP לאחר שלילה מפורשת של הרשאה מהווה פעולה "without authorization" לפי ה-CFAA. 3Taps הגיעו לפשרה של מיליון דולר.

Meta v. Bright Data (2024): פסק דין עדכני יותר קבע שתנאי השימוש של Meta אינם יכולים לאסור גרידה של נתונים ציבוריים כאשר המשתמש אינו מחובר. בית המשפט קבע שסקרייפר שאינו מחובר נמצא "באותו מצב של מבקר". זהו פסק הדין החשוב ביותר עבור סקרייפרים ב-2024–2025 — אם אתם לא יוצרים חשבון ב-Craigslist, לא מתחברים, וניגשים רק לעמודים ציבוריים, ייתכן שתנאי השימוש אינם ניתנים לאכיפה נגדכם כחוזה.

המסקנה המעשית: הסיכון לפי CFAA צומצם משמעותית אחרי Van Buren (2021) ו-hiQ v. LinkedIn (2022) עבור עמודים ציבוריים. אבל תביעות נזיקין לפי דיני מדינות (כמו trespass-to-chattels, misappropriation) עדיין קיימות — וזה מה שהוביל גם להסדר של 3Taps וגם לפסק הדין של 60.5 מיליון דולר נגד RadPad.

זהו מידע כללי בלבד, לא ייעוץ משפטי. אם אתם מגרדים Craigslist לשימוש מסחרי, כדאי להתייעץ עם עורך דין.

צ'ק-ליסט אתי לגרידה בפועל

  • ✅ לכבד כל Disallow ב-robots.txt — במיוחד את שבעת ה-endpoints של פעולות
  • ✅ להישאר הרבה מתחת ל-1,000 עמודים לכל 24 שעות לכל IP (בתנאי השימוש של Craigslist יש $0.25 לעמוד מעל הסף הזה כפיצוי מוסכם)
  • ✅ להישאר לא מחוברים — לא ליצור חשבון Craigslist לצורך גרידה
  • ✅ לא לעקוף חסימות IP באמצעות proxies אחרי חסימה מפורשת (זה מה שהפיל את 3Taps)
  • ✅ להוסיף השהיות בין בקשות — מינימום 2–5 שניות
  • ✅ לא לגרד מידע אישי ליצירת ספאם
  • ✅ לא להפיץ מחדש נתונים גולמיים מ-Craigslist או להציג אותם כפלטפורמה שלכם
  • ✅ להשתמש בנתונים למחקר לגיטימי, ניתוח, או שימוש אישי
  • ✅ להעדיף sitemaps שפורסמו על פני crawling בכוח, כשאפשר
  • ✅ להסיר PII (אימיילים, מספרי טלפון) כבר בקליטה אם אתם שומרים את הנתונים

כתבנו מדריך מעמיק יותר על ההשלכות המשפטיות של web scraping אם תרצו תמונה מלאה.

Python מול No-Code: איזו גישה מתאימה לכם?

גורםPython (requests + BS4)Thunderbit (ללא קוד)
זמן הקמה30–60 דק׳ (התקנה, כתיבת קוד)2 דקות (התקנת תוסף Chrome)
מיומנות טכנית נדרשתPython ברמה בינוניתאין
התאמה אישיתשליטה מלאה על לוגיקה, שדות וזרימהAI מזהה שדות אוטומטית; אפשר לכוון ידנית
סקיילבלתי מוגבל (עם proxies, תזמון)Scheduled Scraper למשימות חוזרות
טיפול נגד חסימהידני (headers, השהיות, proxies, TLS)מובנה (Cloud Scraping)
אפשרויות ייצואCSV, JSON (תכתבו לבד)Google Sheets, Excel, Airtable, Notion — בחינם
מתאים במיוחד למפתחים, data scientists, פייפליינים מותאמיםצוותי מכירות, סוכני נדל"ן, מנהלי תפעול

בחרו ב-Python אם אתם צריכים התאמה אישית מלאה, מתכננים לשלב את זה בפייפליין נתונים גדול יותר, או רוצים להבין בדיוק מה קורה מתחת למכסה המנוע. בחרו ב-Thunderbit אם אתם רוצים תוצאות מהר, בלי לכתוב או לתחזק קוד. שתי האופציות לגיטימיות. זה תלוי בתרחיש השימוש שלכם והאם אתם מעדיפים לעבוד בטרמינל או בדפדפן.

לסיכום

Craigslist הוא מקור נתונים עשיר ומתעדכן כל הזמן בתחומי דיור, רכב, משרות, שירותים, גיגים ועוד — ובלי API ציבורי, scraping הוא הדרך היחידה להשיג ממנו נתונים מובְנים בקנה מידה גדול. הגישה שבאמת עובדת ב-2025: לחלץ את ה-JSON-LD המוטמע מתוצאות החיפוש (ולא CSS selectors שבירים), להשתמש ב-requests + BeautifulSoup (ולא Selenium), להוסיף headers מציאותיים עם שדות Sec-Fetch-*, לרנדומז השהיות, ולהשתמש ב-residential proxies אם אתם עוברים כמה מאות עמודים.

שיטת ה-JSON-LD היא השיפור הגדול ביותר מול מדריכים מיושנים. היא מהירה יותר, עמידה יותר לשינויי עיצוב, ולא דורשת רינדור JavaScript. אם מוסיפים לה את אסטרטגיות ההימנעות מחסימה שלמעלה, אפשר להימנע מה-403 שמכשילים את רוב הסקריפטים.

אם תרצו לדלג על הקוד לגמרי, Thunderbit Chrome Extension יכול לגרד כל קטגוריה ב-Craigslist בכמה קליקים ולייצא ישירות לגיליון או למסד הנתונים המועדף עליכם. ואם תרצו להעמיק, המדריכים שלנו על איך לגרד אתרים עם Python ועל שיטות עבודה מומלצות ל-web scraping מכסים את היסודות בפירוט רב יותר.

נסו את Thunderbit לגרידת Craigslist

נסו AI Web Scraper עבור נתוני Craigslist Get Started Free

שאלות נפוצות

האם מותר לגרד את Craigslist מבחינה חוקית?

תנאי השימוש של Craigslist אוסרים גרידה אוטומטית וכוללים סעיף פיצוי מוסכם ($0.25 לעמוד מעל 1,000 ביום). עם זאת, פסקי דין עדכניים — במיוחד Meta v. Bright Data (2024) ו-hiQ v. LinkedIn (2022) — צמצמו את האחריות לפי CFAA עבור גרידה של נתונים ציבוריים כאשר המשתמש אינו מחובר. תביעות נזיקין לפי דיני מדינה (כמו trespass-to-chattels) עדיין מהוות סיכון, במיוחד בהפצה מסחרית מחדש. כבדו robots.txt, הישארו לא מחוברים, הוסיפו השהיות, ואל תפיצו מחדש נתונים גולמיים. זהו מידע כללי בלבד, לא ייעוץ משפטי.

האם ל-Craigslist יש API ציבורי?

לא. Craigslist מציע רק Bulk Posting Interface (BAPI) לכתיבה בלבד עבור מפרסמים מאושרים בתשלום. אין API ציבורי לקריאה, אין פורטל מפתחים, ואין tier מוגבל־קצב לשליפת נתונים. כל "Craigslist API" שתראו בפלטפורמות צד שלישי הוא scraper לא רשמי.

למה הסקריפט שלי ל-Craigslist ממשיך להישבר?

כמעט תמיד בגלל שינויים במבנה ה-HTML. Craigslist כתב מחדש את markup של תוצאות החיפוש ב-2023–2024, ומדריכים שמשתמשים בסלקטורים ישנים כמו .result-row או .result-info כבר לא עובדים. עברו לשיטת ה-JSON-LD המוטמע (parse של script#ld_searchpage_results) כדי לקבל גישה עמידה הרבה יותר. בדקו גם שה-headers שלכם כוללים שדות Sec-Fetch-* — חוסר בהם גורם לחסימה מיידית.

אפשר לגרד את Craigslist בלי Python?

כן. תוסף ה-Chrome של Thunderbit, שהוא AI web scraper, עובד על כל עמוד ב-Craigslist — דירות, רכבים, משרות, שירותים. לוחצים על "AI Suggest Fields" כדי לזהות עמודות אוטומטית, לוחצים על "Scrape" כדי לחלץ נתונים, ואז מייצאים ל-Google Sheets, Excel, Airtable או Notion בחינם. בלי קוד, בלי התקנה מורכבת, בלי ניהול proxies.

כל כמה זמן אפשר לגרד את Craigslist בלי להיחסם?

עם IP residential יחיד, תפוקה בת-קיימא היא בערך 0.3–0.5 בקשות לשנייה, עם השהיות אקראיות של 2–5 שניות בין עמודים. כדאי להישאר מתחת ל-1,000 עמודים לכל 24 שעות לכל IP כדי להימנע גם מחסימה וגם מסף הפיצוי המוסכם בתנאי השימוש של Craigslist. גרידה בשעות שפל (2–6 לפנות בוקר לפי שעון העיר היעד) מפחיתה את שיעור החסימות בכ־30–40%. לנפחים גדולים יותר, כדאי לסובב residential proxies כל 20–30 בקשות.

למידע נוסף

Ke
Ke
CTO ב-Thunderbit | מדען נתונים בכיר ומומחה ב-ML עם כמעט עשור של ניסיון בלמידת מכונה ובמדע הנתונים, קה שן הוא בוגר אוניברסיטת קולומביה ולשעבר מדען נתונים בכיר ב-Walmart Labs. עם מומחיות עמוקה ומוכרת בקרב עמיתים ב-Python, R, Java וסטטיסטיקה, הוא משתף תובנות מוכחות-בקרב על המעבר מאלגוריתמי AI מורכבים מתיאוריה לארכיטקטורה ברמת production.
תוכן עניינים

גרדו דף אינטרנט פשוט על ידי בקשה

תגידו מה צריך באנגלית פשוטה. או אפילו לא צריך להגיד כלום.

נסו את Thunderbit חינם
חילוץ נתונים באמצעות AI
העבירו נתונים בקלות ל-Google Sheets, Airtable או Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week