- pending or contingent support
parent
de692faae2
commit
8a5f0dc2c9
|
@ -13,6 +13,7 @@ def scrape_property(
|
||||||
radius: float = None,
|
radius: float = None,
|
||||||
mls_only: bool = False,
|
mls_only: bool = False,
|
||||||
property_younger_than: int = None,
|
property_younger_than: int = None,
|
||||||
|
pending_or_contingent: bool = False,
|
||||||
proxy: str = None,
|
proxy: str = None,
|
||||||
) -> pd.DataFrame:
|
) -> pd.DataFrame:
|
||||||
"""
|
"""
|
||||||
|
@ -22,6 +23,7 @@ def scrape_property(
|
||||||
:param radius: Get properties within _ (e.g. 1.0) miles. Only applicable for individual addresses.
|
:param radius: Get properties within _ (e.g. 1.0) miles. Only applicable for individual addresses.
|
||||||
:param mls_only: If set, fetches only listings with MLS IDs.
|
:param mls_only: If set, fetches only listings with MLS IDs.
|
||||||
:param property_younger_than: Get properties sold/listed in last _ days.
|
:param property_younger_than: Get properties sold/listed in last _ days.
|
||||||
|
:param pending_or_contingent: If set, fetches only pending or contingent listings. Only applicable for for_sale listings from general area searches.
|
||||||
:param proxy: Proxy to use for scraping
|
:param proxy: Proxy to use for scraping
|
||||||
"""
|
"""
|
||||||
validate_input(listing_type)
|
validate_input(listing_type)
|
||||||
|
@ -33,6 +35,7 @@ def scrape_property(
|
||||||
radius=radius,
|
radius=radius,
|
||||||
mls_only=mls_only,
|
mls_only=mls_only,
|
||||||
last_x_days=property_younger_than,
|
last_x_days=property_younger_than,
|
||||||
|
pending_or_contingent=pending_or_contingent,
|
||||||
)
|
)
|
||||||
|
|
||||||
site = RealtorScraper(scraper_input)
|
site = RealtorScraper(scraper_input)
|
||||||
|
|
|
@ -12,6 +12,7 @@ class ScraperInput:
|
||||||
mls_only: bool | None = None
|
mls_only: bool | None = None
|
||||||
proxy: str | None = None
|
proxy: str | None = None
|
||||||
last_x_days: int | None = None
|
last_x_days: int | None = None
|
||||||
|
pending_or_contingent: bool | None = None
|
||||||
|
|
||||||
|
|
||||||
class Scraper:
|
class Scraper:
|
||||||
|
@ -37,6 +38,7 @@ class Scraper:
|
||||||
self.radius = scraper_input.radius
|
self.radius = scraper_input.radius
|
||||||
self.last_x_days = scraper_input.last_x_days
|
self.last_x_days = scraper_input.last_x_days
|
||||||
self.mls_only = scraper_input.mls_only
|
self.mls_only = scraper_input.mls_only
|
||||||
|
self.pending_or_contingent = scraper_input.pending_or_contingent
|
||||||
|
|
||||||
def search(self) -> list[Property]:
|
def search(self) -> list[Property]:
|
||||||
...
|
...
|
||||||
|
|
|
@ -328,7 +328,9 @@ class RealtorScraper(Scraper):
|
||||||
else "sort: [{ field: list_date, direction: desc }]"
|
else "sort: [{ field: list_date, direction: desc }]"
|
||||||
)
|
)
|
||||||
|
|
||||||
if search_type == "comps":
|
pending_or_contingent_param = "or_filters: { contingent: true, pending: true }" if self.pending_or_contingent else ""
|
||||||
|
|
||||||
|
if search_type == "comps": #: comps search, came from an address
|
||||||
query = """query Property_search(
|
query = """query Property_search(
|
||||||
$coordinates: [Float]!
|
$coordinates: [Float]!
|
||||||
$radius: String!
|
$radius: String!
|
||||||
|
@ -352,7 +354,7 @@ class RealtorScraper(Scraper):
|
||||||
sort_param,
|
sort_param,
|
||||||
results_query,
|
results_query,
|
||||||
)
|
)
|
||||||
elif search_type == "area":
|
elif search_type == "area": #: general search, came from a general location
|
||||||
query = """query Home_search(
|
query = """query Home_search(
|
||||||
$city: String,
|
$city: String,
|
||||||
$county: [String],
|
$county: [String],
|
||||||
|
@ -368,6 +370,7 @@ class RealtorScraper(Scraper):
|
||||||
state_code: $state_code
|
state_code: $state_code
|
||||||
status: %s
|
status: %s
|
||||||
%s
|
%s
|
||||||
|
%s
|
||||||
}
|
}
|
||||||
%s
|
%s
|
||||||
limit: 200
|
limit: 200
|
||||||
|
@ -375,10 +378,11 @@ class RealtorScraper(Scraper):
|
||||||
) %s""" % (
|
) %s""" % (
|
||||||
self.listing_type.value.lower(),
|
self.listing_type.value.lower(),
|
||||||
date_param,
|
date_param,
|
||||||
|
pending_or_contingent_param,
|
||||||
sort_param,
|
sort_param,
|
||||||
results_query,
|
results_query,
|
||||||
)
|
)
|
||||||
else:
|
else: #: general search, came from an address
|
||||||
query = (
|
query = (
|
||||||
"""query Property_search(
|
"""query Property_search(
|
||||||
$property_id: [ID]!
|
$property_id: [ID]!
|
||||||
|
|
|
@ -5,6 +5,21 @@ from homeharvest.exceptions import (
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_realtor_pending_or_contingent():
|
||||||
|
pending_or_contingent_result = scrape_property(
|
||||||
|
location="Surprise, AZ",
|
||||||
|
pending_or_contingent=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
regular_result = scrape_property(
|
||||||
|
location="Surprise, AZ",
|
||||||
|
pending_or_contingent=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert all([result is not None for result in [pending_or_contingent_result, regular_result]])
|
||||||
|
assert len(pending_or_contingent_result) != len(regular_result)
|
||||||
|
|
||||||
|
|
||||||
def test_realtor_comps():
|
def test_realtor_comps():
|
||||||
result = scrape_property(
|
result = scrape_property(
|
||||||
location="2530 Al Lipscomb Way",
|
location="2530 Al Lipscomb Way",
|
||||||
|
|
Loading…
Reference in New Issue