Craigslist до сих пор собирает около 108 миллионов посещений в месяц на примерно 700 локальных сайтах — и при этом по-прежнему не имеет публичного API. Если тебе нужны структурированные данные из объявлений об аренде, подержанных авто, вакансий или подработок, парсинг — по сути единственный рабочий вариант.
При этом собственная антибот-система Craigslist работает очень жёстко. Здесь нет ни Cloudflare, ни DataDome — у сайта свой rate limiter на базе nginx, который шлифовали больше десяти лет. Ошибёшься с запросом — и уже ко второму кофе можешь получить жёсткий 403. Я потратил немало времени, тестируя разные подходы к защите Craigslist, и этот гид — результат этих экспериментов: актуальный на 2025 год Python-урок для любых категорий, с разбором метода извлечения JSON-LD (это главное улучшение по сравнению со старыми инструкциями), честными стратегиями обхода банов, юридическим контекстом и no-code-альтернативой для тех, кому нужны данные, а не код.
Что значит парсить Craigslist на Python?
Веб-парсинг Craigslist — это использование Python-скриптов для автоматического посещения страниц Craigslist, извлечения нужных структурированных данных — заголовков, цен, описаний, изображений, локаций, дат публикации — и сохранения их в таблицу, базу данных или JSON-файл.
Python здесь — естественный выбор благодаря богатой экосистеме библиотек. С помощью requests, BeautifulSoup, lxml и curl_cffi можно собрать рабочий парсер Craigslist меньше чем за 100 строк. Сообщество огромное, поэтому когда Craigslist что-то меняет (а он это делает), решение обычно уже кто-то нашёл.
Главное, что нужно знать: Craigslist не предоставляет публичный API для чтения. Единственный официальный программный интерфейс — Bulk Posting Interface (BAPI), и он только для записи: он позволяет одобренным платным размещателям публиковать объявления, но не получать их. Любой продукт с названием «Craigslist API» на сторонних платформах — это неофициальный парсер, а не санкционированная точка доступа. Если тебе нужны массовые данные, их приходится парсить.
Зачем парсить Craigslist? Реальные сценарии использования
Craigslist — это не просто место, где ищут диван б/у. Это огромный, постоянно обновляемый датасет по десяткам направлений. Вот кому реально полезен его парсинг:
| Сценарий | Кому полезно | Что извлекаете |
|---|---|---|
| Мониторинг цен на квартиры и аренду | Риелторы, арендаторы, PropTech-компании | Цена, площадь, спальни, район, широта/долгота |
| Анализ рынка подержанных авто | Автодилеры, потребительские приложения, исследователи | Цена, марка, модель, год, пробег, состояние |
| Исследование рынка труда | Рекрутеры, экономисты по труду, аналитики workforce | Название вакансии, компенсация, тип занятости, дата публикации |
| Лидогенерация | Отделы продаж, сервисные компании | Контакты, названия компаний, зона обслуживания |
| Анализ конкурентных цен | Локальные сервисы, ecommerce-операторы | Цены на услуги, описания, обслуживаемые районы |
Самый часто цитируемый академический пример — набор данных Kaggle «Used Cars Dataset»: около 500 000 объявлений о подержанных авто в США с 26 переменными. На его основе написаны десятки работ, включая исследование 2024 года на ResearchGate о динамике рынка подержанных авто в США. Хедж-фонды покупали агрегированные данные Craigslist по аренде для анализа трендов. А sales-команды регулярно парсят категории услуг и подработок для лидогенерации.
Математика тут простая: 8 часов ручного копипаста против примерно 10 минут с нормально сделанным парсером.

