Craigslist आज भी करीब खींचता है, वह भी लगभग 700 local sites पर — और इसकी कोई public API नहीं है। अगर आपको apartment listings, used cars, job posts, या gig ads से structured data चाहिए, तो scraping ही लगभग एकमात्र रास्ता है।
लेकिन Craigslist का custom anti-bot system काफी सख्त है। यह Cloudflare या DataDome पर नहीं चलता — यह अपना खुद का nginx-based rate limiter इस्तेमाल करता है, जिसे एक दशक से ज़्यादा समय में और निखारा गया है। गलत तरीके से hit किया, तो दूसरी coffee से पहले ही 403 मिल जाएगा। मैंने Craigslist की defenses के खिलाफ अलग-अलग approaches बहुत टेस्ट की हैं, और इसी का नतीजा यह guide है: 2025 के हिसाब से updated, हर category पर लागू होने वाला Python tutorial, जिसमें JSON-LD extraction method शामिल है (पुराने guides की तुलना में सबसे बड़ा upgrade), honest anti-ban strategies, legal landscape, और एक no-code alternative भी है — उन लोगों के लिए जो बस data चाहते हैं, code नहीं।
Python से Craigslist Scrape करना क्या होता है?
Web scraping Craigslist का मतलब है Python scripts का इस्तेमाल करके Craigslist pages पर programmatically जाना, और वहाँ से वह structured data निकालना जिसमें आपकी रुचि है — जैसे titles, prices, descriptions, images, locations, posting dates — फिर उसे spreadsheet, database, या JSON file में save करना।
Python इसके लिए सबसे popular choice है क्योंकि इसकी library ecosystem बहुत मजबूत है। requests, BeautifulSoup, lxml, और curl_cffi के साथ आप 100 lines से भी कम code में एक working Craigslist scraper बना सकते हैं। Community भी बहुत बड़ी है, इसलिए जब Craigslist कुछ बदलता है (और वह बदलता रहता है), तो किसी न किसी ने उसका fix पहले ही ढूँढ लिया होता है।
जानने वाली सबसे अहम बात: Craigslist । इसका एकमात्र official programmatic interface Bulk Posting Interface (BAPI) है, जो write-only है — यानी यह approved paid posters को listings submit करने देता है, retrieve नहीं। Third-party platforms पर जो भी “Craigslist API” product दिखता है, वह असल में unofficial scraper होता है, sanctioned endpoint नहीं। Bulk data चाहिए, तो scraping करनी होगी।
Craigslist Scrape क्यों करें? असली Use Cases
Craigslist सिर्फ पुराना sofa ढूँढने की जगह नहीं है। यह एक विशाल, लगातार update होने वाला dataset है, जो कई अलग-अलग verticals में फैला है। असल में इसे scrape करने से ये लोग फायदा उठाते हैं:
| Use Case | किसे फायदा होता है | क्या निकालते हैं |
|---|---|---|
| Apartment & rental price monitoring | Real estate agents, renters, PropTech companies | Price, sqft, bedrooms, neighborhood, lat/long |
| Used car market analysis | Dealerships, consumer apps, researchers | Price, make, model, year, odometer, condition |
| Job market research | Recruiters, labor economists, workforce analysts | Title, compensation, employment type, posted date |
| Lead generation | Sales teams, service providers | Contact info, business names, service area |
| Competitive pricing | Local service providers, ecommerce ops | Service pricing, descriptions, areas served |
सबसे ज्यादा cite किया जाने वाला academic example है — करीब 500,000 US used-car listings, 26 variables के साथ, जिस पर कई papers बने हैं, including 2024 का एक ResearchGate study on US used car market dynamics. Hedge funds ने rent-trend research के लिए aggregated Craigslist rental data खरीदा है। Sales teams भी services और gigs categories को lead generation के लिए regularly scrape करते हैं।
गणित सीधा है: 8 घंटे की manual copy-pasting बनाम लगभग 10 मिनट एक अच्छे scraper के साथ।

