Skip to main content
RTILA Marketplace

Turn one category search into a full profile dataset for every business in the results

Search a map category and collect phones, websites and ratings from every business profile page.

Lead Generation Intermediate Experimental v1.0.0 Updated Updated 2026-09-20 8 min read
Download
  • Windows x86_64

    BOT_local-business-profile-scraper.exe

    98.9 MB

    Download
  • macOS Apple Silicon chmod +x

    BOT_local-business-profile-scraper.sh

    87.5 MB

    Download
  • macOS Intel chmod +x

    BOT_local-business-profile-scraper.sh

    99.4 MB

    Download
  • Linux x86_64 chmod +x

    BOT_local-business-profile-scraper.sh

    122.5 MB

    Download

Do not rename the downloaded file - the filename carries the bot's configuration id.

This tab summarises what the bot does, what it costs, the technical requirements it places on your machine, and how the author is credited - the starting point before you download anything.

Key facts

What it does
Search a map category and collect phones, websites and ratings from every business profile page.
What it outputs
BOT_local-business-profile-scraper.exe
Difficulty
intermediate
Platforms
windows, macos, macos_intel, linux
Estimated run time
10-60 minutes depending on how many listings the search returns
Internet at launch
Required
On this page

Overview

The Local Business Profile Scraper is a business profile scraper: a standalone desktop bot that types a category search into a map platform, scrolls the results pane to the end, then visits every listing’s own profile page and extracts eleven detail fields into the Business_Details dataset. Where a results-card scraper stops at names and ratings, this bot goes one level deeper - phone numbers, websites, menus, amenities, price ranges and plus codes all live on the individual profile pages, and that is exactly where the run goes to get them.

What does the Local Business Profile Scraper do?

The run happens in two phases. Phase one works on the search results page: the bot fills the map search box with the term you provide, presses Enter, waits for result cards to render, and scrolls the results pane until it stops growing. It then extracts every listing’s profile URL into the Map_Search_URLs dataset. Phase two iterates over those URLs one by one: for each profile page it waits for the heading to render, then extracts the eleven Business_Details fields - including a parsed amenities list and the numeric rating and review count - and appends the row.

Because everything runs on your own machine, your research footprint stays yours: which categories you are mapping, which cities you are prospecting, which competitors you are benchmarking never passes through a third-party service’s dashboard or logs.

One honesty note, in the same spirit as its sibling listing: the selectors shipped in this configuration target the current public markup of a major map platform and are illustrative examples for the reader’s own permitted target. They are not an affiliation, not an endorsement, and not a guarantee - when a platform redesigns its profile pages, a run ends with empty fields rather than invented ones.

Who uses a business profile scraper?

The local lead-generation freelancer asks “which plumbers in this city publish a phone number but have no website?” and needs phone and website columns side by side to spot exactly that gap. The market researcher asks “what is the density and rating distribution of coffee shops across these three districts?” and needs category, rating and review count per profile. The franchise development team asks “which territories have weak amenity coverage?” and needs the parsed amenities list. The local-SEO consultant asks “what does the profile data of the top-ranked businesses actually contain?” and needs a dated, defensible artifact - a dataset they produced themselves - rather than a screenshot.

How does a local business data extractor run work, step by step?

Every command in the run links to its reference page. First, fill types your prompted search_term variable - ${search_term}, default “coffee shops” - into the map search box, clearing any existing text first, and its then chain fires a press of the Enter key to submit the search. Second, wait_for_selector blocks until the first result card renders, so extraction never races the page. Third, infinite_scroll drives the results pane with a 1500 ms delay per step and an unbounded scroll count - it stops on its own when the pane height stops changing. Fourth, extract_data pulls every profile link into Map_Search_URLs. Finally a for_each loop iterates that dataset: for each item, goto navigates to ${item.PlaceURL}, a second wait_for_selector confirms the profile heading loaded, and a second extract_data appends the eleven-field record to Business_Details.

What does the output look like?

The table mirrors the published sample row exactly:

TitleCategoryAmenitiesPhoneWebsiteMenuPrice_RangeRatingReviews_CountAddressPlus_Code
Blue Door Coffee HouseCoffee shopWi-Fi, outdoor seating, wheelchair accessible+1 555 010 2030https://bluedoorcoffee.example.comhttps://bluedoorcoffee.example.com/menu$$4.51284482 Example Ave, Springfield8FVC2G3M+4X

Title is the business name from the profile heading. The run waits for this heading before extracting, so an empty Title is a strong signal the page never rendered properly.

Category is the platform’s own classification. Filter on it after the run - map searches routinely mix in adjacent categories.

