

robots.txt. County tax, parcel, and permit records are different again: many counties publish open-data portals or bulk files, and those are the correct starting point before deciding to scrape. Rental listings on niche or regional platforms sites with no feed to license and no public API to call are where most legitimate scraping work actually happens in practice.
list_price grouped by zip, property type, and bed count. List-to-sale ratiosale_price / original_list_pricegets computed only on closed records, never on active listings, since an active list price hasn't produced a market outcome yet.unit_id is built from normalized address plus unit number plus bed/bath count plus square footage within a 5% tolerance. If two listings match on address and unit number but differ on bed/bath count, treat them as different units rather than forcing a merge the alternative makes quiet errors that are hard to audit after the fact. Each occurrence keeps its own first_seen_date and last_seen_date; the canonical unit_id ties them together across sources.data_quality_flag or is_imputed boolean alongside any imputed value. Anything downstream a model, a report, a person reviewing an offer needs to know which numbers to trust less.listing_office_id. Portal-only data often doesn't, and free-text brokerage names need normalization strip suffix variance like "Realty," "Group," and "& Associates," then fuzzy-match the remainder into a canonical brokerage_id. For the handful of brokerages that actually matter in a given market, the fuzzy match is worth a manual review pass before trusting it. Misattributing market share to the wrong firm isn't a small rounding error; it makes the analysis answer the wrong question..gov page doesn't answer whether scraping it at scale and incorporating it into a commercial product is permitted that requires checking the specific office's terms or asking directly.parcel_id. Tax trends are a time series keyed on (parcel_id, assessment_year). Neither is difficult once the data is in a clean, consistently structured form getting there from the raw county output is usually where the engineering time actually goes.listing_id. If the hash matches, nothing changed: update last_seen_date and move on. If it doesn't, write a new row to an append-only event log and overwrite a separate current-state table:


listing_id and timestamp never creates a duplicate event.listing_events, not engineering problems.robots.txt, and not just a general sense of what "public" means. Zillow's terms, for example, explicitly prohibit using "any robot, spider, scraper or other automated means" to access the service without written permission (Zillow Terms of Use). Most major portals carry some version of that clause. Enforceability varies by jurisdiction and legal theory in the US, Computer Fraud and Abuse Act claims have been read differently across federal circuits, so "they probably won't sue" is a different question from "this is permitted," and treating them as the same question is how compliance problems start.Posted Jun 26, 2026
Shishir Sutradhar discusses data strategies for real estate scraping, covering seven impactful workflows for 2026.