Craigslistのリスティングをスクレイピングする方法:車両、賃貸、ギグ

Craigslistは、厳しいIPレート制限によって守られたデータの宝庫です。ここでは、都市ごとのURL構造、1ページあたり120件のページング計算、多くの人が見逃すRSSショートカット、そして禁止リストに載らないためのプロキシ設定について説明します。

Craigslistは、数百の都市サイトに広がる膨大な量の利用可能な公開データを持っています。中古車、アパート賃貸、ギグ、販売品、サービスなどです。また、Craigslistは初心者にとってCAPTCHAとIP禁止の壁でもあります。CraigslistはIPアドレスごとに厳しくレート制限を行っています。良いニュースは、サイトのURL構造がシンプルで予測可能であり、多くのガイドが見逃しているRSSショートカットがあることです。ブロックの問題はほぼ完全にIPの衛生問題です。このガイドでは、都市ごとのURLパターン、ページング計算、解析、RSSルート、スクレイパーを禁止リストから外すプロキシ設定について説明します。個人または研究目的でスクレイピングを行い、Craigslistの利用規約を尊重し、これを法的アドバイスではなく一般的な情報として扱ってください。

URLパターンが全ての鍵です

Craigslistは都市サブドメインとカテゴリコードで分かれており、その他はクエリパラメータです。一度形を学べば、どの都市やセクションもターゲットにできます:https://{city}.craigslist.org/search/{category}?query={q}。カテゴリコードは短く、sssは全ての販売品、ctoは所有者による車、apaはアパート、gggはギグです。min_pricemax_priceなどのフィルターをパラメータとして追加します。ページネーションはsパラメータを使用し、各ページは120件の結果を表示します。したがって、ページ2はs=120、ページ3はs=240となります。

import requests
from bs4 import BeautifulSoup

PROXY = "http://USER:PASS@rotating.quantumproxies.io:8000"
PROXIES = {"http": PROXY, "https": PROXY}
UA = ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
      "(KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36")

def build_url(city, category, query, page=0, min_price=None, max_price=None):
    base = f"https://{city}.craigslist.org/search/{category}"
    params = [f"query={query}"]
    if min_price: params.append(f"min_price={min_price}")
    if max_price: params.append(f"max_price={max_price}")
    if page:      params.append(f"s={page * 120}")   # 120 results per page
    return base + "?" + "&".join(params)

url = build_url("minneapolis", "cto", "bmw", page=0, max_price=8000)
r = requests.get(url, headers={"User-Agent": UA}, proxies=PROXIES, timeout=20)

リスティングの解析

検索結果の行は安定したクラスセットでマークされています。リスティングブロックは.result-infoで、内部に.result-title.result-price.result-dateがあります。すべてのフィールドをガードしてください。すべてのリスティングに価格があるわけではありません:

def parse_listings(html):
    soup = BeautifulSoup(html, "html.parser")
    out = []
    for row in soup.select(".result-info"):
        title_el = row.select_one(".result-title")
        price_el = row.select_one(".result-price")
        date_el  = row.select_one(".result-date")
        if not title_el:
            continue
        out.append({
            "title": title_el.get_text(strip=True),
            "url":   title_el.get("href"),
            "price": price_el.get_text(strip=True) if price_el else None,
            "date":  date_el.get("datetime") if date_el else None,
        })
    return out

listings = parse_listings(r.text)
print(len(listings), "listings on this page")

より豊富な記録を得るには、車の走行距離や賃貸のベッドルーム数など、各リスティングURLを追跡し、詳細ページを解析します。それはリクエスト数を倍増させるので、ペースと回転が重要になるところです。

Craigslist検索URLを都市サブドメイン、カテゴリコード、クエリ、sページネーションパラメータに分解する図
CraigslistのURLは完全に予測可能です:都市サブドメイン、カテゴリコード、次にクエリと120ステップのsパラメータです。

多くのガイドが見逃すRSSショートカット

Craigslistには一般公開APIはありませんが、検索結果のRSSフィードを公開しています。任意の検索URLに&format=rssを追加すると、HTMLを解析する代わりに構造化されたXMLフィードを取得できます。これは軽量で、完全な結果ページを繰り返し読み込むよりもアンチボットのヒューリスティックに引っかかりにくく、監視に最適です。保存した検索をスケジュールでポーリングし、新しいアイテムを差分で確認します。HTMLページよりもフィールドが少ない(タイトル、リンク、タイムスタンプ)ので、新鮮さの監視に使用し、価格や詳細が必要な場合はHTMLに戻ります。