Amenities is parsed out of the profile’s about section into one label per line and joined; it captures feature labels like Wi-Fi or wheelchair access, never review content.

Phone and Website are the public contact fields, cleaned of their accessibility-label prefixes by replace transformations. Both are legitimately empty on many profiles - that absence is itself useful lead-generation signal.

Menu is the menu link where the business publishes one. Mostly relevant for food and drink categories; expect empty elsewhere.

Price_Range is the first bucket of the displayed price histogram, kept verbatim.

Rating and Reviews_Count are the aggregate signals, extracted by regex from the star label and review label - numbers only, review text is never collected.

Address is the published street address, prefix-cleaned. Combine it with Title when merging runs, since this release has no deduplication key.

Plus_Code is the open-location code for the entrance, useful for territories where street addressing is unreliable.

Can a maps detail page scraper build a lead list?

Yes - with one boundary stated plainly. A maps detail page scraper gives you the raw prospect row: who, where, what category, how well rated, and the two contact channels the business chose to publish (phone and website). What this release does not do is enrich: it extracts no email addresses, resolves no social profiles, and validates nothing against third-party databases. The output is a clean starting list, not a finished campaign file, and any outreach from it is your decision and your compliance burden.

How is this different from a business directory scraper?

A business directory scraper works against paginated HTML directories with numbered pages and stable cards. Map results are different animals: they render continuously inside a scrolling pane, the interesting data hides on individual profile pages rather than in the cards, and key fields are wrapped in accessibility labels that need transformation to clean. This bot is built for that shape - unbounded scroll detection, a URL-collection phase, and a per-profile visit loop - which is why it collects fields a card-level scraper never sees.

How does it compare to hosted collection and manual research?

Copy-pasting profiles by hand produces a handful of rows an hour and no consistency at all. Hosted collection services and metered platforms will do the visiting for you, but the structure is the opposite of this bot: they charge per request or per month, the data lands in their cloud under their retention terms, and your search history - your prospects, your territories - lives on their servers. Here the marginal cost of a bigger search is your own time and bandwidth, the datasets stay on your disk, and the workflow configuration is yours to keep, modify and re-run. The trade is real: no dashboards, no built-in scheduling, no history. You get an artifact and a workflow you own outright.

How do you set it up on Windows, macOS and Linux?

Download the launcher for your operating system from this page. On Windows, run the .exe; SmartScreen may ask for confirmation on first launch - verify the published checksum, then “More info” and “Run anyway” proceeds. On macOS, Gatekeeper may quarantine the download; right-click and choose Open, or clear the flag with xattr -d com.apple.quarantine /path/to/LocalBusinessProfileScraper and launch normally. On Linux, the launcher is a shell script: chmod +x ./local-business-profile-scraper then ./local-business-profile-scraper. At first run it prompts for a single field - the search term, such as “dentists in Austin” - and starts the two-phase run. To repeat a search weekly, schedule the launcher with your OS scheduler (Task Scheduler, cron, or launchd) and pass the same term.

What do I check when a run returns zero rows or missing fields?

Work in order. Zero rows from Map_Search_URLs: did the search actually return results in an ordinary browser, or did a consent wall, region lock or challenge greet the fresh session? Did the scroll phase end immediately because the results-pane container no longer matches a redesigned page? Every profile row present but fields empty: the profile-page markup most likely changed - check one profile URL from Map_Search_URLs by hand and see whether the page still shows the fields. A few scattered empty phones or websites: completely normal, not a failure. Fewer results than the map shows interactively: the scroll detection stopped when the pane stopped growing; re-run once before concluding anything. The contract is that failure is loud - empty values and zero rows, never fabricated data.

What are the bot’s limits?

It collects only what a logged-out visitor sees on search cards and profile pages. No review text, no owner responses, no photos, no opening hours in this release. It has no email extraction and no enrichment step. It ships without proxy rotation or CAPTCHA solving enabled - if a challenge stops the run, the run stops; nothing bypasses it. One run covers one search term, unbounded: there is no visit cap, so scope control means narrowing your query. It is a snapshotter, not a monitor - nothing re-runs or alerts on its own. And Business_Details carries no deduplication key, so merging runs is your step, on Title plus Address.

What is responsible lead generation data collection?

A sole trader’s name, phone number and address are personal data in most jurisdictions, so establish your lawful basis under GDPR, UK GDPR or your local equivalent before any outreach to collected contacts; honour opt-outs immediately and permanently; and never use the output for spam. Review the map platform’s terms with open eyes - automated collection may conflict with them, and the decision to run is yours to own. Keep the collection boundary where this bot sets it: aggregate ratings and counts, published contact channels, never review text. Keep request volume at what a patient human could sustain, and let the acceptable-use policy govern every run.

