# How to Scrape Realtor.com: Property Listings, Prices, and Agent Data > Source: https://scrape.do/blog/realtor-scraping/ Published: 2026-05-22 · Updated: 2026-05-22 · Authors: Serhat Kurtulus · Categories: Scraping Use Cases Realtor.com is a high-signal source for US [real estate data](https://scrape.do/blog/redfin-scraping/): active inventory, price changes, agent attribution, and the history that makes comps and market tracking possible. The platform has also expanded into [AI-powered home search](https://www.housingwire.com/articles/realtor-com-launches-ai-powered-home-search-tool/) and launched a [ChatGPT plugin](https://www.prnewswire.com/news-releases/search-homes-and-see-what-you-can-afford-with-the-new-realtorcom-app-in-chatgpt-302727498.html) for querying listings conversationally. The catch is access. Plain `requests` hits [429s](https://scrape.do/blog/429-too-many-requests/) fast, and the HTML we get back is mostly a shell with none of the card data we expected. That is not a dead end. It is a hint that the real payload is already structured. We will route requests through Scrape.do to stay unblocked, extract search listings from embedded JSON, then enrich a single listing via GraphQL into clean artifacts: a CSV of search results and a JSON record with agent, brokerage, history, tax data, and view and save windows. The win condition is simple: the site stops being “a page” and becomes rows. [Full working code on GitHub ⚙](https://github.com/scrape-do/scrapedo-scrapers) [Get 1000 free credits and start scraping with Scrape.do](https://dashboard.scrape.do/signup) ## Scraping Realtor.com Search Results The first obstacle is not selectors. It is access. Realtor.com will happily serve an HTML shell while [rate limiting](https://scrape.do/blog/web-scraping-rate-limit/) the requests that look automated. ### Prerequisites Install the only libraries we need to scrape search results pages: ```bash pip install requests beautifulsoup4 ``` Set a Scrape.do token in `TOKEN` and start with a single search URL. Manhattan is our test bench. Once we see rows, we can swap the URL to any other city. ### Extracting Listings from Embedded JSON Here is the constraint: the “result cards” are not a stable data source in the HTML we receive. Realtor.com ships the listing rows as embedded JSON, and that is what we extract. We fetch the search page through Scrape.do with `super=true` to avoid 429s. This is the stable request shape we keep. ```python import os import urllib.parse import requests TOKEN = "" SEARCH_URL = "https://www.realtor.com/realestateandhomes-search/Manhattan_NY" MAX_PAGES = 3 REQUEST_DELAY_SEC = 1.5 def fetch(target_url): api_url = f"http://api.scrape.do/?token={TOKEN}&url={urllib.parse.quote(target_url, safe='')}&super=true" r = requests.get(api_url, timeout=120) if r.status_code != 200: print(f" HTTP {r.status_code}") return None return r ``` When this prints `HTTP 200`, we are looking at real Realtor.com HTML. Any other status code means we did not get usable content yet, so we fix the request before moving on. The card data we want is not in the visible HTML. Realtor.com ships it as a JSON object inside a `