← All free tools
Free tool

Free Bing Maps scraper

Export the businesses from a Bing Maps search to CSV or Google Sheets: name, category, rating, phone, website, full address and opening hours. One bookmark, no sign-up, no install.

1. Add the bookmark

🧭 ScrapePass - Bing Maps LeadsDrag me up to your bookmarks bar ↑

Drag this button to your bookmarks bar

Don’t see a bookmarks bar? Press Ctrl+Shift+B (on a Mac, ⌘+Shift+B). Can’t drag? Create a new bookmark, name it “🧭 ScrapePass - Bing Maps Leads” and paste this code as its URL:

Version 1.0.0. Already have the bookmark? The panel shows its version next to “by ScrapePass”. If it is older, drag the button again to get this one.

2. Use it on Bing Maps

  1. 1Open Bing Maps and search for a kind of business in a place, for example dentist in Chicago.
  2. 2When the list of places shows on the left, click 🧭 ScrapePass - Bing Maps Leads in your bookmarks bar.
  3. 3A small panel opens and asks Ready? Press Go. A purple highlight moves down the list as it reads each place. For more places, move the map and press Search this area, or search again, then press Add more.
  4. 4Press Download CSV to save the file, any time you have enough. It opens in Excel and Google Sheets.

What you get

One row per place, with these columns. The examples are made up.

ColumnWhat it holdsExample
nameThe business name.Lone Star Plumbing Co.
categoryThe main category shown on Bing Maps.Plumbing
ratingAverage star rating on the review site Bing Maps shows for the place.4.5
reviewsNumber of reviews on that site.214
rating_sourceThe review site the rating comes from, such as Yelp or Tripadvisor.Yelp
phonePhone number.(512) 555-0142
websiteThe business website.https://lonestarplumbing.example
addressFull street address.1500 Congress Ave, Austin, TX 78701
open_status, hoursOpening status and hours at the time you ran it.Open, Open 24 hours
latitude, longitudeWhere the place is on the map.30.2747, -97.7404
bing_urlLink that opens the place on Bing Maps.https://www.bing.com/maps?ss=ypid.YN…

Questions

Is it really free?

Yes. No account, no limit on how often you use it, and nothing to install. It is a bookmark that runs a small script on the Bing Maps page you have open.

Is my data sent anywhere?

No. The script reads the list in your own browser and builds the CSV there. Nothing is sent to ScrapePass or anyone else. You can read the full source code below.

How many places can I get?

Bing Maps shows about 15 to 25 places per search. For more, move the map and press Bing’s Search this area, or search again (another neighborhood or town), then press Add more in the panel. The new places join the same list, places you already have are skipped, and one Download CSV saves them all.

Why do the ratings say Yelp or Tripadvisor?

Bing Maps shows ratings from review sites rather than its own. The CSV keeps the rating, the number of reviews and the site they come from. For every review of a place, with the full text, use the free Google Maps reviews scraper.

Does it get emails?

No. Bing Maps does not show emails. The CSV has each business’s website, so you can find contact details there.

Bing Maps or Google Maps?

Both list the same kinds of businesses, often with different results. Google Maps shows far more places per search: try the free Google Maps scraper for long lists. Bing Maps gives every place its phone, website and full address in the list.

Which browsers does it work in?

Desktop browsers with a bookmarks bar, such as Chrome, Edge and Brave. Phones and tablets make bookmarks like this hard to run, so use a computer.

What if it stops working?

Bing Maps changes its page from time to time, which can stop the bookmark finding places or fill some columns wrongly. Press Report a problem in the panel, or contact us, with the search you ran and a screenshot of the panel. Once it is fixed, drag the new bookmark from this page to your bookmarks bar again.

Only collect data you have the right to use, and follow Microsoft’s terms for Bing Maps and the privacy and marketing laws where you work.

See the source code

This is everything the bookmark runs. It works only on the Bing Maps page you have open and sends nothing anywhere. The project is also on GitHub.