Парсинг Craigslist на Python: все категории, а не только автомобили
Почти все найденные мной гайды по парсингу Craigslist описывают только cars-for-sale — это как писать руководство по Google, но рассматривать только поиск по изображениям. У Craigslist десятки категорий, и URL-структуры у них разные.
Формат почти всегда такой: https://{city}.craigslist.org/search/{category_slug}
Меняешь поддомен города и slug — и парсишь совершенно другую категорию. Ниже — справочная таблица самых популярных разделов (проверено в апреле 2025):
| Категория | URL slug | Типичные поля для извлечения |
|---|---|---|
| Apartments / Housing | /search/apa | Цена, площадь, спальни, локация, правила для питомцев |
| Cars & Trucks | /search/cta | Цена, марка, модель, год, пробег |
| Jobs | /search/jjj | Название, компания, зарплата, тип занятости |
| Services | /search/bbb | Название, описание, телефон, район |
| Gigs | /search/ggg | Название, оплата, дата, категория |
| For Sale (general) | /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 |
То есть 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 годах. Старые классы теперь вложены в новые обёртки, но если искать их на верхнем уровне 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 rendering. Никакой хрупкости CSS-селекторов.
Подход с JSON-LD быстрее, стабильнее и гораздо реже ломается, когда Craigslist меняет интерфейс. Его используют все активно поддерживаемые репозитории на GitHub, и именно его мы будем применять ниже.
Есть одно исключение: JSON-LD-блок есть для категорий с ценой — apartments (apa), for sale (sss), cars (cta), housing (hhh). Для jobs (jjj), gigs (ggg), community (ccc) и services (bbb) он часто отсутствует или неполный, потому что в этих объявлениях нет schema.org/Offer pricing. Для таких категорий переходи на HTML-путь через .cl-search-result.
Что выбрать для Python-стека: Requests + BS4, Selenium или Playwright?
Это вопрос, который всплывает почти в каждом scraping-форуме: «Какую библиотеку использовать?» Для Craigslist ответ проще, чем для большинства сайтов.
| Фактор | requests + BeautifulSoup | Selenium | Playwright |
|---|---|---|---|
| Скорость | 5–15 страниц/сек (упирается в сеть) | 0.3–1 страница/сек | 0.5–2 страницы/сек |
| Контент, рендерящийся через JS | Нет | Да | Да |
| Память | ~30–60 MB | ~400–700 MB | ~300–500 MB |
| Сложность настройки | Низкая | Средняя | Средняя |
| Устойчивость к антибот-защите | Низкая (нужны заголовки/прокси) | Средняя (реальный браузер) | Средне-высокая |
| Лучший кейс для Craigslist | Результаты поиска (JSON-LD) | Страницы объявлений с динамическим контентом | Масштабный асинхронный парсинг |
| Порог входа | Для начинающих | Средний | Средний |
Страницы Craigslist рендерятся на сервере. JSON-LD-блок уже есть в исходном HTML. На стороне чтения здесь нет JavaScript-челленджа. Каждый активно поддерживаемый Craigslist scraper на GitHub использует requests + BeautifulSoup или Scrapy. Ни один не использует Selenium или Playwright. Это не случайность: браузерная автоматизация добавляет сотни мегабайт памяти, замедляет работу в 10–100 раз и даёт более заметный fingerprint без какой-либо пользы.
Моя рекомендация:
- requests + BS4: начни с этого. Идеально сочетается с JSON-LD-извлечением и закрывает 95% задач по парсингу Craigslist.
- Selenium: только если нужно взаимодействовать с динамическим контентом на отдельных страницах объявлений (на Craigslist это редкость).
- Playwright: если ты масштабируешься до тысяч страниц с асинхронной конкуррентностью — но, честно говоря, узкое место здесь не библиотека, а rate limiter Craigslist.
Отдельно мы уже разбирали сравнение Playwright vs. Puppeteer и обзор лучших Python-инструментов для веб-парсинга, если тебе нужен полный разбор.
Парсите Craigslist без Python-кода Get Started Free
No-code альтернатива: парсинг Craigslist без написания Python
Небольшой отход от кода — этот раздел для тех, кто не разработчик. Риелторы, sales-команды, операционные менеджеры — если тебе нужны только данные, а Python писать не хочется, есть более быстрый путь.
Thunderbit — это AI web scraper в виде расширения для Chrome. Он умеет парсить Craigslist примерно за 2 клика, без кода. Рабочий процесс такой:
- Открой любую страницу результатов поиска Craigslist (квартиры, машины, вакансии — любую категорию).
- Нажми «AI Suggest Fields» в боковой панели Thunderbit. ИИ прочитает страницу и автоматически определит столбцы вроде названия объявления, цены, локации и ссылки.
- Нажми «Scrape» — данные будут извлечены за секунды.
- Используй Subpage Scraping, чтобы открыть страницу каждого объявления и обогатить данные полным описанием, телефонами, изображениями и атрибутами.
- Экспортируй данные прямо в Google Sheets, Excel, Airtable или Notion — совершенно бесплатно.
Для регулярных задач — например, ежедневного мониторинга цен на аренду или еженедельных снимков вакансий — у Thunderbit есть Scheduled Scraper: ты просто задаёшь расписание простым языком, и он запускается автоматически. Никаких cron-задач, никакой настройки сервера.
Thunderbit также обходит антибот-защиту через Cloud Scraping mode, так что тебе не нужно думать о ротации прокси или настройке заголовков. Если хочешь попробовать, установи Thunderbit Chrome Extension и посмотри сам.
Если тебе нужен полный контроль и кастомизация, читай дальше — ниже пошаговый разбор на Python.
Пошагово: как парсить Craigslist на Python (полный туториал)
- Сложность: средняя
- Время: ~30 минут (установка + первый парсинг)
- Что понадобится: Python 3.8+, браузер Chrome (для инспекции страниц), терминал
Шаг 1: Настрой Python-среду
Установи нужные библиотеки:
pip install requests beautifulsoup4 lxml
lxml необязателен, но заметно ускоряет парсинг BeautifulSoup. Если позже столкнёшься с проблемами TLS fingerprinting (об этом подробнее в разделе про антибан), можно также поставить curl_cffi:
pip install curl_cffi
Импорты:
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-запрос с корректными заголовками, а затем распарьси 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-блок для этой категории отсутствует — тогда переходи к 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)}")
Ожидай что-то вроде «Found 120 listings» — Craigslist показывает 120 результатов на странице. У некоторых объявлений price может быть None, если автор не указал цену — это нормально, просто обрабатывай такие случаи в логике дальше.
Шаг 5: Парси страницы объявлений для более полных данных
Страницы поиска дают только краткую информацию. Чтобы получить полное описание, атрибуты (спальни, площадь, правила для питомцев), координаты и изображения, нужно открыть страницу каждого объявления.
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))
Не пытайся забирать тысячи страниц без пауз. Rate limiter Craigslist работает на уровне IP, и устойчивый throughput с одного адреса обычно не превышает примерно 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 проверяет порядок и полноту заголовков. Запрос без Sec-Fetch-Dest или со старым User-Agent будет отмечен ещё до загрузки контента. Минимум — полный набор заголовков Chrome 120+ (показан в Шаге 3 выше). Меняй User-Agent между 5–10 свежими desktop-строками Chrome/Firefox на уровне сессии, но не переключай его в середине сессии — это выглядит неестественно.
Отсутствие Sec-Fetch-* — самая частая причина мгновенных блокировок у новичков.
Добавляй случайные задержки между запросами
По общему мнению сообщества из нескольких источников (ScrapingBee, Scraperly, Oxylabs, Multilogin), оптимальные паузы — случайные 2–5 секунд между страницами поиска и 3–6 секунд между страницами объявлений. Постоянные интервалы выглядят как работа бота. Используй time.sleep(random.uniform(2, 5)) — не time.sleep(2).
Используй прокси-ротацию, если парсишь в больших объёмах
Craigslist заранее блокирует целые диапазоны IP AWS, GCP и Azure. Дата-центровые прокси часто умирают ещё на первом запросе. Если ты идёшь дальше нескольких сотен страниц, нужны residential rotating-прокси, с ротацией каждые 20–30 запросов. Мобильные прокси дают самый низкий риск обнаружения, но стоят $8–30 за GB.
| Тип прокси | Риск обнаружения на Craigslist | Стоимость (2025) |
|---|---|---|
| Datacenter | Очень высокий — часто блокируются уже на первом запросе | $0.50–2/GB |
| Residential rotating | Низкий — рекомендовано | $5–15/GB |
| Mobile | Самый низкий | $8–30/GB |
Если не хочешь управлять этим вручную, режим Cloud Scraping в Thunderbit автоматически занимается ротацией прокси.
Корректно обрабатывай CAPTCHA
CAPTCHA на Craigslist на страницах чтения встречается редко — чаще она появляется на этапах публикации или ответа. Если CAPTCHA всё же появилась: сделай паузу минимум на 60 секунд, смени IP, очисти cookies и снизь скорость. Постоянные CAPTCHA — это сигнал, что ты слишком агрессивен, а не головоломка, которую нужно «ломать» решателем.
Уважай лимиты и используй backoff
Craigslist возвращает 403 (а не 429), когда ты упираешься в rate limit. 403 означает, что текущий IP попал в deny list — не повторяй запросы вслепую. Сменить IP, User-Agent и подожди.
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. У библиотеки Python requests (на базе OpenSSL) JA3 fingerprint не совпадает ни с одним настоящим браузером. Идеальный User-Agent в сочетании с не-браузерным TLS fingerprint — это заметное несоответствие. Обходной путь — curl_cffi с impersonate="chrome124", который имитирует TLS-рукопожатие Chrome:
from curl_cffi import requests as cffi_requests
r = cffi_requests.get(url, headers=HEADERS, impersonate="chrome124")
Если у тебя возникают необъяснимые 403 при чистых residential-IP и правильных заголовках, почти наверняка причина именно в TLS fingerprinting.
robots.txt, условия использования Craigslist и этичный парсинг
Большинство гидов либо полностью пропускают этот раздел, либо прячут одну строчку в FAQ. Но учитывая, что Craigslist выиграл $60.5 млн по решению суда против одного из парсеров (RadPad, 2017), это заслуживает большего внимания, чем сноска.
Что на самом деле говорит robots.txt Craigslist
Файл robots.txt удивительно короткий. Там всего один блок User-agent: * и семь запрещённых путей:
Disallow: /reply
Disallow: /fb/
Disallow: /suggest
Disallow: /flag
Disallow: /mf
Disallow: /mailflag
Disallow: /eaf
Все семь — это интерактивные или изменяющие состояние endpoints: ответ, жалоба, предложение, «отправить другу по email». Страницы объявлений (/search/..., отдельные URL постов) не запрещены. Директивы Crawl-delay нет, хотя Craigslist всё равно ограничивает доступ через IP-блоки.
Поддомены городов публикуют sitemap — например, https://newyork.craigslist.org/sitemap/index.xml — это официальный путь обнаружения объявлений.
Юридический прецедент: важные дела
Craigslist v. 3Taps (2013, урегулировано в 2015): 3Taps парсил объявления Craigslist и перепродавал их. Когда Craigslist отправил cease-and-desist и заблокировал их IP, 3Taps обошёл блокировку через rotating proxies. Суд постановил, что обход IP-блокировки после явного отзыва разрешения является действием «without authorization» по CFAA. 3Taps урегулировал спор за $1M.
Meta v. Bright Data (2024): более свежее решение показало, что условия использования Meta не могут запрещать парсинг общедоступных данных при выходе из аккаунта. Суд указал, что scraper без логина находится «в тех же условиях, что и обычный посетитель». Это важнейшее решение для парсеров 2024–2025 годов: если ты не создаёшь аккаунт Craigslist, не входишь в систему и работаешь только с публично видимыми страницами, то условия использования могут быть к тебе неприменимы как к договору.
Практический вывод: после решений Van Buren (2021) и hiQ v. LinkedIn (2022) риск по CFAA заметно снизился для общедоступных страниц. Но деликтные иски на уровне штатов — вроде trespass-to-chattels и misappropriation — по-прежнему возможны. Именно они стали причиной и урегулирования 3Taps, и решения на $60.5 млн против RadPad.
Это информационный материал, не юридическая консультация. Если ты коммерчески парсишь Craigslist, поговори с юристом.
Практический чек-лист этичного парсинга
- ✅ Соблюдай все
Disallowв robots.txt — особенно семь action-endpoints - ✅ Держись значительно ниже порога 1 000 страниц за 24 часа на один IP (в условиях Craigslist указаны $0.25 за страницу сверх этого лимита как liquidated damages)
- ✅ Работай без логина — не создавай аккаунт Craigslist для парсинга
- ✅ Не обходи IP-блокировки через прокси после явной блокировки (именно это погубило 3Taps)
- ✅ Делай паузы между запросами — минимум 2–5 секунд
- ✅ Не собирай личные контакты для спама
- ✅ Не перепродавай сырые данные Craigslist и не выдавай их за свою платформу
- ✅ Используй данные только для законных исследований, аналитики или личных задач
- ✅ По возможности опирайся на опубликованные sitemap вместо brute-force crawling
- ✅ Удаляй PII (email, телефоны) при загрузке данных, если хранишь их у себя
У нас есть более подробный материал о правовых аспектах веб-парсинга, если хочешь разобраться глубже.
Python или no-code: что подойдёт именно тебе?
| Фактор | Python (requests + BS4) | Thunderbit (No-Code) |
|---|---|---|
| Время настройки | 30–60 мин (установка, написание кода) | 2 минуты (установить расширение Chrome) |
| Нужен технический уровень | Средний Python | Не нужен |
| Кастомизация | Полный контроль над логикой, полями и потоком | ИИ сам определяет поля; их можно подправить |
| Масштабирование | Практически неограниченно (с прокси и расписанием) | Scheduled Scraper для повторяющихся задач |
| Антибан-защита | Вручную (заголовки, задержки, прокси, TLS) | Встроено (Cloud Scraping) |
| Варианты экспорта | CSV, JSON (пишешь сам) | Google Sheets, Excel, Airtable, Notion — бесплатно |
| Лучше всего подходит | Разработчикам, data scientist’ам, кастомным пайплайнам | Sales-командам, риелторам, операционным менеджерам |
Используй Python, если тебе нужна полная кастомизация, ты планируешь встраивание в более крупный data pipeline или хочешь понимать, что происходит «под капотом». Используй Thunderbit, если хочешь быстро получить результат без написания и поддержки кода. Оба подхода хороши — всё упирается в твою задачу и в то, где тебе комфортнее работать: в терминале или в браузере.
Итоги
Craigslist — это богатый, постоянно обновляемый источник данных по недвижимости, автомобилям, вакансиям, услугам, подработкам и многому другому. А поскольку публичного API нет, парсинг остаётся единственным способом получать структурированные данные в масштабе. Рабочий подход на 2025 год такой: извлекать встроенный JSON-LD из результатов поиска (а не хрупкие CSS-селекторы), использовать requests + BeautifulSoup (а не Selenium), добавлять реалистичные заголовки с полями Sec-Fetch-*, рандомизировать задержки и применять residential-прокси, если ты выходишь за несколько сотен страниц.
Метод с JSON-LD — главное улучшение по сравнению со старыми инструкциями. Он быстрее, устойчивее к изменениям интерфейса и вообще не требует JavaScript rendering. Добавь к нему стратегии антибана из этого гайда — и ты избежишь 403, которые ломают большинство парсеров.
Если ты не хочешь писать код, расширение Thunderbit для Chrome может парсить любую категорию Craigslist в пару кликов и сразу экспортировать данные в нужную таблицу или базу. Если хочешь копнуть глубже, наши гайды о веб-парсинге на Python и лучших практиках веб-парсинга подробно разбирают основы.
Попробовать Thunderbit для парсинга Craigslist
Попробовать AI Web Scraper для данных Craigslist Get Started Free
FAQ
Законно ли парсить Craigslist?
Условия использования Craigslist запрещают автоматизированный парсинг и содержат пункт о liquidated damages ($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 для чтения, developer portal и тарифа с rate limit для получения данных нет. Любой «Craigslist API» на сторонних платформах — это неофициальный парсер.
Почему мой парсер Craigslist постоянно ломается?
Почти всегда из-за изменений HTML-структуры. Craigslist переписал разметку результатов поиска в 2023–2024 годах, и гайды, использующие старые селекторы вроде .result-row или .result-info, больше не работают. Перейди на встроенный JSON-LD-метод (парсинг script#ld_searchpage_results) — он намного устойчивее. Также проверь, что в заголовках есть Sec-Fetch-*: их отсутствие часто приводит к мгновенным блокировкам.
Можно ли парсить Craigslist без Python?
Да. AI web scraper от Thunderbit в виде расширения Chrome работает на любой странице Craigslist — квартиры, авто, вакансии, услуги. Нажми «AI Suggest Fields», чтобы автоматически определить столбцы, нажми «Scrape», чтобы извлечь данные, и бесплатно экспортируй их в Google Sheets, Excel, Airtable или Notion. Без кода, без настройки, без управления прокси.
Как часто можно парсить Craigslist, чтобы не получить бан?
С одним residential-IP устойчивый throughput составляет примерно 0.3–0.5 запроса в секунду при случайных паузах 2–5 секунд между страницами. Держись ниже 1 000 страниц за 24 часа на один IP, чтобы избежать и бана, и порога liquidated damages в условиях Craigslist. Парсинг в непиковые часы (с 2 до 6 утра по местному времени города) снижает вероятность блокировки примерно на 30–40%. Для больших объёмов меняй residential-прокси каждые 20–30 запросов.
Узнай больше
- Как парсить сайты на Python и не получить блокировку
- Как использовать Craigslist Scraper для повышения эффективности работы с данными
- Как написать веб-скрапер на Python: от начала до конца
- Веб-парсинг на Python: как избежать блокировок с помощью умного использования прокси
- Этапы веб-парсинга: как легко парсить сайты на Python


