Short-Term Rental Data Scraping: Pricing, Occupancy Signals and Reviews by City
Quick answer
Short-term rental data scraping needs residential proxies with city targeting, because listing search results, nightly prices and availability calendars are served per visitor location and are heavily rate-limited per IP. Geonode residential proxies cover 195+ countries with city-level targeting and sticky sessions, and the Unlimited Scraper offers ready airbnb and booking targets that return listing JSON without custom parsers.
Why short-term rental data scraping breaks without the right proxies
Rental marketplaces run strict anti-automation. A map search is paginated through tokens tied to a session, and the calendar endpoint behind each listing is rate-limited per IP with shadow-limits that return empty or stale availability rather than an error. You keep getting HTTP 200 while the data silently stops being true.
Prices are also localised. The same listing shows a different currency, a different service fee breakdown and sometimes a different nightly rate depending on the visitor's country, so a crawl from one location misreads the market you are analysing.
Datacenter ranges hit CAPTCHAs within a few hundred requests. For an investor model that needs thousands of listings per city, with calendars refreshed weekly to estimate occupancy, that is not a workable pool. The job needs many distinct consumer IPs in the right places and the ability to hold one for a paginated session.
Which Geonode proxy type fits
Residential proxies are the recommended type. With 2.5M IPs online and 30–50M unique IPs rotating monthly, the pool is deep enough to refresh calendars for every listing in a city without re-using addresses that have been throttled. City targeting lets you search as a local, and country targeting fixes the currency and fee display you want in your dataset.
Use a sticky session for each search-and-paginate run, so the pagination token remains valid, and rotate per listing when you fetch detail pages and calendars. Geonode sets no fixed thread limit, so a weekly refresh of several cities can run in parallel.
If you want the data rather than the plumbing, the Unlimited Scraper has ready targets for rental marketplaces, with JavaScript rendering built in and JSON output for listing fields. ISP proxies suit a small portfolio that re-checks the same listings hourly from fixed IPs. Datacenter is only for your own PMS or channel-manager endpoints.
- Residential — Best for: City-level listing, price and calendar collection at scale; IP source: 2.5M consumer IPs online, 195+ countries; Session: Rotating or sticky up to 24 h; Price from: $0.27/GB at volume
- ISP (static residential) — Best for: Hourly re-checks of a small portfolio from fixed IPs; IP source: Static IPs from real ISPs; Session: Unlimited, fixed IP; Price from: $1.25/IP
- Datacenter — Best for: Your own PMS, channel manager and non-geo APIs; IP source: Rotating datacenter ranges; Session: Rotating; Price from: $0.14/GB
How to set it up
- Define the market: city, bounding box or neighbourhood list, date range and guest count. Store these with every record so later analyses do not mix search contexts.
- Create a residential plan and build usernames with the target country and city plus a session id per search run, so pagination stays on one IP.
- Crawl search results to collect listing ids, then fetch each listing's detail page and availability calendar on a rotating session, pacing requests like a browsing user.
- Normalise price, cleaning fee, service fee, minimum stay, rating, review count and blocked dates. Derive occupancy signals from calendar changes between weekly snapshots.
- Log exit IP, status, response size and listing count per page. Falling listing counts on the same query are the early warning that a session is being shadow-limited.
# verify endpoint against docs.geonode.com before publishing
import requests, time
def proxy(city, cc, sid=None):
user = f"USERNAME-country-{cc}-city-{city}"
if sid:
user += f"-session-{sid}"
return f"http://{user}:PASSWORD@premium-residential.geonode.com:9000"
def get(url, p):
r = requests.get(url, proxies={"http": p, "https": p}, timeout=40,
headers={"Accept-Language": "en"})
r.raise_for_status()
return r.text
search = "https://www.example-rentals.com/s/Lisbon?checkin=2026-11-14&checkout=2026-11-16&adults=2"
page = get(search, proxy("lisbon", "pt", sid="lis01")) # sticky for pagination
for listing_id in ["12345", "67890"]:
detail = get(f"https://www.example-rentals.com/rooms/{listing_id}", proxy("lisbon", "pt"))
time.sleep(2)
Get the exact snippet for your language from the API Code Generator in the dashboard.
Short-term rental data scraping-specific settings that matter
Sticky for search, rotating for details
Search pagination depends on a session token, so hold one IP for the whole result set. Listing pages and calendars are independent requests, so rotate per fetch to spread load across the pool and stay well under per-IP thresholds.
City targeting and currency
Search as a local to get the inventory and ranking a guest in that city sees, and fix the country to control the currency and fee breakdown in your dataset. State and city cannot be combined in one target, so pick city for metro markets and state for rural regions.
Calendar refresh cadence
Occupancy is inferred from blocked dates changing between snapshots. Weekly refreshes are enough for investor models; daily for revenue management on your own portfolio. Keep the cadence fixed so booked-versus-blocked estimates stay comparable.
Concurrency and back-off
Run cities in parallel, but pace within a city. On 429, CAPTCHA or a sudden empty result, back off and switch session rather than retry on the same IP. Treat a drop in listing count on an unchanged query as a soft limit.
What to log
Keep exit IP, country, city, status code, response size, listing count and parse status per request. Those fields separate marketplace layout changes from throttling from genuine market shifts when a chart moves unexpectedly.
What Geonode gives you for rental market data
- 2.5M residential IPs online, 30–50M rotating monthly, in 195+ countries with city targeting.
- Sticky sessions up to 24 hours for paginated search, rotating per listing fetch.
- Unlimited Scraper with ready rental-marketplace targets, JavaScript rendering and JSON output.
- No fixed concurrency limit; HTTP, HTTPS, SOCKS5 and UDP.
- Pay-as-you-go pricing, no contract, 24/7 support.
Pricing for rental data collection
Listing pages are heavier than most, so budget for bandwidth. Residential pay-as-you-go starts at $0.27/GB at volume; the entry plan is 10 GB for $7.92, 50 GB is $34.65, and a 3-day trial is $5 with no contract. ISP proxies start at $1.25/IP, datacenter at $0.14/GB. The Scraper API gives 1.5K free requests a month, then from $3.50 per 10K requests, with monthly unlimited plans from $47. See the pricing page.
FAQ
Is scraping rental listings possible without proxies?
Only at a very small scale. Rental marketplaces rate-limit per IP and quietly degrade results before blocking, so a single-IP crawler returns incomplete inventory and stale calendars. A residential pool spreads requests across many consumer IPs and keeps the data honest.
Which Geonode product is best for short-term rental data scraping?
Residential proxies with city targeting if you run your own crawler, or the Unlimited Scraper if you want JSON listing data without maintaining parsers. Many teams start with the scraper and move to raw proxies when they need custom fields.
How do I estimate occupancy from scraped data?
Snapshot each listing's availability calendar on a fixed cadence and compare blocked dates between snapshots. Dates that become blocked without a price change are likely bookings. Combine with review velocity to separate bookings from owner blocks.
Can I collect data for a single neighbourhood?
Yes. Use city targeting so the IP appears local, then constrain the search with the marketplace's own map bounds or neighbourhood filters. Store the bounds with every record so investors can compare like with like across snapshots.
Does the Unlimited Scraper handle JavaScript-rendered listing pages?
Yes. JavaScript rendering is built in, and results come back as HTML, Markdown or JSON. The ready targets for rental marketplaces return normalised listing fields, which removes the need to track front-end changes yourself.
What are the compliance limits for short-term rental data scraping?
Collect only publicly available listing data, never host contact details or guest content behind a login, and honour GDPR, CCPA and platform terms and rate limits. Use proxies only on accounts you own or manage with authorisation. Geonode's acceptable use policy prohibits fraud, spam and credential abuse.
Start
Build a city-level view of supply, pricing and occupancy from real local IPs. Get started with a $5 three-day trial, or contact sales for a multi-city data pipeline.
Related: Real estate · Travel aggregation · Review monitoring