Парсер Craigslist на Python: пошаговое руководство

Craigslist по-прежнему работает на обычном HTML, без тяжелого барьера в виде JavaScript-приложения, без бесконечных запросов на вход. Это делает его один из самых доступных сайтов для любого пользователя впервые изучаете веб-скрапинг Craigslist. Но «доступный» не значит «без правил». Между ограничениями скорости, меняющейся разметкой страниц и позицией самого Craigslist в отношении автоматизированного доступа, скрапер Craigslist на Python требует немного больше внимания, чем базовый учебный скрипт.
В этом руководстве рассматривается создание полноценного проекта парсера Craigslist на Python с нуля. Вы напишете собственный код на Requests и BeautifulSoup, извлечёте из страницы заголовки, цены, локации и URL и экспортируете всё в аккуратный файл CSV. Попутно мы рассмотрим юридические вопросы, которые люди всегда задают перед тем, как начать скрапинг Craigslist, и что делать, когда ваши запросы начинают блокироваться.
Зачем скрейпить Craigslist?
Craigslist — один из крупнейших источников неотфильтрованных данных объявлений в реальном времени в интернете. Между вами и самой публикацией нет никакого агрегатора.
Некоторые из самых распространённых причин, по которым люди создают скрейпер:
- Маркетинговые исследования — отслеживание того, что продается, где и по какой цене в пределах региона
- Мониторинг аренды — один из крупных сценариев использования это парсинг объявлений о жилье на craigslist, чтобы находить новые квартиры сразу после публикации, до того как их разберут
- Поиск подержанных автомобилей — сравнение запрашиваемых цен на конкретную марку и модель в разных городах
- Отслеживание цен — наблюдение за категорией на протяжении недель или месяцев, чтобы выявить тенденции
- Конкурентный анализ — продавцы проверяют, по каким ценам выставлены похожие объявления в их нише
Простой скрипт, который каждые несколько часов загружает страницу с результатами поиска, способен самостоятельно ответить на большинство этих вопросов.
Законен ли парсинг Craigslist?
Это зависит от того, что вы парсите, как вы к этому получаете доступ и что вы делаете с данными потом. Ничего из написанного здесь не является юридической консультацией. Если вы создаете что-то коммерческое, обратитесь к настоящему юристу и прочитайте Условия использования Craigslist самостоятельно.
Условия использования Craigslist в отношении автоматизированного скрапинга
Условия использования Craigslist запрещают автоматизированный сбор данных. Они охватывают ботов, скрипты и другие автоматизированные инструменты, что ясно дает понять, что массовый сбор данных не разрешен. Хотя многие разработчики парсят Craigslist. Учтите, что это может нарушать Условия использования сайта, даже если технически это возможно.
Robots.txt
Файл robots.txt на Craigslist указывает, каких областей автоматизированные краулеры должны избегать, включая страницы для ответа на объявления и другие внутренние функции. Соблюдение политики robots.txt Craigslist в отношении скрапинга демонстрирует ответственный подход, даже несмотря на то, что сам по себе robots.txt юридически не обязателен. Он также отражает намерение сайта ограничить автоматизированный доступ.
Судебные иски по поводу скрапинга Craigslist
Craigslist подавал в суд на компании, которые массово парсили объявления и повторно публиковали эти данные в коммерческих целях. Эти дела касались крупных компаний, а не отдельных лиц, собирающих небольшие объемы данных. Если вы планируете парсить Craigslist, ознакомьтесь с Условиями использования сайта и не используйте спарсенный контент в коммерческих целях.
Инструменты, которые вам понадобятся
В этом проекте используется короткий стандартный стек Python. Здесь ничего не требует платной лицензии или сложной установки.
- Python 3.9+ — подойдёт любая свежая версия
- Запросы — выполняет HTTP-запросы и управление заголовками
- BeautifulSoup — разбирает полученный HTML в структуру, к которой можно делать запросы
- lxml — быстрый бэкенд-парсер, который BeautifulSoup может использовать вместо встроенного парсера Python
- csv — часть стандартной библиотеки Python, используется для записи результатов
- Резидентные прокси NodeMaven — опционально, но полезно, когда вы запускаете парсер регулярно или по нескольким городам, не рискуя пометкой вашего IP
Дополнительное чтение: Веб-скрейпинг на Python: полное руководство
Понимание HTML-структуры Craigslist
Прежде чем писать любой код для парсинга, полезно понимать, что именно вы парсите. Страница результатов поиска Craigslist (например, страница с объявлениями о квартирах для конкретного города) построена из повторяющегося списка карточек объявлений. Каждая карточка представляет собой один HTML-элемент списка, который содержит:
- Элемент link который содержит текст заголовка объявления и его полный URL
- Значение цены, если у объявления она есть
- Район или область метка, показывающая примерное местоположение товара
Каждая карточка объявления следует одному и тому же повторяющемуся шаблону, что как раз и делает Craigslist пригодным для парсинга с помощью CSS-селекторов. Вы находите одну карточку, смотрите, как она размечена, а затем говорите BeautifulSoup «найди мне каждый элемент, который выглядит вот так».
Сложность в том, что Craigslist периодически меняет имена классов и разметку по мере обновления своего фронтенда. Селектор, который работает сегодня, через полгода может ничего не вернуть. Это нормально для парсинга любого сайта, и именно поэтому приведенный ниже код написан так, чтобы корректно обрабатывать сбои и выводить предупреждение вместо аварийного завершения, когда поле отсутствует.
Создайте скрапер для Craigslist на Python
Это ядро руководства. Мы будем строить парсер небольшими шагами, чтобы каждая часть была понятной, а затем соберем все вместе в один скрипт.
Шаг 1: Установка зависимостей
Откройте терминал и установите два внешних пакета, необходимых для этого проекта:
Запросы выполняет сетевой запрос. BeautifulSoup парсит HTML. lxml это движок парсера, который мы передадим BeautifulSoup потому что он заметно быстрее, чем стандартный.
Шаг 2: Отправьте HTTP-запрос
Здесь стоит отметить несколько моментов. User-Agent заголовок — это самый важный заголовок для запросов такого рода. Без него многие серверы, включая Craigslist, будут либо возвращать урезанный ответ, либо блокировать запрос полностью. А прокси аргумент необязателен и по умолчанию остаётся пустым.
Шаг 3: Разбор HTML
Этот шаг намеренно небольшой. Все, что он делает, это передает текст в BeautifulSoup и возвращает древовидную структуру, по которой вы можете искать с помощью CSS-селекторов, подобно тому, как вы нацеливались бы на элементы в таблице стилей.
Шаг 4: Извлечение данных объявления
Вот где находится сама логика парсинга. Craigslist оборачивает каждый результат в элемент списка, и мы захватываем каждый из них на странице.
Обратите внимание на запасной вариант. Вместо того чтобы предполагать, что один селектор всегда совпадёт, функция пробует второй, более свободный шаблон, если первый вернул пустой результат. Это небольшая привычка, которая экономит массу времени на отладку, когда разметка сайта меняется.
Шаг 5: Извлечение заголовка, цены, местоположения и URL
Каждое поле извлекается независимо и по умолчанию использует безопасное резервное значение вместо того, чтобы вызывать ошибку. Это важно, потому что реальные страницы объявлений устроены беспорядочно: у некоторых объявлений нет цены, у некоторых нет чёткой метки местоположения, а скрипт, который падает на первом же отсутствующем поле, бесполезен для чего-либо, что вы планируете запускать без присмотра.
Шаг 6: Экспорт в CSV
csv.DictWriter автоматически сопоставляет ключи каждого словаря со строкой заголовков, так что пока каждый словарь объявления содержит одни и те же четыре ключа, всё работает без дополнительных настроек.
Собираем всё воедино
Запустите этот файл напрямую, и он загрузит одну страницу поиска, извлечёт все объявления, которые сможет найти, выведет первые пять в терминал и запишет полный набор в craigslist_listings.csv. Отсюда вы можете перебирать несколько URL-адресов категорий или городов, добавить пагинацию, переходя по ссылке «next» на странице, или запланировать запуск скрипта по таймеру для постоянного отслеживания цен или аренды.
Важно: Разметка Craigslist время от времени меняется. Если find_listing_cards() внезапно возвращает пустой список, откройте страницу поиска в браузере, изучите карточку объявления и обновите селектор в шаге 4, чтобы он соответствовал тому, что вы видите.
Избегайте блокировок при скрейпинге Craigslist
Как только вы выходите за пределы нескольких тестовых запросов, реальным узким местом становится блокировка. Craigslist не публикует точные лимиты частоты запросов, но отправка запросов слишком быстро с одного IP — самый быстрый способ начать получать пустые страницы.
Несколько привычек существенно помогут:
- Добавляйте задержки между запросами. Несколько секунд между загрузками страниц имитируют обычный просмотр гораздо лучше, чем плотный цикл.
- Заложите повторные попытки с задержкой (backoff), так что один неудавшийся запрос не прерывает весь процесс скрейпинга.
- Ротация IP-адресов как только вы начинаете отправлять значительное количество запросов. Один IP, который многократно долбит одну и ту же страницу поиска, бросается в глаза.
- Задавайте реалистичные заголовки, не только User-Agent, но и Accept-Language и Referer там, где это имеет смысл.
- Соблюдайте лимиты даже когда они не публикуются, снижайте темп, если начинаете видеть больше ошибок, чем обычно.
Резидентские прокси может повысить надёжность скрейпинга, направляя запросы через реальные домашние IP-адреса вместо легко распознаваемых IP дата-центров. Прокси NodeMaven хорошо подходят для скрейпинга Craigslist, тогда как мобильные прокси. полезны для рабочих процессов, которые также включают управление аккаунтами.

