diff --git a/homeharvest/__init__.py b/homeharvest/__init__.py index 44107eb..a0973ba 100644 --- a/homeharvest/__init__.py +++ b/homeharvest/__init__.py @@ -15,6 +15,7 @@ def scrape_property( proxy: str = None, date_from: str = None, date_to: str = None, + foreclosure: bool = None, ) -> pd.DataFrame: """ Scrape properties from Realtor.com based on a given location and listing type. @@ -38,6 +39,7 @@ def scrape_property( last_x_days=past_days, date_from=date_from, date_to=date_to, + foreclosure=foreclosure, ) site = RealtorScraper(scraper_input) diff --git a/homeharvest/core/scrapers/__init__.py b/homeharvest/core/scrapers/__init__.py index 29dc08f..a0bd471 100644 --- a/homeharvest/core/scrapers/__init__.py +++ b/homeharvest/core/scrapers/__init__.py @@ -13,6 +13,7 @@ class ScraperInput: last_x_days: int | None = None date_from: str | None = None date_to: str | None = None + foreclosure: bool | None = None class Scraper: @@ -40,6 +41,7 @@ class Scraper: self.mls_only = scraper_input.mls_only self.date_from = scraper_input.date_from self.date_to = scraper_input.date_to + self.foreclosure = scraper_input.foreclosure def search(self) -> list[Property]: ... diff --git a/homeharvest/core/scrapers/realtor/__init__.py b/homeharvest/core/scrapers/realtor/__init__.py index 090a12f..530828e 100644 --- a/homeharvest/core/scrapers/realtor/__init__.py +++ b/homeharvest/core/scrapers/realtor/__init__.py @@ -381,9 +381,16 @@ class RealtorScraper(Scraper): if self.listing_type == ListingType.PENDING else "" ) - + listing_type = ListingType.FOR_SALE if self.listing_type == ListingType.PENDING else self.listing_type - + is_foreclosure = "" + + if 'foreclosure' in variables and variables['foreclosure'] == True: + is_foreclosure = "foreclosure: true" + + if 'foreclosure' in variables and variables['foreclosure'] == False: + is_foreclosure = "foreclosure: false" + if search_type == "comps": #: comps search, came from an address query = """query Property_search( $coordinates: [Float]! @@ -392,6 +399,7 @@ class RealtorScraper(Scraper): ) { home_search( query: { + %s nearby: { coordinates: $coordinates radius: $radius @@ -404,6 +412,7 @@ class RealtorScraper(Scraper): limit: 200 offset: $offset ) %s""" % ( + is_foreclosure, listing_type.value.lower(), date_param, pending_or_contingent_param, @@ -420,6 +429,7 @@ class RealtorScraper(Scraper): ) { home_search( query: { + %s city: $city county: $county postal_code: $postal_code @@ -432,6 +442,7 @@ class RealtorScraper(Scraper): limit: 200 offset: $offset ) %s""" % ( + is_foreclosure, listing_type.value.lower(), date_param, pending_or_contingent_param, @@ -541,7 +552,7 @@ class RealtorScraper(Scraper): search_variables = { "offset": 0, } - + search_type = ( "comps" if self.radius and location_type == "address" @@ -586,6 +597,9 @@ class RealtorScraper(Scraper): "postal_code": location_info.get("postal_code"), } + if self.foreclosure: + search_variables['foreclosure'] = self.foreclosure + result = self.general_search(search_variables, search_type=search_type) total = result["total"] homes = result["properties"] diff --git a/tests/test_realtor.py b/tests/test_realtor.py index 018b1b3..43a21da 100644 --- a/tests/test_realtor.py +++ b/tests/test_realtor.py @@ -139,3 +139,15 @@ def test_realtor_bad_address(): if len(bad_results) == 0: assert True + +def test_realtor_foreclosed(): + foreclosed = scrape_property( + location="Dallas, TX", listing_type="for_sale", past_days=100, foreclosure=True + ) + + not_foreclosed = scrape_property( + location="Dallas, TX", listing_type="for_sale", past_days=100, foreclosure=False + ) + + assert len(foreclosed) != len(not_foreclosed) +