(function () {
  var KEY = '__scrapepassBingLeads';
  var VERSION = '1.0.0';
  if (window[KEY]) window[KEY].close();

  var CARDS = '.b_maglistcard[data-entity]';
  var onBing = /(^|\.)bing\.com$/.test(location.hostname) && location.pathname.indexOf('/maps') === 0;
  if (!onBing || !document.querySelector(CARDS)) {
    alert('Open Bing Maps and search for a kind of business, for example "dentist in Chicago". When the list of places shows on the left, click this bookmark again.');
    return;
  }

  var HOME = 'https://scrapepass.com/';
  var UTM = '?utm_source=bookmarklet&utm_medium=tool&utm_campaign=bing-maps-leads';
  var GITHUB = 'https://github.com/ScrapePass/bing-maps-scraper-one-click';
  var YOUTUBE = 'https://www.youtube.com/@scrapepass';
  var COLS = ['name', 'category', 'rating', 'reviews', 'rating_source', 'phone', 'website', 'address', 'open_status', 'hours', 'latitude', 'longitude', 'bing_url'];

  var rows = [];
  var seen = {};
  var queue = [];
  var current = null;
  var lightTimer = 0;
  var added = 0;
  var running = false;

  function el(tag, css, text) {
    var e = document.createElement(tag);
    if (css) e.style.cssText = css;
    if (text != null) e.textContent = text;
    return e;
  }

  function hoursLine(card) {
    var lines = card.innerText.split('\n');
    for (var i = 0; i < lines.length; i++) {
      if (/^(Open|Closed|Closes|Opens)/i.test(lines[i].trim())) {
        return lines[i].split('·').map(function (s) { return s.trim(); }).filter(function (s) {
          return s && !/^\+?[\d\s().-]{7,}$/.test(s);
        }).join(' · ');
      }
    }
    return '';
  }
  function readCard(card) {
    var data;
    try { data = JSON.parse(card.getAttribute('data-entity')); } catch (err) { return null; }
    var e = data && data.entity;
    if (!e || !e.id || !e.title) return null;
    var id = String(e.id).replace(/^ypid:/, '');
    var at = data.routablePoint || {};
    var g = data.geometry || {};
    var hours = hoursLine(card);
    return {
      key: id,
      name: e.title,
      category: e.primaryCategoryName || '',
      rating: e.ratingValue != null ? String(e.ratingValue) : '',
      reviews: e.ratingCount ? String(e.ratingCount).replace(/\D/g, '') : '',
      rating_source: e.ratingSourceName || '',
      phone: e.phone || '',
      website: e.website || '',
      address: e.address || '',
      open_status: e.openStatus || '',
      hours: e.openHoursText || hours.replace(/^(Open|Closed)( · )?/, ''),
      latitude: at.latitude != null ? String(at.latitude) : (g.y != null ? String(g.y) : ''),
      longitude: at.longitude != null ? String(at.longitude) : (g.x != null ? String(g.x) : ''),
      bing_url: 'https://www.bing.com/maps?ss=ypid.' + id
    };
  }

  var marked = [];
  function paint(card) {
    card.style.outline = '2px solid #4f46e5';
    card.style.outlineOffset = '-2px';
    card.style.background = 'rgba(79,70,229,.12)';
    marked.push(card);
  }
  function plain(card) {
    card.style.outline = '';
    card.style.outlineOffset = '';
    card.style.background = '';
  }
  function unmark() {
    marked.forEach(plain);
    marked = [];
  }

  function collect() {
    var cards = document.querySelectorAll(CARDS);
    var n = 0;
    for (var i = 0; i < cards.length; i++) {
      var r = readCard(cards[i]);
      if (!r || seen[r.key]) continue;
      seen[r.key] = true;
      queue.push({ card: cards[i], row: r });
      n++;
    }
    return n;
  }

  var q = /[?&]q=([^&]*)/.exec(location.search);
  var words = q ? decodeURIComponent(q[1].replace(/\+/g, ' ')).replace(/[\\/:*?"<>|\s]+/g, ' ').trim().slice(0, 60) : '';
  var file = 'ScrapePass Bing Maps Leads' + (words ? ' - ' + words : '') + '.csv';

  function cell(v) {
    v = String(v == null ? '' : v);
    if (/^[=@\t\r]/.test(v) || /^[+-]/.test(v) && /[^\d\s().+-]/.test(v)) v = "'" + v;
    return /[",\r\n]/.test(v) ? '"' + v.replace(/"/g, '""') + '"' : v;
  }
  function table() {
    return [COLS.join(',')].concat(rows.map(function (r) {
      return COLS.map(function (c) { return cell(r[c]); }).join(',');
    })).join('\r\n');
  }

  function svg(tag, attrs, parent) {
    var e = document.createElementNS('http://www.w3.org/2000/svg', tag);
    for (var k in attrs) e.setAttribute(k, attrs[k]);
    if (parent) parent.appendChild(e);
    return e;
  }
  function logo(size) {
    var root = svg('svg', { viewBox: '0 0 128 128', width: size, height: size, 'aria-hidden': 'true' });
    var grad = svg('linearGradient', { id: 'scrapepass-bing-leads-logo', x1: 0, y1: 0, x2: 1, y2: 1 }, svg('defs', {}, root));
    svg('stop', { offset: 0, 'stop-color': '#7c3aed' }, grad);
    svg('stop', { offset: 1, 'stop-color': '#4f46e5' }, grad);
    svg('rect', { width: 128, height: 128, rx: 28, fill: 'url(#scrapepass-bing-leads-logo)' }, root);
    svg('rect', { x: 20, y: 26, width: 70, height: 18, rx: 9, fill: '#fff' }, root);
    svg('rect', { x: 20, y: 55, width: 70, height: 18, rx: 9, fill: '#fff' }, root);
    svg('rect', { x: 20, y: 84, width: 46, height: 18, rx: 9, fill: '#fff' }, root);
    svg('path', { d: 'M70 66 112 92l-17 4 9.5 18.5-10 4.8-9.5-18.5-13 12z', fill: '#fde68a', stroke: '#4c1d95', 'stroke-width': 5, 'stroke-linejoin': 'round' }, root);
    root.style.cssText = 'flex:none;display:block;';
    return root;
  }

  var GITHUB_LOGO = 'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12';
  var YOUTUBE_LOGO = 'M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z';
  function brandIcon(d, color) {
    var root = svg('svg', { viewBox: '0 0 24 24', width: 14, height: 14, 'aria-hidden': 'true' });
    svg('path', { d: d, fill: color }, root);
    root.style.cssText = 'display:inline-block;vertical-align:-2px;margin-right:4px;';
    return root;
  }

  var PURPLE = '#4f46e5';
  function link(label, href, css, icon) {
    var a = el('a', 'color:' + PURPLE + ';font-weight:600;white-space:nowrap;' + (css || ''));
    if (icon) a.appendChild(icon);
    a.appendChild(document.createTextNode(label));
    a.href = href;
    a.target = '_blank';
    a.rel = 'noopener';
    return a;
  }
  var box = el('div', 'position:fixed;top:88px;right:16px;z-index:2147483647;width:340px;background:#fff;color:#1f2328;border-radius:14px;box-shadow:0 8px 32px rgba(0,0,0,.25);font:15px/1.45 "Segoe UI",Roboto,Arial,sans-serif;padding:18px;text-align:left;');
  var head = el('div', 'display:flex;align-items:center;gap:10px;margin-bottom:12px;');
  head.appendChild(logo(36));
  var titles = el('div', 'flex:1;min-width:0;');
  titles.appendChild(el('div', 'font-size:18px;font-weight:700;line-height:1.2;', 'Bing Maps Leads'));
  var by = el('div', 'font-size:13px;color:#57606a;', 'by ');
  by.appendChild(link('ScrapePass', HOME + UTM, 'text-decoration:none;'));
  by.appendChild(document.createTextNode(' · v' + VERSION));
  titles.appendChild(by);
  head.appendChild(titles);
  var x = el('button', 'border:0;background:none;font-size:24px;line-height:1;cursor:pointer;color:#57606a;padding:0 4px;align-self:flex-start;', '×');
  x.title = 'Close';
  head.appendChild(x);
  var dial = el('div', 'position:relative;width:128px;height:128px;margin:4px auto 10px;');
  var ring = el('div', 'position:absolute;inset:0;box-sizing:border-box;border-radius:50%;border:8px solid rgba(79,70,229,.15);');
  var spin = null;
  var middle = el('div', 'position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;');
  var ready = el('div', 'font-size:26px;font-weight:700;color:' + PURPLE + ';', 'Ready?');
  var count = el('div', 'display:none;font-size:38px;font-weight:700;line-height:1;', '0');
  var unit = el('div', 'display:none;font-size:13px;color:#57606a;margin-top:4px;', 'leads');
  middle.appendChild(ready);
  middle.appendChild(count);
  middle.appendChild(unit);
  dial.appendChild(ring);
  dial.appendChild(middle);
  var place = el('div', 'height:20px;margin-bottom:2px;font-size:14px;font-weight:600;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;');
  var status = el('div', 'font-size:15px;color:#57606a;text-align:center;margin-bottom:14px;', 'Press Go to collect the places in this list.');
  var BTN = 'display:block;width:100%;border:1px solid ' + PURPLE + ';background:' + PURPLE + ';color:#fff;border-radius:8px;padding:11px 12px;font:600 15px "Segoe UI",Roboto,Arial,sans-serif;cursor:pointer;';
  var go = el('button', BTN, 'Go');
  var csv = el('button', BTN + 'display:none;margin-top:8px;', 'Download CSV');
  var buttons = el('div');
  buttons.appendChild(go);
  buttons.appendChild(csv);
  var foot = el('div', 'margin-top:14px;padding-top:12px;border-top:1px solid #eaeef2;font-size:13px;color:#57606a;');
  foot.appendChild(document.createTextNode('Need more data? '));
  foot.appendChild(link('Try the ScrapePass extension, the free web scraper', HOME + UTM));
  var help = el('div', 'margin-top:8px;');
  help.appendChild(document.createTextNode('Something not working? '));
  help.appendChild(link('Report a problem', HOME + 'contact' + UTM + '&utm_content=v' + VERSION));
  foot.appendChild(help);
  var more = el('div', 'margin-top:8px;');
  more.appendChild(link('How to use', HOME + 'tools/bing-maps-scraper' + UTM));
  more.appendChild(document.createTextNode(' · '));
  more.appendChild(link('More free tools', HOME + 'free-tools' + UTM));
  foot.appendChild(more);
  var social = el('div', 'margin-top:8px;');
  social.appendChild(link('GitHub', GITHUB, '', brandIcon(GITHUB_LOGO, '#1f2328')));
  social.appendChild(document.createTextNode(' · '));
  social.appendChild(link('Tutorials on YouTube', YOUTUBE, '', brandIcon(YOUTUBE_LOGO, '#FF0000')));
  foot.appendChild(social);
  [head, dial, place, status, buttons, foot].forEach(function (n) { box.appendChild(n); });
  document.body.appendChild(box);

  function light() {
    var next = queue.shift();
    if (!next) return finish();
    if (current) plain(current);
    paint(next.card);
    current = next.card;
    next.card.scrollIntoView({ block: 'nearest' });
    rows.push(next.row);
    added++;
    place.textContent = next.row.name;
    count.textContent = String(rows.length);
    lightTimer = setTimeout(light, 150);
  }
  function finish() {
    running = false;
    if (current) plain(current);
    current = null;
    place.textContent = '';
    if (spin) spin.cancel();
    ring.style.borderColor = PURPLE;
    var how = 'Move the map and press “Search this area”, or search again, then press Add more.';
    status.textContent = added
      ? 'Got ' + added + ' place' + (added === 1 ? '' : 's') + '. Bing Maps shows about 15 to 25 per search. ' + how
      : 'No new places in this list. ' + how;
    go.textContent = 'Add more';
    go.style.background = '#fff';
    go.style.color = PURPLE;
    go.style.display = 'block';
  }

  function close() {
    running = false;
    clearTimeout(lightTimer);
    unmark();
    box.remove();
    delete window[KEY];
  }

  x.onclick = close;
  go.onclick = function () {
    if (running) return;
    running = true;
    added = 0;
    unmark();
    go.style.display = 'none';
    csv.style.display = 'block';
    ready.style.display = 'none';
    count.style.display = 'block';
    unit.style.display = 'block';
    ring.style.borderColor = 'rgba(79,70,229,.15)';
    ring.style.borderTopColor = PURPLE;
    if (ring.animate) spin = ring.animate([{ transform: 'rotate(0deg)' }, { transform: 'rotate(360deg)' }], { duration: 1000, iterations: Infinity });
    status.textContent = 'Reading the list…';
    collect();
    light();
  };
  csv.onclick = function () {
    var blob = new Blob([String.fromCharCode(0xfeff) + table()], { type: 'text/csv;charset=utf-8' });
    var a = el('a');
    a.href = URL.createObjectURL(blob);
    a.download = file;
    document.body.appendChild(a);
    a.click();
    a.remove();
    setTimeout(function () { URL.revokeObjectURL(a.href); }, 5000);
  };
  window[KEY] = { close: close };
})();

Scrape any site, not only Bing Maps

ScrapePass turns any web page into clean data, with prebuilt templates for AliExpress, Craigslist, Agoda, G2 and 26 more. Start free, with no account needed. Need larger runs? Sign up and verify your email to get 5 free days.

Add to Chrome