import feedparser

# Any Craigslist search becomes a feed with &format=rss
feed_url = build_url("sfbay", "apa", "loft", max_price=3500) + "&format=rss"
raw = requests.get(feed_url, headers={"User-Agent": UA}, proxies=PROXIES, timeout=20)
feed = feedparser.parse(raw.content)

for entry in feed.entries[:5]:
    print(entry.updated, entry.title, entry.link)

Craigslistがあなたを禁止する理由と禁止されない方法

Craigslistはいくつかの防御を積み重ねていますが、それらはすべて1つの根本を共有しています:IPアドレスごとにリクエストを追跡し、過度にアクセスするアドレスをブロックします。具体的な対策は、IPレート制限、疑わしいトラフィックに対するCAPTCHAチャレンジ、User-Agentの監視、セッショントラッキング、一時的なIP禁止です。それらすべては、1つの無慈悲な機械ではなく、多くの普通の訪問者のように見えることで打ち破られます。

禁止はIPベースなので、出口IPがほとんどの作業を行います。クリーンな住宅プロキシプールは実際の家庭接続のように見え、リクエストごとの回転は多都市クロールを非常に薄く広げるため、CraigslistのIPごとのカウンターが決して作動しません。多くの都市で収集している場合、429レート制限の修正に関するガイドではペースと同時実行予算の側面をカバーし、アンチ禁止チェックリストがそれをすべてまとめます。

クリーンな住宅IPでCraigslistをスクレイピング

都市をまたいでスケーリング

Craigslistデータの本当の力は都市間比較にあります。同じ中古車や賃貸が複数の都市でどのように価格設定されているかを比較します。都市リストをループし、都市ごとに新しい回転出口をバインドし、同時実行数を制限し、すべての記録に都市を保存します。特に車両と賃貸の研究では、同じパターンが比較パイプラインを供給します。生のリスティングを市場シグナルに変える方法については、車のリスティングをスクレイピングする不動産データに関するガイドをご覧ください。

Craigslistのアンチスクレイピング防御をIPレート制限やCAPTCHAといった問題に対する修正方法(住宅回転やペース調整)にマッピングするチェックリスト
Craigslistの防御はすべてIPとペースの問題です。住宅の出口を回転させ、1-2リクエスト/秒以下に抑えます。

よくある質問

Craigslistをスクレイピングできますか?

はい — 公開された検索およびリスティングページはスクレイピング可能で、Craigslistは検索のためのRSSフィードも公開しています。障害は解析ではなく、IPごとの厳しいレート制限です。住宅IPを回転させ、リクエストを1-2秒にペースを調整すれば、車両、賃貸、ギグ、販売データを信頼性高く収集できます。Craigslistの利用規約を尊重し、公開データのみをスクレイピングしてください。

CraigslistにはAPIがありますか?

一般公開のデータAPIはありませんが、すべての検索URLに&format=rssを追加することでRSSフィードを取得できます。これにより、タイトル、リンク、タイムスタンプを含む構造化されたXMLフィードが得られ、新しいリスティングの監視に最適です。一方、HTMLページには価格や説明などのより詳細なフィールドが含まれています。

Craigslistをスクレイピングする際にIP禁止を避ける方法は?

CraigslistはIPレートで禁止するため、修正はすべて負荷を分散し遅くすることに関するものです:リクエストごとに住宅IPを回転させ、ジッターを加えて1-2リクエスト/秒に抑え、User-Agentを回転させ、都市ごとに新しいセッションを使用し、CAPTCHAや403を見た瞬間にすぐにバックオフします。データセンターIPが1つの都市を叩くと最も早く禁止されます。

Craigslistのページネーションはどのように機能しますか?

Craigslistは1ページあたり120件の結果を表示し、sクエリパラメータをオフセットとしてページングします。ページ1はsを省略し、ページ2はs=120、ページ3はs=240となります。120ステップで増加させ、120件未満の結果を返すページが終わりを示します。

Craigslistは読みやすく、禁止されやすい — そして2つ目の問題は完全にIPの衛生に関するものです。URLパターンを確立し、監視にはRSSを使用し、120ステップでページングし、すべてを人間のペースで回転する住宅IPを通してルーティングします。そうすれば、CAPTCHAは単に現れなくなります。

回転する住宅プロキシから始めましょう