Scrapes ZipRecruiter, Indeed, and Google Jobs every day at 3 PM, then emails a list of new entry-level finance roles to your inbox.
cd job_search
# 1. Create and activate a virtual environment (recommended)
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# 2. Install Python dependencies
pip install -r requirements.txt
# 3. Install the Playwright browser (Chromium only)
playwright install chromium
# 4. Copy the env template and fill in your credentials
cp .env.example .env
# Edit .env with your Gmail credentials (see below)Gmail requires an App Password (not your regular password) when using SMTP:
- Go to myaccount.google.com/security
- Under "How you sign in to Google", enable 2-Step Verification if not already on.
- Search for "App passwords" in the search bar at the top.
- Choose app → Mail, device → Other (type "Job Search"), click Generate.
- Copy the 16-character password (shown once) into your
.envasGMAIL_APP_PASSWORD.
Your .env should look like:
SENDER_EMAIL=you@gmail.com
GMAIL_APP_PASSWORD=xxxx xxxx xxxx xxxx
RECIPIENT_EMAIL=recipient@example.com
python run_now.pyRuns a full scrape + email right now. Good for verifying everything works.
python run.pyKeeps running in the foreground. Triggers automatically at 3:00 PM local time every day.
To run in the background (macOS/Linux):
nohup python run.py > /dev/null 2>&1 &| File | Purpose |
|---|---|
database.py |
SQLite helpers — init, insert, dedup |
scraper.py |
ZipRecruiter (requests), Indeed + Google Jobs (Playwright) |
emailer.py |
Builds HTML email and sends via Gmail SMTP |
job_search.py |
Orchestrates scrape → store → email |
run.py |
Daily scheduler (3 PM) |
run_now.py |
One-shot immediate run |
jobs.db |
SQLite database (auto-created on first run) |
logs/job_search.log |
Run history with timestamps |
Each job is stored by (company, job_title) as a unique key. If the same posting appears on multiple sites or on a future day, it is stored once and never re-emailed. Only jobs whose (company, job_title) pair has never been seen before are included in the daily email.
- investment banking analyst
- private equity analyst
- venture capital analyst
- equity research analyst
- growth equity analyst
- asset management analyst
All searches include "entry level" to target 0-2 year roles. No location filter is applied.