Rent prices are changing faster than ever.
Platforms like Zillow (USA), Apartments.com (USA), Bayut (UAE), Property Finder (UAE), 99acres (India), Magicbricks (India) update rental listings daily and influence:
This tutorial shows how to build a complete Rental Trends Dashboard using:
You’ll learn how to scrape rental listings from USA, UAE, and India, clean the data, extract key indicators, and build a functional dashboard dataset.
This is the same workflow Actowiz Solutions uses in large-scale rental intelligence projects.
pip install selenium
pip install beautifulsoup4
pip install requests
pip install pandas
pip install matplotlib
pip install plotly
pip install undetected-chromedriver
We will scrape:
And then merge them into a unified rental intelligence table.
Zillow rental pages show:
Example URL:
https://www.zillow.com/homes/for_rent/San-Francisco,-CA_rb/
import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from time import sleep
browser = uc.Chrome()
browser.get("https://www.zillow.com/homes/for_rent/San-Francisco,-CA_rb/")
sleep(5)
for _ in range(12):
browser.find_element(By.TAG_NAME, "body").send_keys(Keys.END)
sleep(2)
cards = browser.find_elements(By.XPATH, '//article')
usa_rentals = []
for card in cards:
try:
address = card.find_element(By.CLASS_NAME, "list-card-addr").text
except:
address = ""
try:
price = card.find_element(By.CLASS_NAME, "list-card-price").text
except:
price = ""
try:
beds = card.find_element(By.CLASS_NAME, "list-card-details").text
except:
beds = ""
try:
url = card.find_element(By.TAG_NAME, "a").get_attribute("href")
except:
url = ""
usa_rentals.append({
"country": "USA",
"platform": "Zillow",
"address": address,
"price_raw": price,
"beds_raw": beds,
"url": url
})
Example URL:
https://www.bayut.com/to-rent/apartments/dubai/
browser.get("https://www.bayut.com/to-rent/apartments/dubai/")
sleep(5)
for _ in range(10):
browser.find_element(By.TAG_NAME, "body").send_keys(Keys.END)
sleep(2)
uae_rentals = []
items = browser.find_elements(By.XPATH, '//article[contains(@class,"ee734f1a")]')
for item in items:
try:
title = item.find_element(By.CLASS_NAME, "_7afabd84").text
except:
title = ""
try:
price = item.find_element(By.CLASS_NAME, "_105b8a67").text
except:
price = ""
try:
location = item.find_element(By.CLASS_NAME, "_162e6467").text
except:
location = ""
try:
url = item.find_element(By.TAG_NAME, "a").get_attribute("href")
except:
url = ""
uae_rentals.append({
"country": "UAE",
"platform": "Bayut",
"location": location,
"price_raw": price,
"title": title,
"url": url
})
Example link:
https://www.99acres.com/search/rent/residential-apartments/bangalore
browser.get("https://www.99acres.com/search/rent/residential-apartments/bangalore")
sleep(5)
india_rentals = []
cards = browser.find_elements(By.XPATH, '//div[contains(@class,"boxWrap")]')
for c in cards:
try:
price = c.find_element(By.CLASS_NAME, "srpRentPrice").text
except:
price = ""
try:
details = c.find_element(By.CLASS_NAME, "srpDataWrap").text
except:
details = ""
try:
url = c.find_element(By.TAG_NAME, "a").get_attribute("href")
except:
url = ""
india_rentals.append({
"country": "India",
"platform": "99acres",
"details": details,
"price_raw": price,
"url": url
})
import pandas as pd
df = pd.DataFrame(usa_rentals + uae_rentals + india_rentals)
df.head()
Remove unwanted characters:
import re
def clean_price(val):
if not val:
return None
val = val.replace(",", "").replace("AED","").replace("₹","").replace("$","")
nums = re.findall(r"\d+", val)
return int(nums[0]) if nums else None
df["price_num"] = df["price_raw"].apply(clean_price)
from currency_converter import CurrencyConverter
c = CurrencyConverter()
def convert_to_usd(row):
if row["country"] == "USA":
return row["price_num"]
if row["country"] == "UAE":
return c.convert(row["price_num"], "AED", "USD")
if row["country"] == "India":
return c.convert(row["price_num"], "INR", "USD")
df["price_usd"] = df.apply(convert_to_usd, axis=1)
USA (Zillow beds) comes in text like "2 bds | 1 ba | 850 sqft".
UAE (Bayut) includes "2 Beds • 3 Baths".
India (99acres) includes "2 BHK".
Let's extract:
def extract_beds(val):
match = re.search(r"(\d+)\s?(bd|bed|beds|bhk)", val.lower())
return int(match.group(1)) if match else None
df["beds"] = df["beds_raw"].fillna("") + df["title"].fillna("") + df["details"].fillna("")
df["beds"] = df["beds"].apply(extract_beds)
median_rent = df.groupby(["country"])["price_usd"].median()
print(median_rent)
Using Plotly:
import plotly.express as px
fig = px.box(df, x="country", y="price_usd", title="Rental Price Distribution (USA vs UAE vs India)")
fig.show()
Actowiz Solutions often builds:
Example:
df["rent_index"] = df["price_usd"] / df["beds"]
df.to_csv("rental_trends_dashboard.csv", index=False)
Use Actowiz if you need:
We support:
With scalable extraction across:
In this tutorial, you learned how to:
Congratulations — you now have a complete Rental Trends Dashboard engine.
You can also reach us for all your mobile app scraping, data collection, web scraping , and instant data scraper service requirements!
Our web scraping expertise is relied on by 4,000+ global enterprises including Zomato, Tata Consumer, Subway, and Expedia — helping them turn web data into growth.
Watch how businesses like yours are using Actowiz data to drive growth.
From Zomato to Expedia — see why global leaders trust us with their data.
Backed by automation, data volume, and enterprise-grade scale — we help businesses from startups to Fortune 500s extract competitive insights across the USA, UK, UAE, and beyond.
We partner with agencies, system integrators, and technology platforms to deliver end-to-end solutions across the retail and digital shelf ecosystem.
Wegmans Grocery Product Data Extraction helps retailers track prices, products, availability, and assortment changes to improve grocery market intelligence and decisions.
How Actowiz Solutions powered a product-research platform with Alibaba B2B data product fields, MOQ, tiered pricing, supplier info & historical trends via a clean API.
Brazil Car Rental Pricing Intelligence Report 2026 reveals rental price trends, market shifts, competitor rates, and opportunities for smarter pricing.
Whether you're a startup or a Fortune 500 — we have the right plan for your data needs.