Python से Craigslist Scrape करें: सिर्फ Cars नहीं, हर Category
ज्यादातर Craigslist scraping guides जो मैंने देखे हैं, सिर्फ cars-for-sale तक सीमित हैं — जैसे कोई Google tutorial हो जो केवल image search समझाए। Craigslist में दर्जनों categories हैं, और हर category के URL patterns अलग होते हैं।
Structure हमेशा यह होता है: https://{city}.craigslist.org/search/{category_slug}
City subdomain और slug बदल दीजिए, और आप बिल्कुल अलग vertical scrape कर रहे होते हैं। यहाँ सबसे popular categories की reference table है (April 2025 में verified):
| Category | URL Slug | Extract करने वाले Typical Fields |
|---|---|---|
| Apartments / Housing | /search/apa | Price, sqft, bedrooms, location, pet policy |
| Cars & Trucks | /search/cta | Price, make, model, year, odometer |
| Jobs | /search/jjj | Title, company, salary, employment type |
| Services | /search/bbb | Title, description, phone number, area |
| Gigs | /search/ggg | Title, compensation, date, category |
| For Sale (general) | /search/sss | Title, price, condition, location |
Filtering के लिए query parameters भी जोड़ सकते हैं:
| Parameter | उद्देश्य | Example |
|---|---|---|
query | Full-text keyword | ?query=studio |
min_price / max_price | Price range | &min_price=1500&max_price=3000 |
hasPic | सिर्फ image वाले posts | &hasPic=1 |
postedToday | पिछले 24 घंटे | &postedToday=1 |
sort | Ordering | &sort=priceasc |
s | Pagination offset (120 per page) | ?s=120 |
तो https://newyork.craigslist.org/search/apa?min_price=1500&max_price=3000&hasPic=1 जैसा URL आपको New York apartments दिखाएगा, जिनकी कीमत $1,500 से $3,000 के बीच है और जिनमें photos हैं। इस guide का हर Python scraper इन सभी categories पर काम करता है — बस slug बदलना है।
2025 Craigslist HTML Selectors: पुराने बनाम नए (और JSON Shortcut)
Craigslist scrapers के टूटने की सबसे बड़ी वजह HTML structure changes होते हैं। अगर आप 2022 का कोई tutorial follow कर रहे हैं जो .result-row या .result-info target करने को कहता है, तो आपका scraper लगभग खत्म ही समझिए।
Craigslist ने 2023–2024 में search results markup दोबारा लिखा। पुराने class names नए wrappers के अंदर मौजूद हैं, लेकिन DOM tree के top पर उन्हें target करने से खाली list मिलती है। क्या बदला है, देखिए:
| Element | Legacy Selector (pre-2024) | Current Selector (2025) |
|---|---|---|
| Listing container | .result-info | .cl-search-result |
| Title link | .result-title | .posting-title a |
| Price | .result-price | .priceinfo |
| Metadata (area) | .result-hood | .meta |
लेकिन असली insight — और 2025-current scraper को बाकियों से अलग करने वाली बात — यह है: search results के लिए आपको HTML parse करने की ज़रूरत ही नहीं है।
Craigslist अब हर visible listing को <script id="ld_searchpage_results"> tag के अंदर structured JSON-LD data के रूप में embed करता है। एक single requests.get() call से पूरे page का schema.org ItemList मिल जाता है — हर listing के साथ title, price, currency, location, image URL, detail page link। JavaScript rendering की जरूरत नहीं। CSS selector टूटने का डर नहीं।
JSON-LD approach तेज़ है, ज़्यादा stable है, और Craigslist जब UI में थोड़ा सा भी बदलाव करता है, तो टूटने की संभावना बहुत कम रहती है। यही तरीका हर actively maintained GitHub repo में इस्तेमाल हो रहा है, और नीचे tutorial में भी यही use करेंगे।
एक बात ध्यान रखें: JSON-LD block में मौजूद होता है — apartments (apa), for sale (sss), cars (cta), housing (hhh)। लेकिन jobs (jjj), gigs (ggg), community (ccc), और services (bbb) में यह अक्सर absent या sparse होता है, क्योंकि उनमें schema.org/Offer pricing नहीं होती। ऐसी categories में .cl-search-result HTML path पर वापस जाना होगा।
Python Stack कैसे चुनें: Requests + BS4 बनाम Selenium बनाम Playwright
हर scraping forum में यही सवाल आता है: “कौन सी library use करूँ?” Craigslist के लिए, जवाब ज़्यादातर sites की तुलना में काफी साफ है।
| Factor | requests + BeautifulSoup | Selenium | Playwright |
|---|---|---|---|
| Speed | 5–15 pages/sec (network-bound) | 0.3–1 pages/sec | 0.5–2 pages/sec |
| JS-rendered content | No | Yes | Yes |
| Memory | ~30–60 MB | ~400–700 MB | ~300–500 MB |
| Setup complexity | Low | Medium | Medium |
| Anti-bot resilience | Low (needs headers/proxies) | Medium (real browser) | Medium-High |
| Best Craigslist use case | Search results (JSON-LD) | Detail pages with dynamic content | Large-scale async scraping |
| Learning curve | Beginner-friendly | Moderate | Moderate |
Craigslist pages server-rendered होती हैं। JSON-LD blob initial HTML में ही मौजूद होता है। Read paths पर कोई JavaScript challenge नहीं है। GitHub पर active भी requests + BeautifulSoup या Scrapy का इस्तेमाल करते हैं। Selenium या Playwright का लगभग कोई उपयोग नहीं होता। यह संयोग नहीं है — browser automation framework hundreds of MB memory खा लेता है, 10–100× speed penalty देता है, और बिना किसी लाभ के ज़्यादा visible fingerprint बनाता है।
मेरी recommendation:
- requests + BS4: यहीं से शुरू करें। JSON-LD extraction method के साथ यह perfectly fit बैठता है और Craigslist scraping needs का 95% संभाल लेता है।
- Selenium: तभी जब आपको specific detail pages पर dynamic content के साथ interact करना हो (Craigslist में यह rare है)।
- Playwright: अगर आप thousands of pages तक async concurrency के साथ scale कर रहे हैं — लेकिन सच कहें तो bottleneck Craigslist का rate limiter है, library की throughput नहीं।
अगर आप पूरा breakdown चाहते हैं, तो हमने अलग posts में तुलना और की roundup भी cover की है।
No-Code Alternative: Python लिखे बिना Craigslist Scrape करें
Code शुरू करने से पहले एक छोटा detour — यह section उन लोगों के लिए है जो developer नहीं हैं। Real estate agents, sales teams, operations managers — अगर आपको बस data चाहिए और Python नहीं लिखना, तो एक तेज़ रास्ता है।
एक AI web scraper है जो Chrome extension के रूप में काम करता है। यह Craigslist को लगभग 2 clicks में scrape कर सकता है, no code required. Workflow यह है:
- किसी भी Craigslist search results page पर जाएँ (apartments, cars, jobs — कोई भी category)।
- Thunderbit sidebar में "AI Suggest Fields" पर क्लिक करें। AI page पढ़ता है और listing title, price, location, link जैसी columns auto-detect करता है।
- "Scrape" पर क्लिक करें — data कुछ ही seconds में extract हो जाएगा।
- Subpage Scraping का उपयोग करके हर listing की detail page खोलें और full descriptions, phone numbers, images, और attributes से data enrich करें।
- Data को सीधे Google Sheets, Excel, Airtable, या Notion में export करें — वह भी पूरी तरह free.
Recurring जरूरतों के लिए — जैसे daily apartment price monitoring या weekly job listing snapshots — Thunderbit का Scheduled Scraper आपको schedule plain English में बताने देता है, और वह अपने आप चल जाता है। No cron jobs, no server setup.
Thunderbit Cloud Scraping mode के जरिए anti-bot measures भी संभालता है, इसलिए rotating proxies या headers craft करने की चिंता नहीं करनी पड़ती। अगर आप इसे try करना चाहते हैं, तो लें और खुद देखें।
अगर आपको full control और customization चाहिए, तो Python step-by-step पढ़ते रहिए।
Step-by-Step: Python से Craigslist कैसे Scrape करें (पूरा Tutorial)
- Difficulty: Intermediate
- Time Required: ~30 minutes (setup + first scrape)
- What You'll Need: Python 3.8+, Chrome browser (pages inspect करने के लिए), एक terminal
Step 1: Python Environment सेट करें
ज़रूरी libraries install करें:
1pip install requests beautifulsoup4 lxml
lxml optional है, लेकिन BeautifulSoup parsing को काफ़ी तेज़ कर देता है। अगर आगे TLS fingerprinting की समस्या आए (anti-ban section में और details हैं), तो curl_cffi भी install कर सकते हैं:
1pip install curl_cffi
Import block:
1import requests
2from bs4 import BeautifulSoup
3import json
4import csv
5import time
6import random
अब आपके पास एक साफ Python environment है, जिसमें सारी dependencies installed हैं।
Step 2: किसी भी Category के लिए Craigslist URL बनाएं
City + category slug + optional filters से target URL dynamically बनाइए:
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# Example: New York apartments, $1500-$3000, with photos
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" (cars), "jjj" (jobs), "bbb" (services), या ऊपर वाली category table के किसी भी slug से बदल सकते हैं। "newyork" को "sfbay", "chicago", "losangeles", आदि से बदलें।
Step 3: Page Fetch करें और Embedded JSON निकालें
Proper headers के साथ GET request भेजें, फिर JSON-LD block parse करें:
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 है, तो उस category में JSON-LD block नहीं है — तब HTML parsing पर लौटिए (ऊपर selector table देखें)। Apartments, cars, और for-sale categories में JSON-LD block भरोसेमंद रूप से मौजूद होता है।
Step 4: Listing Data को Structured Records में बदलें
JSON items पर iterate करके ज़रूरी fields निकालें:
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 प्रति page 120 results दिखाता है)। कुछ listings में price None हो सकती है अगर poster ने उसे शामिल नहीं किया — downstream logic में इसे gracefully handle करें।
Step 5: Richer Data के लिए Detail Pages Scrape करें
Search results सिर्फ summary info देते हैं। Full descriptions, attributes (bedrooms, sqft, pet policy), lat/long coordinates, और images के लिए हर listing की detail URL visit करनी होगी।
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)) # critical: anti-ban jitter
time.sleep(random.uniform(3, 6)) optional नहीं है। इसे skip करेंगे, तो कुछ ही दर्जन requests में 403 मिल सकता है। Detail pages server-rendered होती हैं और उनके selectors (#titletextonly, #postingbody, #map) लगभग 2017 से stable हैं — Craigslist की बहुत कम चीज़ें इतनी भरोसेमंद हैं।
Step 6: Pagination संभालकर सारे Results Scrape करें
Craigslist pagination के लिए ?s=120 offset parameter इस्तेमाल करता है। हर page पर 120 results होते हैं, और maximum offset आमतौर पर 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))
हज़ारों pages को तेज़ी से scrape करने की कोशिश न करें। Craigslist का rate limiter per-IP होता है, और sustainable single-IP throughput लगभग 0.3–0.5 requests/second के आसपास रहता है, library चाहे कोई भी हो। यह ceiling Python तय नहीं करता, Craigslist तय करता है।
Step 7: Craigslist Data को CSV, JSON, या Google Sheets में Export करें
अपने results save करें:
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)
अगर आप export code पूरी तरह skip करना चाहते हैं, तो Thunderbit browser से सीधे Google Sheets, Excel, Airtable, या Notion में free export देता है। लेकिन Python pipelines के लिए CSV और JSON standard outputs हैं। आप data को analysis के लिए सीधे pandas में या sqlite3 से database में भी भेज सकते हैं।
Python से Craigslist Scrape करते समय Ban से कैसे बचें
ज्यादातर tutorials इस हिस्से को हल्के में लेते हैं। Craigslist का anti-bot system custom-built है, off-the-shelf नहीं, और इसकी कुछ अपनी खास quirks हैं।

