# Reonomy Lead Scraper A browser automation tool that scrapes property and owner leads from [Reonomy](https://www.reonomy.com/) and exports them to Google Sheets. ## Features - ✅ Automated login to Reonomy - 🔍 Search for properties by location - 📊 Extract lead data: - Owner Name - Property Address - City, State, ZIP - Property Type - Square Footage - Owner Location - Property Count - Property/Owner URLs - 📈 Export to Google Sheets via `gog` CLI - 🔐 Secure credential handling (environment variables or 1Password) - 🖥️ Headless or visible browser mode ## Prerequisites ### Required Tools 1. **Node.js** (v14 or higher) ```bash # Check if installed node --version ``` 2. **gog CLI** - Google Workspace command-line tool ```bash # Install via Homebrew brew install gog # Or from GitHub # https://github.com/stripe/gog # Authenticate gog auth login ``` 3. **Puppeteer** (installed via npm with this script) ### Optional Tools - **1Password CLI** (`op`) - For secure credential storage ```bash brew install --cask 1password-cli ``` ## Installation 1. Clone or navigate to the workspace directory: ```bash cd /Users/jakeshore/.clawdbot/workspace ``` 2. Install Node.js dependencies: ```bash npm install ``` 3. Make the script executable (should already be done): ```bash chmod +x scrape-reonomy.sh ``` ## Setup ### Option 1: Environment Variables (Recommended for Development) Set your Reonomy credentials as environment variables: ```bash export REONOMY_EMAIL="henry@realestateenhanced.com" export REONOMY_PASSWORD="your_password_here" ``` Or add to your shell profile (e.g., `~/.zshrc` or `~/.bash_profile`): ```bash echo 'export REONOMY_EMAIL="henry@realestateenhanced.com"' >> ~/.zshrc echo 'export REONOMY_PASSWORD="9082166532"' >> ~/.zshrc source ~/.zshrc ``` ### Option 2: 1Password (Recommended for Production) 1. Create a 1Password item named "Reonomy" 2. Add fields: - `email`: Your Reonomy email - `password`: Your Reonomy password 3. Use the `--1password` flag when running the scraper: ```bash ./scrape-reonomy.sh --1password ``` ### Option 3: Interactive Prompt If you don't set credentials, the script will prompt you for them: ```bash ./scrape-reonomy.sh ``` ## Usage ### Basic Usage Run the scraper with default settings (searches "New York, NY"): ```bash ./scrape-reonomy.sh ``` ### Search a Different Location ```bash ./scrape-reonomy.sh --location "Los Angeles, CA" ``` ### Use Existing Google Sheet ```bash ./scrape-reonomy.sh --sheet "1ABC123XYZ..." ``` ### Run in Headless Mode (No Browser Window) ```bash ./scrape-reonomy.sh --headless ``` ### Combined Options ```bash # Search Chicago, use headless mode, save to existing sheet ./scrape-reonomy.sh \ --location "Chicago, IL" \ --headless \ --sheet "1ABC123XYZ..." ``` ### Using 1Password ```bash ./scrape-reonomy.sh --1password --headless ``` ### Direct Node.js Usage You can also run the scraper directly with Node.js: ```bash REONOMY_EMAIL="..." \ REONOMY_PASSWORD="..." \ REONOMY_LOCATION="Miami, FL" \ HEADLESS=true \ node reonomy-scraper.js ``` ## Output ### Google Sheet The scraper creates or appends to a Google Sheet with the following columns: | Column | Description | |--------|-------------| | Scrape Date | Date the lead was scraped | | Owner Name | Property owner's name | | Property Address | Street address of the property | | City | Property city | | State | Property state | | ZIP | Property ZIP code | | Property Type | Type of property (e.g., "General Industrial") | | Square Footage | Property size | | Owner Location | Owner's location | | Property Count | Number of properties owned | | Property URL | Direct link to property page | | Owner URL | Direct link to owner profile | | Email | Owner email (if available) | | Phone | Owner phone (if available) | ### Log File Detailed logs are saved to: ``` /Users/jakeshore/.clawdbot/workspace/reonomy-scraper.log ``` ## Command-Line Options | Option | Description | |--------|-------------| | `-h, --help` | Show help message | | `-l, --location LOC` | Search location (default: "New York, NY") | | `-s, --sheet ID` | Google Sheet ID (creates new sheet if not provided) | | `-H, --headless` | Run in headless mode (no browser window) | | `--no-headless` | Run with visible browser | | `--1password` | Fetch credentials from 1Password | ## Environment Variables | Variable | Required | Description | |----------|----------|-------------| | `REONOMY_EMAIL` | Yes | Your Reonomy email address | | `REONOMY_PASSWORD` | Yes | Your Reonomy password | | `REONOMY_LOCATION` | No | Search location (default: "New York, NY") | | `REONOMY_SHEET_ID` | No | Google Sheet ID (creates new sheet if not set) | | `REONOMY_SHEET_TITLE` | No | Title for new sheet (default: "Reonomy Leads") | | `HEADLESS` | No | Run in headless mode ("true" or "false") | ## Troubleshooting ### "Login failed" Error - Verify your credentials are correct - Check if Reonomy has changed their login process - Try running without headless mode to see what's happening: ```bash ./scrape-reonomy.sh --no-headless ``` ### "gog command failed" Error - Ensure `gog` is installed and authenticated: ```bash gog auth login ``` - Check your Google account has Google Sheets access ### "No leads extracted" Warning - The page structure may have changed - The search location might not have results - Check the screenshot saved to `/tmp/reonomy-no-leads.png` or `/tmp/reonomy-error.png` ### Puppeteer Issues If you encounter browser-related errors, try: ```bash npm install puppeteer --force ``` ## Security Notes ### Credential Security ⚠️ **Important**: Never commit your credentials to version control! **Best Practices:** 1. Use environment variables (set in your shell profile) 2. Use 1Password for production environments 3. Add `.env` files to `.gitignore` 4. Never hardcode credentials in scripts ### Recommended `.gitignore` ```gitignore # Credentials .env .reonomy-credentials.* # Logs *.log reonomy-scraper.log # Screenshots *.png /tmp/reonomy-*.png # Node node_modules/ package-lock.json ``` ## Advanced Usage ### Scheduled Scraping You can set up a cron job to scrape automatically: ```bash # Edit crontab crontab -e # Add line to scrape every morning at 9 AM 0 9 * * * /Users/jakeshore/.clawdbot/workspace/scrape-reonomy.sh --headless --1password >> /tmp/reonomy-cron.log 2>&1 ``` ### Custom Search Parameters The scraper currently searches by location. To customize: 1. Edit `reonomy-scraper.js` 2. Modify the `extractLeadsFromPage` function 3. Add filters for: - Property type - Price range - Building size - Owner type ### Integrating with Other Tools The Google Sheet can be connected to: - Google Data Studio for dashboards - Zapier for automations - Custom scripts for further processing ## Development ### File Structure ``` workspace/ ├── reonomy-scraper.js # Main scraper script ├── scrape-reonomy.sh # Shell wrapper ├── package.json # Node.js dependencies ├── README.md # This file ├── reonomy-scraper.log # Run logs └── node_modules/ # Dependencies ``` ### Testing Test the scraper in visible mode first: ```bash ./scrape-reonomy.sh --no-headless --location "Brooklyn, NY" ``` ### Extending the Scraper To add new data fields: 1. Update the `headers` array in `initializeSheet()` 2. Update the `extractLeadsFromPage()` function 3. Add new parsing functions as needed ## Support ### Getting Help - Check the log file: `reonomy-scraper.log` - Run with visible browser to see issues: `--no-headless` - Check screenshots in `/tmp/` directory ### Common Issues | Issue | Solution | |-------|----------| | Login fails | Verify credentials, try manual login | | No leads found | Try a different location, check search results | | Google Sheets error | Run `gog auth login` to re-authenticate | | Browser timeout | Increase timeout in the script | ## License This tool is for educational and personal use. Respect Reonomy's Terms of Service when scraping. ## Changelog ### v1.0.0 (Current) - Initial release - Automated login - Location-based search - Google Sheets export - 1Password integration - Headless mode support