A free, no-API-key business/place finder built entirely on open data. Search any city for real businesses by category, break a whole country down by city, compare multiple searches side by side, or pull structured data out of any public webpage — all running locally on your own machine.
- Why it exists
- Features
- Install
- Run it
- Optional integrations
- How it works
- Project structure
- A note on ethics
- Feedback & issues
- Support this project
- License
Every data source this app uses is free and public — OpenStreetMap (via Nominatim + Overpass), Wikidata, Wikipedia, the World Bank, and a few other open APIs. No scraping of Google Maps, Google Search, or any platform that prohibits automated access — that's a hard line, not a limitation worked around. The one genuinely optional, non-free integration (Google Places, for a phone-number fallback) is opt-in and clearly marked.
The main tool. Pick a city (or address, or postal code) and one or more of 90 business categories — restaurants, hotels, pharmacies, banks, gyms, schools, and dozens more, groupable into quick bundles — and get every matching real place OpenStreetMap knows about.
- Multiple search areas: a city/address, a whole batch of cities at once (e.g. compare Doha + Dubai + Riyadh in one run), your current location ("Near Me"), a shape you draw directly on the map, or a corridor along a driving route between two places (free OSRM routing)
- Filters: include/exclude keywords, distance from a landmark, maximum results per category
- Optional enrichment (slower, thorough): finds missing phone numbers by checking each business's own website (including Contact/About pages), flags dead websites, verifies email domains resolve, pulls social links the business itself published, adds elevation data, and — if you add a free Mapillary token — an inline street-level photo preview
- Live map: clustered markers, a density heatmap toggle, distance rings, color-coded by category
- Results table: sortable, filterable (has phone / has website / dead site / high data quality), with a data-quality score per result
- Export: Excel, CSV, GeoJSON, or vCard, straight from the browser
Pick a country and category and see real counts broken down by every city, with a bar chart and CSV export — plus population data and a per-1,000-people rate where available. Or zoom out further to a continent-level report (country-by-country totals across an entire continent in one request).
Run up to 4 independent searches side by side — different cities, categories, or keywords — and compare totals and data coverage at a glance, with a chart and table.
Every past search, newest first.
Pulls the title, text, tables, and links out of any single public page.
Respects robots.txt and will refuse pages that disallow automated access
rather than trying to get around it. Falls back to rendering JavaScript
(via Playwright) when a page needs it.
- A small command-line tool (
cli.py) for scripted searches without a browser - A public JSON API (
/api-docsonce running) documenting every endpoint above for your own scripts/tools - Light/dark theme, saved search templates, desktop notifications, "did you mean" suggestions for typo'd place names
Requires Python 3.12+ (the pinned numpy/pandas versions in
requirements.txt need it — installing on 3.10/3.11 will fail to resolve
numpy).
git clone https://github.com/VEN0MXDARK/Scraper.git
cd Scraper
python -m venv venv
# Windows
venv\Scripts\activate
# macOS/Linux
source venv/bin/activate
pip install -r requirements.txt
playwright install chromium
# Optional - only needed if you want one of the optional integrations below
cp config_local.example.py config_local.pypython app.pyThen open http://127.0.0.1:5000 in your browser. That's it — no accounts, no API keys, no setup beyond this.
Everything above works with zero configuration. A few extras are available
if you want them — all opt-in, all documented with setup steps in
config_local.example.py (copy it to config_local.py and fill in only
what you want; that file is gitignored, so your keys never get committed):
| Integration | Free? | What it adds |
|---|---|---|
| Google Places API | No (needs billing) | Fallback phone-number lookup for businesses OSM doesn't have a number for |
| Custom/self-hosted Overpass mirror | Yes | Use your own Overpass instance instead of the 3 public ones |
| GeoNames | Yes (free account) | A second gazetteer to cross-check place names Nominatim can't resolve |
| Mapillary | Yes (free account) | Inline street-level photo thumbnails instead of just a link out |
Leave any of them blank in config_local.py and that feature quietly stays
off — nothing breaks.
- Geocoding & search: Nominatim resolves place names to real administrative boundaries (not rectangular bounding boxes, so results near a border don't bleed into the neighboring country/city); Overpass API queries OpenStreetMap's tagged data within that boundary, falling back across 3 free public mirrors with health tracking and backoff
- Persistence: a local SQLite database (
data/scout.db) tracks every place seen across searches, enabling favorites, notes, tags, projects, and diff/comparison views via the API (see/api-docs) - Enrichment sources: each business's own website (phone/email/social links, robots.txt-respecting), Wikidata, Wikipedia, open-elevation.com, Mapillary
- Frontend: plain HTML/CSS/JS, no build step, no framework — every
frontend library (Leaflet, Leaflet.draw, Leaflet.heat) is self-hosted
under
static/vendor/, no CDN dependency at runtime
app.py Flask routes
scraper.py Core search/enrichment logic
cli.py Command-line entry point
config.py Settings defaults
config_local.example.py Template for your own optional settings/keys
config_local.py Your copy of the above (gitignored, not in the repo)
utils/ One module per data source/concern
templates/ Server-rendered pages
static/ CSS, JS, self-hosted vendor libraries
data/, output/ Local SQLite DB and exported files (gitignored)
This app only ever talks to sources that explicitly allow programmatic
access (OpenStreetMap's API, Wikidata, Wikipedia, etc.) or that a website
itself allows via robots.txt. It does not scrape Google, Facebook, or any
platform whose terms prohibit it, and it does not attempt to bypass
anti-bot protections anywhere. If a source says no, this app takes no for
an answer.
Found a bug, have a feature idea, or a category/data source that should be added? Open an issue on this repo — that's the best way to reach me about this project.
This tool is free and always will be — no ads, no paywalled features, no "pro" tier. If it saved you time and you'd like to say thanks, tips are appreciated but never expected:
Binance Pay ID: 92555348
MIT — see LICENSE. Use it, modify it, ship it, no strings attached; just keep the copyright notice.