diff --git a/HousingData.xls b/HousingData.xls new file mode 100644 index 0000000..bc5c105 Binary files /dev/null and b/HousingData.xls differ diff --git a/ZillowGrabber.py b/ZillowGrabber.py new file mode 100644 index 0000000..e55df53 --- /dev/null +++ b/ZillowGrabber.py @@ -0,0 +1,139 @@ +import numpy as np +import pandas as pd +import zillow +import configparser +from oauth2client.service_account import ServiceAccountCredentials +import os.path +from googleapiclient.discovery import build +from google_auth_oauthlib.flow import InstalledAppFlow +from google.auth.transport.requests import Request +import pickle +import datetime + +# Open our config file +config = configparser.ConfigParser() +config.read('zillowkey.conf') + +# Grab our key +key = config['DEFAULT']['zillowkey'] + +# Setup zillow api +api = zillow.ValuationApi() + +# Load in our data and cut out irrelevant information +addresses = pd.read_excel('HousingData.xls') +address_df = addresses.loc[addresses['County'].isin(['Orange', 'Los Angeles', 'San Bernardino', 'Riverside'])] +address_df = addresses.loc[addresses['Status'].isin(['Postponed', 'Auction'])] +address_df = address_df.drop(['Original Principal Balance'], axis=1).dropna(subset=['Property Address', 'Zip']) + +df = address_df.copy() + +# Setup lists to be added to our dataframe from zillow api +zestimate = [] +zillow_year_build = [] +zillow_lot_size_sqft = [] +zillow_bathrooms = [] +zillow_bedrooms = [] + +# Go through each address, grab info, add it to our lists +for index, row in address_df.iterrows(): + address = address_df['Property Address'][index].rstrip('\n') + postal_code = str(int(address_df['Zip'][index])) + try: + data = api.GetDeepSearchResults(key, address, postal_code) + datadict = data.get_dict() + zestimate.append(datadict['zestimate']['amount']) + zillow_year_build.append(datadict['extended_data']['year_built']) + zillow_lot_size_sqft.append(datadict['extended_data']['lot_size_sqft']) + zillow_bathrooms.append(datadict['extended_data']['bathrooms']) + zillow_bedrooms.append(datadict['extended_data']['bedrooms']) + except: + zestimate.append(None) + zillow_year_build.append(None) + zillow_lot_size_sqft.append(None) + zillow_bathrooms.append(None) + zillow_bedrooms.append(None) + +# Create new columns in our dataframe from our lists +df['zestimate'] = zestimate +df['zillow_year_build'] = zillow_year_build +df['zillow_lot_size_sqft'] = zillow_lot_size_sqft +df['zillow_bathrooms'] = zillow_bathrooms +df['zillow_bedrooms'] = zillow_bedrooms + + +df.drop(columns=['State'], inplace=True) +df = df.fillna('None') + +# If modifying these scopes, delete the file token.pickle. +SCOPES = ['https://www.googleapis.com/auth/spreadsheets'] + +# The ID and range of a sample spreadsheet. +sheet_name = "TEST" +range_ = "Sheet1!A:A" + +# Name for sheet +d = datetime.datetime.today() +sheet_name = 'Housing ' + d.strftime('%d-%m-%Y') + +def main(): + creds = None + # The file token.pickle stores the user's access and refresh tokens, and is + # created automatically when the authorization flow completes for the first + # time. + if os.path.exists('token.pickle'): + with open('token.pickle', 'rb') as token: + creds = pickle.load(token) + # If there are no (valid) credentials available, let the user log in. + if not creds or not creds.valid: + if creds and creds.expired and creds.refresh_token: + creds.refresh(Request()) + else: + flow = InstalledAppFlow.from_client_secrets_file( + 'credentials.json', SCOPES) + creds = flow.run_local_server(port=0) + # Save the credentials for the next run + with open('token.pickle', 'wb') as token: + pickle.dump(creds, token) + + service = build('sheets', 'v4', credentials=creds) + + # Call the Sheets API + sheet = service.spreadsheets() + + # Create new Sheet + spreadsheet = { + 'properties': { + 'title': sheet_name + } + } + spreadsheet = service.spreadsheets().create(body=spreadsheet, + fields='spreadsheetId').execute() + spreadsheet_id = spreadsheet.get('spreadsheetId') + print('Spreadsheet ID: {0}'.format(spreadsheet.get('spreadsheetId'))) + + # Fill in header + list = [df.columns.tolist()] + + resource = { + "majorDimension": "ROWS", + "values": list + } + + request = service.spreadsheets().values().append(spreadsheetId=spreadsheet_id, range=range_, body=resource, + valueInputOption="USER_ENTERED") + response = request.execute() + + # Fill in body + list = df.values.tolist() + + resource = { + "majorDimension": "ROWS", + "values": list + } + + request = service.spreadsheets().values().append(spreadsheetId=spreadsheet_id, range=range_, body=resource, + valueInputOption="USER_ENTERED") + response = request.execute() + +main() diff --git a/ZillowGrabber.spec b/ZillowGrabber.spec new file mode 100644 index 0000000..8d9b78a --- /dev/null +++ b/ZillowGrabber.spec @@ -0,0 +1,33 @@ +# -*- mode: python ; coding: utf-8 -*- + +block_cipher = None + + +a = Analysis(['ZillowGrabber.py'], + pathex=['C:\\Users\\TSB\\Desktop\\Zillow'], + binaries=[], + datas=[], + hiddenimports=[], + hookspath=[], + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + [], + name='ZillowGrabber', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=True ) diff --git a/__pycache__/ZillowGrabber.cpython-38.pyc b/__pycache__/ZillowGrabber.cpython-38.pyc new file mode 100644 index 0000000..1fbdcaa Binary files /dev/null and b/__pycache__/ZillowGrabber.cpython-38.pyc differ diff --git a/credentials.json b/credentials.json new file mode 100644 index 0000000..a0d6bc7 --- /dev/null +++ b/credentials.json @@ -0,0 +1 @@ +{"installed":{"client_id":"495919805073-o2o41tu9c9pv9mpo4ugjdcca6h5jg5u7.apps.googleusercontent.com","project_id":"zillowfun-1581659411719","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"HL2xQvsWITylqar1GsC8noW1","redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]}} \ No newline at end of file diff --git a/zillowkey.conf b/zillowkey.conf new file mode 100644 index 0000000..fb6e7a3 --- /dev/null +++ b/zillowkey.conf @@ -0,0 +1,3 @@ +[DEFAULT] +zillowkey = X1-ZWz1bxj5x02juz_2rqd6 +