1+ import requests
2+ import json
3+
4+ class Redfin :
5+ def __init__ (self ):
6+ self .base = 'https://redfin.com/stingray/'
7+ self .user_agent_header = {
8+ 'user-agent' : 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36'
9+ }
10+
11+ def meta_property (self , url , kwargs , page = False ):
12+ if page :
13+ kwargs ['pageType' ] = 3
14+ return self .meta_request ('api/home/details/' + url , {
15+ 'accessLevel' : 1 ,
16+ ** kwargs
17+ })
18+
19+ def meta_request (self , url , kwargs ):
20+ response = requests .get (self .base + url , params = kwargs , headers = self .user_agent_header )
21+ response .raise_for_status ()
22+ return json .loads (response .text [4 :])
23+
24+ # Url Requests
25+
26+ def initial_info (self , url , ** kwargs ):
27+ return self .meta_request ('api/home/details/initialInfo' , {'path' : url ,** kwargs })
28+
29+ def page_tags (self , url , ** kwargs ):
30+ return self .meta_request ('api/home/details/v1/pagetagsinfo' , {'path' : url , ** kwargs })
31+
32+ def primary_region (self , url , ** kwargs ):
33+ return self .meta_request ('api/home/details/primaryRegionInfo' , {'path' : url , ** kwargs })
34+
35+ # Search
36+ def search (self , query , ** kwargs ):
37+ return self .meta_request ('do/location-autocomplete' , {'location' : query , 'v' : 2 , ** kwargs })
38+
39+ # Property ID Requests
40+ def hood_photos (self , property_id , ** kwargs ):
41+ return self .meta_request ('api/home/details/hood-photos' , {'propertyId' : property_id , ** kwargs })
42+
43+ def more_resources (self , property_id , ** kwargs ):
44+ return self .meta_request ('api/home/details/moreResourcesInfo' , {'propertyId' : property_id , ** kwargs })
45+
46+ def page_header (self , property_id , ** kwargs ):
47+ return self .meta_request ('api/home/details/homeDetailsPageHeaderInfo' , {'propertyId' : property_id , ** kwargs })
48+
49+ def property_comments (self , property_id , ** kwargs ):
50+ return self .meta_request ('api/v1/home/details/propertyCommentsInfo' , {'propertyId' : property_id , ** kwargs })
51+
52+ def building_details_page (self , property_id , ** kwargs ):
53+ return self .meta_request ('api/building/details-page/v1' , {'propertyId' : property_id , ** kwargs })
54+
55+ def owner_estimate (self , property_id , ** kwargs ):
56+ return self .meta_request ('api/home/details/owner-estimate' , {'propertyId' : property_id , ** kwargs })
57+
58+ def claimed_home_seller_data (self , property_id , ** kwargs ):
59+ return self .meta_request ('api/home/details/claimedHomeSellerData' , {'propertyId' : property_id , ** kwargs })
60+
61+ def cost_of_home_ownership (self , property_id , ** kwargs ):
62+ return self .meta_request ('do/api/costOfHomeOwnershipDetails' , {'propertyId' : property_id , ** kwargs })
63+
64+ # Listing ID Requests
65+ def floor_plans (self , listing_id , ** kwargs ):
66+ return self .meta_request ('api/home/details/listing/floorplans' , {'listingId' : listing_id , ** kwargs })
67+
68+ def tour_list_date_picker (self , listing_id , ** kwargs ):
69+ return self .meta_request ('do/tourlist/getDatePickerData' , {'listingId' : listing_id , ** kwargs })
70+
71+ # Table ID Requests
72+
73+ def shared_region (self , table_id , ** kwargs ):
74+ return self .meta_request ('api/region/shared-region-info' , {'tableId' : table_id , 'regionTypeId' : 2 , 'mapPageTypeId' : 1 , ** kwargs })
75+
76+ # Property Requests
77+
78+ def similar_listings (self , property_id , listing_id , ** kwargs ):
79+ return self .meta_property ('similars/listings' , {'propertyId' : property_id , 'listingId' : listing_id , ** kwargs })
80+
81+ def similar_sold (self , property_id , listing_id , ** kwargs ):
82+ return self .meta_property ('similars/solds' , {'propertyId' : property_id , 'listingId' : listing_id , ** kwargs })
83+
84+ def nearby_homes (self , property_id , listing_id , ** kwargs ):
85+ return self .meta_property ('nearbyhomes' , {'propertyId' : property_id , 'listingId' : listing_id , ** kwargs })
86+
87+ def above_the_fold (self , property_id , listing_id , ** kwargs ):
88+ return self .meta_property ('aboveTheFold' , {'propertyId' : property_id , 'listingId' : listing_id , ** kwargs })
89+
90+ def below_the_fold (self , property_id , listing_id , ** kwargs ):
91+ return self .meta_property ('belowTheFold' , {'propertyId' : property_id , 'listingId' : listing_id , ** kwargs }, page = True )
92+
93+ def property_parcel (self , property_id , listing_id , ** kwargs ):
94+ return self .meta_property ('propertyParcelInfo' , {'propertyId' : property_id , 'listingId' : listing_id , ** kwargs }, page = True )
95+
96+ def activity (self , property_id , listing_id , ** kwargs ):
97+ return self .meta_property ('activityInfo' , {'propertyId' : property_id , 'listingId' : listing_id , ** kwargs })
98+
99+ def customer_conversion_info_off_market (self , property_id , listing_id , ** kwargs ):
100+ return self .meta_property ('customerConversionInfo/offMarket' , {'propertyId' : property_id , 'listingId' : listing_id , ** kwargs }, page = True )
101+
102+ def rental_estimate (self , property_id , listing_id , ** kwargs ):
103+ return self .meta_property ('rental-estimate' , {'propertyId' : property_id , 'listingId' : listing_id , ** kwargs })
104+
105+ def avm_historical (self , property_id , listing_id , ** kwargs ):
106+ return self .meta_property ('avmHistoricalData' , {'propertyId' : property_id , 'listingId' : listing_id , ** kwargs })
107+
108+ def info_panel (self , property_id , listing_id , ** kwargs ):
109+ return self .meta_property ('mainHouseInfoPanelInfo' , {'propertyId' : property_id , 'listingId' : listing_id , ** kwargs })
110+
111+ def descriptive_paragraph (self , property_id , listing_id , ** kwargs ):
112+ return self .meta_property ('descriptiveParagraph' , {'propertyId' : property_id , 'listingId' : listing_id , ** kwargs })
113+
114+ def avm_details (self , property_id , listing_id , ** kwargs ):
115+ return self .meta_property ('avm' , {'propertyId' : property_id , 'listingId' : listing_id , ** kwargs })
116+
117+ def tour_insights (self , property_id , listing_id , ** kwargs ):
118+ return self .meta_property ('tourInsights' , {'propertyId' : property_id , 'listingId' : listing_id , ** kwargs }, page = True )
119+
120+ def stats (self , property_id , listing_id , region_id , ** kwargs ):
121+ return self .meta_property ('stats' , {'regionId' : region_id , 'propertyId' : property_id , 'listingId' : listing_id , 'regionTypeId' : 2 , ** kwargs })
0 commit comments