Realistic Request Headers इस्तेमाल करें
Craigslist header order और completeness validate करता है। Sec-Fetch-Dest missing हो या User-Agent पुराना हो, तो content तक पहुँचने से पहले ही request flag हो सकती है। पूरा Chrome 120+ header set (Step 3 में दिखाया गया) minimum है। Session के हिसाब से 5–10 recent Chrome/Firefox desktop strings में User-Agent rotate कर सकते हैं — लेकिन session के बीच में मत बदलिए, क्योंकि यह unnatural लगता है।
Sec-Fetch-* headers missing होना पहली बार scraper चलाने वालों के instant blocks की सबसे common वजह है।
Requests के बीच Random Delays जोड़ें
(ScrapingBee, Scraperly, Oxylabs, Multilogin) से community consensus यह है कि search page fetches के बीच random 2–5 seconds और detail page fetches के बीच 3–6 seconds का gap रखें। Fixed interval bot जैसा दिखता है। time.sleep(random.uniform(2, 5)) इस्तेमाल करें — कभी time.sleep(2) नहीं।
Proxies Rotate करें (अगर scale पर scrape कर रहे हैं)
Craigslist पूरे AWS, GCP, और Azure IP ranges को पहले से block कर देता है। Datacenter proxies अक्सर शुरू होते ही fail हो जाते हैं। कुछ सौ pages से ज़्यादा scrape करना हो, तो residential rotating proxies चाहिए, जिन्हें हर 20–30 requests पर rotate करना बेहतर है। Mobile proxies detection risk सबसे कम रखते हैं, लेकिन कीमत $8–30/GB हो सकती है।
| Proxy Type | Craigslist पर Detection Risk | Cost (2025) |
|---|---|---|
| Datacenter | बहुत high — अक्सर पहली request पर block | $0.50–2/GB |
| Residential rotating | Low — recommended | $5–15/GB |
| Mobile | सबसे कम | $8–30/GB |
अगर आप यह सब खुद manage नहीं करना चाहते, तो Thunderbit का Cloud Scraping mode proxy rotation अपने आप संभाल लेता है।
CAPTCHAs को Gracefully Handle करें
Craigslist पर CAPTCHAs read paths में rare होते हैं — ये ज़्यादातर posting/reply flows में दिखते हैं। अगर फिर भी दिखें: कम से कम 60 seconds रुकिए, IP rotate कीजिए, cookies clear कीजिए, और speed कम कर दीजिए। लगातार CAPTCHAs का मतलब है आपकी cadence बहुत aggressive है, यह कोई puzzle नहीं जिसे solver से brute-force किया जाए।
Rate Limits का सम्मान करें और Backoff लागू करें
Craigslist rate limit hit होने पर 403 (429 नहीं) लौटाता है। 403 का मतलब है current IP deny list में है — blindly retry मत कीजिए। IP rotate करें, 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, 24s
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)
एक और tip: community reports लगातार बताते हैं कि target city के local time में 2–6 AM का window सबसे safe होता है, और daytime की तुलना में block rates लगभग 30–40% कम रहती हैं।
TLS Fingerprinting — छिपा हुआ Trap
Craigslist की bot layer TLS ClientHello inspect करती है। Python का requests library (जो OpenSSL पर चलता है) एक ऐसा JA3 fingerprint देता है जो किसी real browser से match नहीं करता। Perfect User-Agent header के साथ browser-जैसा न दिखने वाला TLS fingerprint एक detectable mismatch बन जाता है। Workaround है with impersonate="chrome124", जो Chrome की TLS handshake की नकल करता है:
1from curl_cffi import requests as cffi_requests
2r = cffi_requests.get(url, headers=HEADERS, impersonate="chrome124")
अगर clean residential IPs और सही headers के बावजूद unexplained 403 आ रहे हैं, तो ज़्यादातर संभावना TLS fingerprinting की है।
Craigslist robots.txt, Terms of Service, और Ethical Scraping
अधिकतर guides इस हिस्से को या तो छोड़ देते हैं या FAQ में एक line में दबा देते हैं। चूँकि Craigslist ने एक scraper (RadPad, 2017) के खिलाफ जीता था, इसलिए इसे एक footnote से कहीं ज़्यादा attention मिलना चाहिए।
Craigslist का robots.txt असल में क्या कहता है
काफ़ी छोटा है। इसमें एक ही User-agent: * block है, और सिर्फ सात disallowed paths हैं:
1Disallow: /reply
2Disallow: /fb/
3Disallow: /suggest
4Disallow: /flag
5Disallow: /mf
6Disallow: /mailflag
7Disallow: /eaf
ये सातों interactive/mutating endpoints हैं: reply, flag, suggest, email-a-friend। Listing pages (/search/..., individual post URLs) disallowed नहीं हैं। कोई Crawl-delay directive भी नहीं है, हालांकि Craigslist IP blocks के जरिए अपनी तरफ से delay enforce करता है।
City subdomains sitemap भी publish करते हैं — जैसे https://newyork.craigslist.org/sitemap/index.xml — जो listings तक officially discoverable path है।
Legal Precedent: वे cases जो matter करते हैं
Craigslist v. 3Taps (2013, settled 2015): 3Taps ने Craigslist listings scrape करके उन्हें resale किया। जब Craigslist ने cease-and-desist भेजा और IPs block किए, 3Taps ने rotating proxies से block को bypass किया। Court ने माना कि explicit revocation के बाद IP blocks को circumvent करना CFAA के तहत “without authorization” माना जा सकता है। 3Taps ने .
Meta v. Bright Data (2024): एक हालिया ruling में कहा गया कि Meta की TOS logged-off scraping of publicly available data को prohibit नहीं कर सकती। Court ने माना कि logged-off scraper “same shoes as a visitor” में होता है। 2024–2025 scrapers के लिए यह सबसे अहम ruling है — अगर आप कभी Craigslist account नहीं बनाते, कभी login नहीं करते, और सिर्फ publicly visible pages access करते हैं, तो TOS शायद आपके खिलाफ contract की तरह enforce न हो सके।
Practical takeaway: सार्वजनिक pages के लिए Van Buren (2021) और hiQ v. LinkedIn (2022) के बाद CFAA risk काफी कम हुआ है। लेकिन state-law tort claims (trespass-to-chattels, misappropriation) अभी भी मौजूद हैं — यही वजह है कि 3Taps settlement और $60.5M RadPad judgment हुआ था।
यह informational content है, legal advice नहीं। अगर आप Craigslist commercial purpose से scrape कर रहे हैं, तो lawyer से बात करें।
Practical Ethical Scraping Checklist
- ✅ robots.txt में हर
Disallowका सम्मान करें — खासकर सात action endpoints का - ✅ प्रति IP 24 घंटे में 1,000 pages से काफी नीचे रहें (Craigslist की TOS इस threshold से ऊपर liquidated damages तय करती है)
- ✅ हमेशा logged-off रहें — scraping के लिए कभी Craigslist account न बनाएं
- ✅ explicit block के बाद proxies से IP bans bypass न करें (यही 3Taps के लिए problem बना)
- ✅ requests के बीच delays जोड़ें — कम से कम 2–5 seconds
- ✅ personal contact info को spam के लिए scrape न करें
- ✅ raw Craigslist data को redistribute न करें और उसे अपनी own platform की तरह पेश न करें
- ✅ data को legitimate research, analysis, या personal-use purposes के लिए इस्तेमाल करें
- ✅ brute-force crawling की बजाय जहाँ संभव हो published sitemaps को प्राथमिकता दें
- ✅ data store करने पर ingestion के समय PII (emails, phone numbers) हटाएँ
Web scraping के legal implications पर हमने एक deeper guide भी लिखी है, अगर आप पूरा picture देखना चाहते हैं: .
Python बनाम No-Code: आपके लिए कौन सा तरीका सही है?
| Factor | Python (requests + BS4) | Thunderbit (No-Code) |
|---|---|---|
| Setup time | 30–60 min (install, write code) | 2 minutes (install Chrome extension) |
| Technical skill needed | Intermediate Python | None |
| Customization | Full control over logic, fields, flow | AI auto-detects fields; user can adjust |
| Scale | Unlimited (with proxies, scheduling) | Scheduled Scraper for recurring tasks |
| Anti-ban handling | Manual (headers, delays, proxies, TLS) | Built-in (Cloud Scraping) |
| Export options | CSV, JSON (code it yourself) | Google Sheets, Excel, Airtable, Notion — free |
| Best for | Developers, data scientists, custom pipelines | Sales teams, real estate agents, ops managers |
अगर आपको full customization चाहिए, बड़े data pipeline से integrate करना है, या अंदर क्या हो रहा है यह ठीक से समझना है, तो Python चुनें। अगर आपको जल्दी result चाहिए और code लिखना/maintain नहीं करना, तो लें। दोनों valid हैं। बात आपके use case पर आती है और इस पर कि आप terminal में समय बिताना चाहते हैं या browser में।
निष्कर्ष
Craigslist housing, cars, jobs, services, gigs, और कई अन्य categories में rich, continuously updated data source है — और public API न होने की वजह से structured data scale पर पाने का तरीका scraping ही है। 2025 में जो approach सच में काम करती है, वह है: search results से embedded JSON-LD extract करना (fragile CSS selectors नहीं), requests + BeautifulSoup use करना (Selenium नहीं), Sec-Fetch-* fields के साथ realistic headers लगाना, delays को randomize करना, और कुछ सौ pages से आगे बढ़ रहे हों तो residential proxies use करना।
JSON-LD method पुराने guides की तुलना में सबसे बड़ा improvement है। यह तेज़ है, layout changes के प्रति ज़्यादा resilient है, और JavaScript rendering की ज़रूरत नहीं पड़ती। ऊपर बताई anti-ban strategies के साथ combine करने पर आप वे 403 errors काफी हद तक टाल सकते हैं जो ज़्यादातर scrapers को रोक देते हैं।
अगर आप code पूरी तरह छोड़ना चाहते हैं, तो कुछ ही clicks में किसी भी Craigslist category को scrape कर सकती है और सीधे आपकी पसंदीदा spreadsheet या database में export कर सकती है। अगर आप और गहराई में जाना चाहते हैं, तो और वाले हमारे guides fundamentals को और detail में समझाते हैं।
FAQs
क्या Craigslist scrape करना legal है?
Craigslist की Terms of Use automated scraping को prohibit करती हैं और liquidated-damages clause जोड़ती हैं ($0.25/page over 1,000/day)। हालांकि, हाल के court rulings — खासकर Meta v. Bright Data (2024) और hiQ v. LinkedIn (2022) — ने publicly available data की logged-off scraping के लिए CFAA liability को सीमित किया है। State-law tort claims (trespass-to-chattels) का risk अभी भी रहता है, खासकर commercial redistribution में। robots.txt का सम्मान करें, logged-off रहें, delays जोड़ें, और raw data redistribute न करें। यह सामान्य जानकारी है, legal advice नहीं।
क्या Craigslist की public API है?
नहीं। Craigslist सिर्फ approved paid posters के लिए write-only Bulk Posting Interface (BAPI) देता है। कोई public read API नहीं है, developer portal नहीं है, और data retrieval के लिए कोई rate-limited tier भी नहीं। Third-party platforms पर दिखने वाला हर “Craigslist API” product unofficial scraper ही होता है।
मेरा Craigslist scraper बार-बार क्यों टूट जाता है?
लगभग हमेशा HTML structure changes की वजह से। Craigslist ने 2023–2024 में अपना search results markup दोबारा लिखा, और .result-row या .result-info जैसे legacy selectors इस्तेमाल करने वाले guides अब काम नहीं करते। ज़्यादा resilient approach के लिए embedded JSON-LD method (script#ld_searchpage_results parsing) इस्तेमाल करें। साथ ही headers में Sec-Fetch-* fields मौजूद हों, यह भी चेक करें — missing होने पर instant blocks मिलते हैं।
क्या मैं Python के बिना Craigslist scrape कर सकता हूँ?
हाँ। Thunderbit का AI web scraper Chrome extension Craigslist के किसी भी page पर काम करता है — apartments, cars, jobs, services। Columns auto-detect करने के लिए “AI Suggest Fields” पर क्लिक करें, data निकालने के लिए “Scrape” पर क्लिक करें, और Google Sheets, Excel, Airtable, या Notion में free export करें। कोई coding नहीं, कोई setup नहीं, कोई proxy management नहीं।
Ban हुए बिना मैं Craigslist कितनी बार scrape कर सकता हूँ?
Single residential IP के साथ sustainable throughput लगभग 0.3–0.5 requests per second है, और pages के बीच random 2–5 second delays रखने चाहिए। Ban और Craigslist TOS के liquidated-damages threshold, दोनों से बचने के लिए प्रति IP 24 घंटे में 1,000 pages से नीचे रहें। Off-peak hours (target city local time में 2–6 AM) में scraping करने से block rates लगभग 30–40% घटती हैं। बड़े volume के लिए हर 20–30 requests पर residential proxies rotate करें।
और जानें