#lead-generation#business-profiles#maps-data#local-seo#business-directory#data-collection

Sample output

The first rows a finished run produces. The Output tab documents every dataset and field.

CategoryTitleAmenitiesPhoneWebsiteMenuPrice_RangeRatingReviews_CountAddressPlus_Code
Coffee shopBlue Door Coffee HouseWi-Fi, outdoor seating, wheelchair accessible+1 555 010 2030https://bluedoorcoffee.example.comhttps://bluedoorcoffee.example.com/menu$$4.51284482 Example Ave, Springfield8FVC2G3M+4X

Related resources

Technical details

Launcher version
1.0.0
Minimum runtime version
1.0.0
Internet required at launch
Yes
Update channel
live
Config encoding
plain

Requirements

  • Minimum launcher runtime version: 1.0.0.
  • Supported operating systems: Windows x86_64, macOS Apple Silicon, macOS Intel, Linux x86_64.
  • On macOS Apple Silicon and macOS Intel and Linux x86_64 the launcher is a shell script: if your system flags it as quarantined or strips the executable bit, grant execute permission with chmod +x BOT_local-business-profile-scraper.sh and approve the launcher in Gatekeeper (macOS security settings) before the first run.
  • First launch requires an internet connection to fetch the bot's configuration by id.

Responsible use

See our acceptable use policy and takedown process.

Commands this bot uses

These are the commands the published configuration actually uses.

The count is how many times each command appears in the published configuration; it is derived from the project, not hand-authored.

Frequently asked questions

How do I scrape business details from map search results?
Run the launcher, type a category and location such as coffee shops in Springfield into the single search prompt, and the bot fills the map search box, scrolls the results pane to the end, collects every listing's profile URL, then visits each one and extracts the eleven Business_Details fields. No selector work is required from you.
What data does the business profile scraper collect?
Eleven fields per profile: Category, Title, Amenities, Phone, Website, Menu, Price_Range, Rating, Reviews_Count, Address and Plus_Code. Everything comes from the publicly rendered profile page - no logged-in views, no review text, no photos.
Why does the bot visit every listing page one by one?
Search-result cards only carry a fraction of the data. Phone numbers, websites, menus, amenities, price ranges and plus codes live on the individual profile pages, so the run collects profile URLs first, then iterates through them with a for_each loop, waiting for each page's heading before extracting. That is also why run time scales with result count.
How long does a full profile run take?
Budget roughly one page visit per listing on top of the scroll phase: a search returning 100 results typically takes 15-30 minutes at human-paced navigation, and large city-wide searches can run an hour or more. Narrow the search term or add a district qualifier to keep runs short.
Does it collect review text?
No, deliberately. The dataset captures the aggregate Rating and Reviews_Count only. Review text is personal data with a much higher compliance bar, and this configuration does not touch it.
Where does the collected business data go?
Rows are stored under the two dataset names from the configuration - Map_Search_URLs for the profile links and Business_Details for the eleven-field records - in the launcher's local results store on your machine. This release sets no fixed export filename, so you export from the results view; nothing is uploaded anywhere except the configuration fetch and download telemetry listed on this page.
Is collecting business profile data allowed?
Automated collection may conflict with the map platform's terms of service, and a sole trader's name, phone and address are personal data in most jurisdictions. You are responsible for reviewing the platform terms and establishing a lawful basis under GDPR, UK GDPR or your local equivalent before running the bot or contacting anyone from the output.
Does the scraper work offline?
No. The search results and profile pages are live web content, so the run needs a network connection throughout. The only other call the launcher makes is the configuration fetch at startup.
Can I limit how many profiles are visited?
This release ships with unbounded scrolling - it collects until the results pane stops growing - and then visits every collected profile. The practical control is your search term: add a neighbourhood, district or narrower category to shrink the result set before the run starts.
How are missing phone numbers or websites handled?
Empty is normal and expected. Not every business publishes a phone number, website or menu, and the transformations fall back to empty values rather than failing the row. Business_Details has no deduplication key in this release, so if a listing appears twice in the results pane it can produce two rows - check Title plus Address when merging.
Does the bot need an internet connection to run?
Yes on first run: the launcher fetches its configuration by id from the backend at launch, so an internet connection is required at least the first time it starts.
Can I rename the downloaded file?
No. The downloaded file must keep its exact name - the filename carries the per-bot configuration id, and renaming it breaks the configuration fetch at launch.