Перед запуском своего скрейпера вы можете проверить настройку с помощью бесплатных инструментов NodeMaven. проверка пропускной способности проверяет подключение через прокси, Инструмент IP Lookup подтверждает IP и местоположение, которые видят сайты.
Craigslist scraper API против Python-скрапера
У Craigslist нет официального публичного API для результатов поиска, и отчасти именно поэтому так много людей в итоге пишут собственные инструменты. Это оставляет несколько реалистичных путей, каждый из которых предполагает свой компромисс между усилиями и контролем.
| Подход | Трудозатраты на настройку | Гибкость | Лучше всего подходит для |
| Requests + BeautifulSoup | Низкий | Высокая для статичных страниц | Страницы поиска, простое извлечение данных, учебные проекты |
| Scrapy | Medium | Высокая, создана для масштабирования | Большие, постоянные, многостраничные обходы |
| Selenium | Средне-высокий | Полный контроль над браузером | Страницы, требующие рендеринга JavaScript или взаимодействия |
| Сторонний API для парсинга | Очень низко | Ограничено тем, что поддерживает провайдер | Быстрые прототипы, не-разработчики |
Поскольку страницы поиска Craigslist рендерятся на сервере и не требуют JavaScript для отображения объявлений, Requests и BeautifulSoup обычно являются самым простым и быстрым путём, что как раз и является причиной, по которой мы построили скрейпер в этом руководстве на их основе.
Типичные ошибки при скрейпинге Craigslist
Несколько ошибок появляются постоянно, как только вы запускаете скрапер по-настоящему, а не на одной тестовой странице.
- 403 Запрещено — обычно отсутствующий или подозрительный заголовок User-Agent либо IP, который уже был помечен. Сначала перепроверьте свои заголовки, а затем подумайте о смене IP.
- 429 Слишком много запросов — вы отправляете запросы быстрее, чем сервер готов их обслуживать. Добавьте задержки и замедлите цикл.
- CAPTCHA-задачи — признак того, что ваш паттерн трафика выглядит автоматизированным. Снижение частоты запросов и ротация IP помогают уменьшить, как часто это срабатывает.
- Пустые ответы — иногда сервер возвращает корректный статус 200, но страницу без реального контента, что часто является скрытой блокировкой. Проверьте длину исходного HTML, прежде чем решить, что ваш парсер сломан.
- Отсутствующие селекторы — ваш код парсинга ничего не возвращает, хотя сам запрос отработал нормально. Почти всегда это означает, что Craigslist изменил имена классов; осмотрите страницу вручную и обновите свои селекторы.
Альтернативные фреймворки для скрапинга
Requests и BeautifulSoup покрывают большинство потребностей в скрейпинге Craigslist, но стоит знать и об альтернативах.
Scrapy — это полноценный фреймворк для скрейпинга со встроенным планированием запросов, повторными попытками и конвейерами для экспорта данных. Он лучше подходит, когда проект вырастает из одного скрипта в нечто, что вы запускаете по расписанию на множестве страниц.
Selenium управляет настоящим браузером, что важно для сайтов, которые формируют своё содержимое с помощью JavaScript после загрузки страницы. Результатам поиска Craigslist это не нужно, но это правильный инструмент, если вы когда-нибудь расширитесь на сайты, которым это требуется.
Playwright — более новая альтернатива Selenium со схожим назначением: полная автоматизация браузера, как правило быстрее и удобнее в работе при современном скрапинге с несколькими вкладками или контекстами.
Заключение
Теперь у вас есть рабочий парсер данных Craigslist: он отправляет запрос с правильными заголовками, разбирает возвращённый HTML, извлекает заголовок, цену, местоположение и URL для каждого объявления на странице и записывает результаты в CSV. Это надёжная основа, отслеживаете ли вы цены аренды, исследуете объявления о подержанных автомобилях или наблюдаете за определённой категорией с течением времени.
Здесь важны как юридическая, так и техническая стороны. Прочитайте Условия использования Craigslist, поддерживайте разумный объём запросов и относитесь к robots.txt как к сигналу, который стоит уважать, даже там, где он не охватывает всё, что вас интересует.
По мере того как ваш скрейпинг перерастает несколько ручных запусков и превращается в задачи по расписанию или сбор данных по нескольким городам, ротация IP перестаёт быть необязательной. Именно в этот момент прокси оправдывают своё место в стеке.


