Local Leads Finder
Fast, scalable local business lead generation powered by Decodo Web Scraping API.
Turn a simple keyword and location into a ready-to-use dataset of local businesses from Google Maps. Perfect for freelancers, agencies, and SMBs who need quality leads at scale.
Table of Contents
Quick Start
Option 1: Use the hosted web app (recommended)
- Visit Local Leads Finder website to use Local Leads Finder instantly.
- Enter your Decodo username and password directly in the UI when prompted.
- Start a search and download results without any local setup.
Option 2: Run locally
Step 1: Installation
# Clone the repository
git clone https://github.com/yourusername/local-leads-finder.git
cd local-leads-finder
# Install dependencies
pip install -r requirements.txt
# Or install as a package
pip install -e .
Step 2: Get Decodo credentials
Get your Scraper API credentials from Decodo Dashboard:
- Navigate to "Scraper" tab
- Find your username and password
Step 3: Configure environment (CLI only)
Note: The web interface has its own credential management - users enter credentials directly in the UI.
For CLI usage, create a .env file:
# Create .env file
cp .env.example .env
# Add your credentials
echo "DECODO_USERNAME=your_username" >> .env
echo "DECODO_PASSWORD=your_password" >> .env
Step 4: Start collecting leads
Option A: Web Interface
cd webapp
python app.py
Check the terminal output for the exact URL (default is http://localhost:5000, but another free port may be used) and open it in your browser.
Option B: Command Line
leads-finder --query "dentist" --city "Toronto" --out leads.csv
Usage
Web Interface
The web interface provides a modern, user-friendly way to find leads:
-
Start the web server:
cd webapp python app.py
-
Open your browser to the URL printed in the terminal (defaults to
http://localhost:5000, but may vary if that port is in use) -
Fill in the search form:
- Business Type (e.g., "dentist", "pizza restaurant")
- Location with a given radius to look around
- City (e.g., "Toronto", "New York")
- Results Limit (1-1000)
- Country (optional)
-
Watch real-time progress as leads are collected
-
View results in an interactive table
-
Export to CSV or JSON with one click
Command Line Interface
Basic Examples
# Find dentists in Toronto
leads-finder --query "dentist" --city "Toronto" --out toronto_dentists.csv
# Find pizza places in New York (200 results)
leads-finder --query "pizza" --city "New York" --limit 200 --out nyc_pizza.csv
# Find plumbers in Montreal
leads-finder --query "plumber" --city "Montreal" --out montreal_plumbers.csv
CLI Options
leads-finder --help
| Option | Description | Default |
|---|---|---|
--query |
Search keyword (e.g., "dentist", "pizza") | Required |
--city |
Target city name | Required |
--limit |
Max results to collect | 100 |
--out |
Output file (CSV or JSON) | leads.csv |
--rps |
Requests per second rate limit | 1.0 |
--username |
Decodo username | DECODO_USERNAME env var |
--password |
Decodo password | DECODO_PASSWORD env var |
Batch Processing
# Process multiple cities
for city in "Toronto" "Montreal" "Vancouver"; do
leads-finder --query "dentist" --city "$city" --out "dentists_$city.csv"
done
Export to JSON
leads-finder --query "gym" --city "Los Angeles" --out gyms.json
Output Format
CSV file with the following columns:
| Field | Description |
|---|---|
name |
Business name |
category |
Primary category or type |
phone |
Contact number |
website |
Business website |
rating |
Google Maps rating (1-5) |
reviews_count |
Number of reviews |
address |
Full address |
city |
City name |
country |
Country code (US, CA, etc.) |
lat |
Latitude |
lon |
Longitude |
source |
Data source (Google Maps) |
scraped_at |
ISO timestamp |
Docker Usage
Build the image
docker build -t leads-finder .
Run the CLI inside Docker
docker run --rm \
-e DECODO_USERNAME=your_username \
-e DECODO_PASSWORD=your_password \
-v "$(pwd)/output:/out" \
leads-finder \
--query "dentist" --city "Toronto" --out /out/leads.csv
Run the web interface inside Docker
docker run --rm \
-p 5000:5000 \
-e DECODO_USERNAME=your_username \
-e DECODO_PASSWORD=your_password \
leads-finder \
web
Open your browser to http://localhost:5000. To use a different port, change the mapping (-p 8080:8080) and set -e PORT=8080.
API Request Example
from leads_finder.core.scraper_api_session import ScraperAPISession
session = ScraperAPISession(username="user", password="pass")
results = session.google_maps_search(
query="dentist",
geo="Toronto",
limit=100
)
businesses = results.get("results", [])
Future Features
- Social media profiles
- Business hours
- Scheduled scraping
Contributing
Contributions welcome! Please open an issue or PR.
Author
Release files for leads-finder 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| leads_finder-1.0.1.tar.gz | 18.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| leads_finder-1.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size:36.7 kB
Release files / leads_finder-1.0.1.tar.gz
| Download URL | leads_finder-1.0.1.tar.gz |
|---|---|
| Size | 18.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c496caa2fc16308b3119f7a1dfbc5b0a12229e90741f03a55c208d4c7970502f
|
|
BLAKE2b-256 checksum How to use checksums |
3b2b2bb91760241c14a370110f1e1f4c85d6ab80977d55b7dcee2a13c9399e70
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.18
|
Release files / leads_finder-1.0.1-py3-none-any.whl
| Download URL | leads_finder-1.0.1-py3-none-any.whl |
|---|---|
| Size | 18.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4b6a7dfe1225ba0bb5c32bdcbfae9222930e6ad43b674a861958317f6de59451
|
|
BLAKE2b-256 checksum How to use checksums |
1f0871d89276c75b1e39f73f7a4fb6be6a85c0273f1c6b261e14763eed4fefb7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.18
|