跳到正文
DEV Community· Catalin Friptu·· 2 小時前AI 評分42

如何用 OpenStreetMap 尋找沒有網站的本地商戶(網頁設計師潛在客戶名單)

How to find local businesses with no website (a lead list for web designers)

AI 導讀

網頁設計師可透過 OpenStreetMap 的 Overpass API,免費按城市搜尋沒有網站標籤的本地商戶,建立潛在客戶名單。文章提醒,缺少網站標籤不代表商戶沒有網站,並建議排除連鎖店及檢查失效或只連結社交平台的網站。付費工具 Businesses Without Websites Finder 每 1,000 條潛在客戶名單收費 $3。

正文

If you build websites for small businesses, the best prospects are the ones that don't have a website yet: a dentist with only a phone number on the map, a salon that lives on Instagram, a restaurant whose domain expired two years ago.

Here's how to build that list for any city from OpenStreetMap, for free, plus the three traps that make most "no website" lists useless.

Step 1: query OpenStreetMap with Overpass

OpenStreetMap stores businesses as tagged objects: amenity=dentist, shop=hairdresser, amenity=restaurant, shop=car_repair, and so on. Many have phone, email, opening_hours, and sometimes website. The Overpass API lets you ask for "dentists in this city with a name but no website tag":

[out:json][timeout:60];
area["name"="Graz"]["boundary"="administrative"]["admin_level"="6"]->.city;
nwr["amenity"="dentist"]["name"](area.city)[!"website"][!"contact:website"];
out center tags;

Paste it into overpass-turbo.eu, press Run, and export the result. For Graz (run on 2026-10-24) that returned 76 dentist entries with no website tag, 62 of them with a phone number (a few are the same practice mapped twice, as a point and as a building).

Swap amenity=dentist for any niche: shop=beauty, shop=hairdresser, amenity=restaurant, office=lawyer, craft=plumber. The admin_level of a city differs by country: if you get zero results, look up the city's boundary relation on openstreetmap.org and check its admin_level tag.

Step 2: don't trust the empty field (the three traps)

This is where raw lists fall apart.

Trap 1: "no website tag" is not "no website". OSM volunteers often skip the field. A missing tag means unknown. Google the name before you pitch, or you'll be the person offering a website to someone who has a nice one.

Trap 2: chains. Franchise locations are often mapped without a website, because the brand site is elsewhere. Your "leads" fill up with Subway and Dave & Buster's. Filter out anything with a brand or brand:wikidata tag, and any name that appears at several locations in your area.

Trap 3: the website field lies the other way too. When a business does list a website, check it:

  • the domain doesn't resolve any more (expired: great lead),
  • it times out or returns 404 (broken: great lead),
  • it's actually a Facebook or Instagram URL, or the domain redirects to a Facebook page (social only: great lead).

A simple HEAD request, falling back to GET, with a short timeout catches all three. Be generous in the other direction: a 403 from a bot wall or a 500 means a server exists, so don't count that as "no website".

Step 3: make the phone numbers usable

Mappers type phone numbers however they like: 0316 822052, +43 316 822 052, (0316) 82-20-52. Convert them to international E.164 (+43316822052) with the phonenumbers library and the country of the city, so they work in a dialer, WhatsApp or a CRM.

The shortcut

Disclosure: I packaged all of the above as a pay-per-result Actor on the Apify Store, Businesses Without Websites Finder. You type a city and pick categories, and it:

  • runs the Overpass queries per category,
  • removes duplicates (shops are often mapped twice, as a point and as a building),
  • skips chains using OSM brand tags and the name-suggestion-index,
  • checks every listed website live and labels each business none, social_only or dead, with the reason (DNS lookup failed, timeout, website redirects to www.facebook.com),
  • converts phones to E.164.

A run for dentists in Chișinău returns 100 leads in about 90 seconds. It costs $3 per 1,000 leads, and businesses that get filtered out are free. It also works from Make, Zapier or n8n if you want new leads to land in a Google Sheet every week.

Whichever route you take: check each lead by hand before you call, and keep the local rules for cold outreach in mind (in the EU, GDPR and ePrivacy apply to calls and emails).


Data © OpenStreetMap contributors, ODbL. I'm Cătălin, a Python developer in Chișinău. If you try the query on your city and get zero results, post the city in the comments and I'll help with the area filter. Drafted with AI assistance, tested and edited by me.

來源:DEV Community · dev.to