🎯 Trình duyệt đám mây tùy chỉnh, chống phát hiện được hỗ trợ bởi Chromium tự phát triển, thiết kế dành cho trình thu thập dữ liệu webtác nhân AI. 👉Dùng thử ngay
Quay lại blog

Cách Xây Dựng Một Trình Thu Thập Dữ Liệu Google Maps Với Scrapeless Browserless: Hướng Dẫn Tối Ưu Sẵn Sàng AI Cho Năm 2026

Ethan Brown
Ethan Brown

Advanced Bot Mitigation Engineer

15-Apr-2026

Những điểm chính:

  • Google Maps là một nguồn dữ liệu không thể sánh kịp cho việc tạo dựng khách hàng B2B, SEO địa phương và thông tin thị trường, nhưng các biện pháp phòng thủ của nó rất tinh vi.
  • Trình duyệt Scrapeless Scraping hoạt động như một cơ sở hạ tầng trình duyệt AI mạnh mẽ, cung cấp giải pháp tự động cho CAPTCHA, ngăn chặn phát hiện và proxy dân cư để vượt qua các biện pháp chống bot mạnh mẽ của Google.
  • Tiling geo-grid là kỹ thuật thiết yếu để vượt qua giới hạn tìm kiếm 120 địa điểm vốn có, cho phép trích xuất hàng ngàn danh sách doanh nghiệp độc đáo từ bất kỳ khu vực nào.
  • Nền tảng Scrapeless Scraping Browser cung cấp đầu ra JSON/HTML/Markdown có cấu trúc sẵn sàng cho AI, tích hợp liền mạch vào các quy trình làm việc AI tiên tiến và đường ống dữ liệu.
  • Nắm vững những sắc thái của việc kết xuất động trên Google Maps và triển khai logic thử lại mạnh mẽ là rất quan trọng để xây dựng một giải pháp trình duyệt cạo dữ liệu có thể mở rộng, hoạt động tin cậy ở quy mô sản xuất.

Giới thiệu: Khai thác kho vàng Google Maps trong kỷ nguyên AI

Dựa trên kinh nghiệm thực tiễn phong phú với các trình thu thập dữ liệu web, chúng tôi nhận thấy rằng có một mô hình nhất quán mỗi khi bạn xây dựng một cái từ đầu. Giờ đầu tiên cảm thấy tuyệt vời. Giờ thứ hai bạn gặp phải bức tường đầu tiên. Vào cuối ngày, bạn nhận ra rằng bạn đã viết ba trăm dòng mã chỉ để trích xuất một tiêu đề một cách tin cậy.

Google Maps là bộ dữ liệu thương mại công khai phong phú nhất trên web. Mỗi danh sách có tên, điện thoại, trang web, địa chỉ, loại hình, đánh giá, số lượng đánh giá, giờ mở cửa, GPS, hình ảnh, thuộc tính dịch vụ và một luồng trực tiếp các đánh giá. Và Google không muốn bạn có nó theo số lượng lớn. Places API tính phí theo yêu cầu, giới hạn cố định và bỏ qua các trường mà giao diện web thông thường hiển thị tự do. Vì vậy, bất kỳ ai thực sự cần dữ liệu này ở quy mô lớn cuối cùng cũng phải cạo dữ liệu.

Hướng dẫn này đi qua một trình thu thập dữ liệu TypeScript trong một tệp dựa trên Trình duyệt Scrapeless Scraping mà xử lý các phần thường mất vài tuần: chống phát hiện, proxy dân cư, CAPTCHA, giới hạn 120 địa điểm và cách Google Maps phục vụ một bảng điều khiển đơn giản khi bạn mở một URL địa điểm trực tiếp. Một tệp, một lần chạy, mọi trường.


Bạn có thể làm gì với nó

Dữ liệu Google Maps là một tài sản đa dạng, thúc đẩy các ứng dụng thương mại có tác động lớn từ việc tạo dựng khách hàng đến phân tích AI tiên tiến.

Giá trị từ dữ liệu Google Maps vượt xa danh sách liên hệ đơn giản. Bản chất có cấu trúc và cập nhật theo thời gian thực của nó khiến nó trở thành một nguồn tài nguyên không thể thiếu cho nhiều ứng dụng thương mại khác nhau. Dưới đây là năm cách sử dụng thương mại thực tế, tất cả đều có thể đạt được từ cùng một mã nguồn, thường chỉ với một sự thay đổi trong cấu hình:

  1. Tạo dựng khách hàng B2B. Chạy trình thu thập dữ liệu trên "thợ sửa ống nước" ở Phoenix hoặc "nha sĩ" ở Chicago, đặt maxPlaces: 500 với lưới 3×3, và bạn sẽ có một CSV chứa tên, điện thoại, trang web, địa chỉ, loại hình và đánh giá cho mỗi doanh nghiệp trong khu vực. Chuyển nó vào CRM hoặc công cụ email tiếp cận. Đây là lý do phổ biến nhất mà mọi người cạo dữ liệu Google Maps và cũng là lý do dễ nhất để kiếm được tiền.
  2. Giám sát đánh giá và uy tín. Lên lịch chạy hàng ngày cho doanh nghiệp của bạn cộng thêm ba đến năm đối thủ, lưu trữ JSON với dấu thời gian, và so sánh reviews[] theo publishedAtDate giữa các bản chụp. Đánh giá 1 sao mới trên đối thủ? Thông báo Slack. Đánh giá 5 sao mới của bạn? Đẩy nó lên trang web marketing của bạn. Toàn bộ nội dung đánh giá có trong đầu ra — tác giả, sao, ngày, phản hồi của chủ sở hữu, tất cả đều có.
  3. Bất động sản và trí tuệ vị trí. Xây dựng một khu vực ở bán kính ô 500m, kéo về mọi quán cà phê, phòng gym và cửa hàng tạp hóa, sau đó vẽ mật độ trên bản đồ. Các nhà đầu tư bất động sản sử dụng điều này để so sánh độ bao phủ tiện ích giữa các địa chỉ ứng cử; các chuỗi bán lẻ sử dụng nó để chọn vị trí. Trường location.{lat,lng} trên mỗi địa điểm làm điều này trở thành một nhóm đơn giản.
  4. Theo dõi hạng SEO địa phương. Trình thu thập dữ liệu ghi nhận hạng của mỗi địa điểm theo ô. Xây dựng một thành phố thành các ô 1km, kéo về "thợ sửa ống nước" từ mỗi ô, xem vị trí của doanh nghiệp khách hàng của bạn đứng ở đâu trên lưới. Bản đồ hạng theo ô là bản đồ nhiệt SEO địa phương mà Whitespark và BrightLocal bán như một sản phẩm. Xây dựng nó cho chính bạn chỉ trong năm mươi dòng mã dựa trên đầu ra JSON.
  5. Dữ liệu cho ML và phân tích. Chạy trình thu thập trên bốn mươi truy vấn × hai mươi thành phố và bạn sẽ có một bộ dữ liệu của hàng chục ngàn doanh nghiệp với các thuộc tính có cấu trúc, giờ mở cửa và nội dung đánh giá. Cho reviews[].text vào một bộ phân loại cảm xúc, đào tạo một hệ thống đề xuất trên categories × additionalInfo, hoặc chỉ sử dụng nó như một tập hợp tham chiếu.

Tại sao lại chọn Scrapeless

Chạy trình duyệt không có giao diện trên laptop của bạn hoạt động khoảng mười phút. Sau đó, Google sẽ nhận ra dấu vân tay TLS, đầu ra WebGL, các mẫu thời gian, và bạn sẽ bắt đầu thấy các cổng đồng ý, CAPTCHAs và cảnh báo "lưu lượng bất thường". Bạn có thể chống lại điều này bằng cách sử dụng các plugin ẩn danh trong một thời gian, nhưng đây là một trò chơi thất bại.

Trình duyệt thu thập dữ liệu không có rác là một trình duyệt đám mây thực sự trông giống như trình duyệt thật với Google. Nó đi kèm với:

  • Chống phát hiện dấu vân tay có thể hoạt động tốt dưới tải thực tế
  • Proxy cư trú tại hơn 195 quốc gia
  • Giải CAPTCHAs tự động
  • Ghi lại phiên để gỡ lỗi
  • Điểm cuối WebSocket hỗ trợ các framework dựa trên CDP như Puppeteer và Playwright, vì vậy không cần học SDK

Bạn kết nối với các framework dựa trên CDP mà bạn thường sử dụng, chỉ khác một URL. Mọi thứ khác đều là Puppeteer thông thường.

Nhận khóa API của bạn cho gói miễn phí tại app.scrapeless.com.


Yêu cầu

  • Node 18 hoặc mới hơn.
  • Một khóa Scrapeless (gói miễn phí là đủ).
  • Một chút quen thuộc với Puppeteer sẽ hữu ích nhưng không bắt buộc.
  • Không có Chrome cục bộ. Trình duyệt chạy trên đám mây.

Cài đặt

bash Copy
mkdir google-maps-pro && cd google-maps-pro
npm init -y
npm install puppeteer-core dotenv
npm install -D tsx typescript @types/node

Và một tệp .env:

env Copy
SCRAPELESS_API_KEY=your_key_here

Bước 1 — Kết nối

Mỗi phiên đều mở ra theo cách giống nhau. Tạo một URL WSS với mã thông báo, quốc gia và TTL của bạn, rồi đưa nó cho puppeteer.connect.

typescript Copy
import "dotenv/config";
import puppeteer from "puppeteer-core";

function connectionURL(sessionName: string, proxyCountry = "US", sessionTTL = 600) {
  const qs = new URLSearchParams({
    token: process.env.SCRAPELESS_API_KEY!,
    proxyCountry,
    sessionTTL: String(sessionTTL),
    sessionName,
  });
  return `wss://browser.scrapeless.com/api/v2/browser?${qs.toString()}`;
}

async function openBrowser(sessionName: string) {
  return puppeteer.connect({
    browserWSEndpoint: connectionURL(sessionName),
    defaultViewport: null,
  });
}

Đó là toàn bộ những gì đặc trưng cho Scrapeless. Mọi thứ sau đây đều là Puppeteer thuần túy. Mẫu trong repo truyền những tùy chọn này dưới dạng một đối tượng cfg duy nhất thay vì các tham số định vị — cùng một hiệu ứng, chỉ gọn gàng hơn khi bạn có một tá tùy chỉnh.


Bước 2 — Giới hạn 120 địa điểm

Mở Google Maps trong trình duyệt và tìm kiếm "nhà hàng ở New York". Cuộn lâu tùy thích. Bạn sẽ không bao giờ thấy hơn khoảng 120 kết quả. UI chỉ ngừng cung cấp nhiều hơn.

Đây là điều đáng thất vọng nhất khi thu thập dữ liệu từ Google Maps, và nhiều dự án lần đầu chỉ lặng lẽ chấp nhận điều đó. Bạn không thể cuộn qua nó. Bạn không thể phân trang vượt qua nó. Giới hạn đã được tích hợp vào giao diện.

Giải pháp thay thế là tầng lưới địa lý. Chia khu vực mục tiêu thành một lưới các ô nhỏ hơn, thực hiện một tìm kiếm cho mỗi ô với tọa độ tâm khác nhau, gộp kết quả và loại bỏ trùng lặp theo placeId. Một lưới 2×2 trên trung tâm Austin biến một tìm kiếm thành bốn và đem tới khoảng 400 địa điểm duy nhất thay vì 120. Một lưới 3×3 dễ dàng đạt hơn một ngàn.

Toán lưới rất đơn giản:

typescript Copy
function kmPerDegLng(lat: number) { return 111.32 * Math.cos((lat * Math.PI) / 180); }
function kmPerDegLat() { return 111.32; }

function buildGrid(centerLat: number, centerLng: number, cellRadiusKm: number, maxCells: number) {
  const side = Math.max(1, Math.floor(Math.sqrt(maxCells)));
  const cells: { lat: number; lng: number }[] = [];
  const stepLat = (cellRadiusKm * 2) / kmPerDegLat();
  const stepLng = (cellRadiusKm * 2) / kmPerDegLng(centerLat);
  const offset = (side - 1) / 2;
  for (let i = 0; i < side; i++) {
    for (let j = 0; j < side; j++) {
      cells.push({
        lat: centerLat + (i - offset) * stepLat,
        lng: centerLng + (j - offset) * stepLng,
      });
      if (cells.length >= maxCells) return cells;
    }
  }
  return cells;
}

function searchUrlForCell(query: string, lat: number, lng: number) {
  const q = encodeURIComponent(query).replace(/%20/g, "+");
  return `https://www.google.com/maps/search/${q}/@${lat.toFixed(6)},${lng.toFixed(6)},15z`;
}

Mảnh @lat,lng,15z trong URL là phần tái trung tâm bản đồ cho mỗi tìm kiếm. 15z là mức độ phóng đại. Tăng nó lên cho các ô nhỏ hơn, giảm nó cho những ô rộng hơn.


Bước 3 — Thu thập dữ liệu từ nguồn kết quả

Đối với mỗi URL ô, cuộn thanh bên kết quả cho đến khi nó không còn tải thêm thẻ mới, sau đó lấy mọi liên kết a.hfpxzc.

typescript Copy
async function collectSearchResults(page: Page, searchUrl: string, target: number) {
  await page.goto(searchUrl, { waitUntil: "domcontentloaded", timeout: 60000 });
  await page.waitForSelector('div[role="feed"], h1.DUwDvf', { timeout: 25000 });

  let last = 0, stable = 0;
  for (let i = 0; i < 40; i++) {
    const n = await page.$$eval(".Nv2PK", (els) => els.length);
    if (n >= target) break;

nếu (n === last) { stable++; nếu (stable >= 3) break; } else stable = 0;
last = n;
await page.evaluate(() => {
const feed = document.querySelector('div[role="feed"]');
nếu (feed) (feed as HTMLElement).scrollTop = (feed as HTMLElement).scrollHeight;
});
await new Promise(r => setTimeout(r, 1500));
}

return page.$$eval(".Nv2PK a.hfpxzc", (links) =>
links.map((el, idx) => ({
name: el.getAttribute("aria-label") || "",
url: (el as HTMLAnchorElement).href,
rank: idx + 1,
})),
);
}

Mẫu đếm ổn định (ba lần cuộn không có kết quả mới có nghĩa là dòng tin đã hoàn tất) vượt trội hơn so với thời gian ngủ cố định. Chờ lâu hơn không giúp gì nếu dòng tin thực sự ngừng tải.

placeId được nhúng trong mỗi URL, sau !1s0x...:0x.... Đó là khóa dedupe trên các ô.


Bước 4 — Điều Kỳ Lạ Trong Việc Hiển Thị Google Maps

Điều này đã khiến tôi tốn phần lớn thời gian trong một ngày để tìm ra.

Nếu bạn điều hướng trực tiếp đến một URL địa điểm như https://www.google.com/maps/place/Haraz+Coffee+House/..., Google Maps sẽ hiển thị một phiên bản giản lược của bảng điều khiển. Tiêu đề h1 có đó. Đánh giá có đó. Nhưng số lượng đánh giá, bảng giờ mở cửa, thuộc tính dịch vụ, hình ảnh — một nửa trong số đó hoặc là bị thiếu hoặc có nội dung văn bản trống. Toàn bộ DOM cho trang vào khoảng ba nghìn ký tự.

Nếu bạn điều hướng đến các kết quả tìm kiếm thay vào đó, và nhấp vào cùng một thẻ địa điểm, bạn sẽ nhận được bảng điều khiển đầy đủ phong phú. Cùng URL, nhưng hiển thị hoàn toàn khác.

Cách giải quyết là: luôn đi qua URL tìm kiếm, nhấp vào thẻ địa điểm bạn muốn và chờ cho bảng điều khiển xuất hiện.

typescript Copy
const clicked = await page.evaluate((placeName) => {
  const cards = document.querySelectorAll(".Nv2PK a.hfpxzc");
  cho từng c của Array.from(cards) {
    nếu (c.getAttribute("aria-label") === placeName) {
      (c as HTMLElement).click();
      return true;
    }
  }
  return false;
}, hit.name);

await page.waitForSelector("h1.DUwDvf", { timeout: 15000 });

Một kiểm tra nhanh sau khi bộ chọn xuất hiện: kiểm tra h1 để có nội dung văn bản không trống trước khi tiếp tục. Đôi khi phần tử xuất hiện trước khi Google thực sự đã điền vào nó.


Bước 5 — Lấy Tổng Quan

Khi bạn đã ở trên một bảng điều khiển phong phú thực sự, một page.evaluate sẽ có được hầu hết các trường cơ bản.

typescript Copy
const overview = await page.evaluate(() => {
  const $ = (s: string) => document.querySelector(s) as HTMLElement | null;
  const txt = (s: string) => $(s)?.textContent?.trim() || null;

  return {
    title: txt("h1.DUwDvf"),
    totalScore: parseFloat(txt('div.F7nice span[aria-hidden="true"]') || "") || null,
    categoryName: txt("button.DkEaL"),
    address: txt('button[data-item-id="address"] .Io6YTe'),
    phone: txt('button[data-item-id*="phone"] .Io6YTe'),
    website: txt('a[data-item-id="authority"] .Io6YTe'),
    plusCode: txt('button[data-item-id="oloc"] .Io6YTe'),
  };
});

Lat, lng, và hash placeId tất cả nằm trong URL, không phải trong DOM:

typescript Copy
const at = page.url().match(/@(-?\d+\.\d+),(-?\d+\.\d+)/);
const location = at ? { lat: parseFloat(at[1]), lng: parseFloat(at[2]) } : null;
const placeId = page.url().match(/!1s(0x[0-9a-f]+:0x[0-9a-f]+)/i)?.[1] ?? null;

Một thông báo về các tên lớp. DUwDvf, F7nice, Io6YTe, tất cả đều được tự động tạo bởi bản xây dựng của Google và chúng thường thay đổi. Kiểm tra đầu ra của bạn với một địa điểm đã biết mỗi tuần hoặc hai tuần và chuẩn bị cập nhật các bộ chọn khi điều gì đó trở về null.


Bước 6 — Đánh Giá, Hình Ảnh, Thực Đơn, Hỏi & Đáp, Giới Thiệu

Bảng điều khiển địa điểm có các tab. Bạn nhấp vào mỗi tab, chờ, cuộn, trích xuất. Thứ tự quan trọng ở đây, điều này không rõ ràng cho đến khi bạn gặp phải vấn đề một lần.

Làm Giới Thiệu / thuộc tính trước. Nội dung Giới Thiệu nằm bên trong bảng điều khiển Tổng Quan. Nếu bạn nhấp vào Đánh Giá hoặc Hình Ảnh trước khi kéo thuộc tính, các nút đó sẽ bị gỡ bỏ và bạn sẽ mất chúng.

Đánh giá. Nhấp vào tab, chọn thứ tự sắp xếp nếu bạn quan tâm (mới nhất, cao nhất, thấp nhất hoặc liên quan), sau đó cuộn bảng cho đến khi bạn có đủ thẻ được tải. Mỗi thẻ có tên tác giả, văn bản, sao, ngày tương đối, ảnh của nhà đánh giá, và đôi khi là câu trả lời từ chủ sở hữu.

typescript Copy
const reviews = await page.evaluate((max) => {
  const cards = Array.from(document.querySelectorAll(".Nv2PK"));
  return cards.slice(0, max).map((c) => ({
    name: c.querySelector(".d4r55")?.textContent?.trim() || null,
    text: c.querySelector(".wiI7pd")?.textContent?.trim() || null,
    publishedAtDate: c.querySelector(".rsqaWe")?.textContent?.trim() || null,
    stars: (() => {
      const m = (c.querySelector(".kvMYJc")?.getAttribute("aria-label") || "").match(/(\d)/);
      return m ? parseInt(m[1], 10) : null;
    })(),
    responseFromOwnerText: c.querySelector(".CDe7pd .wiI7pd")?.textContent?.trim() || null,
  }));
}, 30);

Một điều cần chú ý: các nội dung đánh giá dài hơn sẽ bị cắt ngắn với nút "Thêm". Nhấp vào tất cả trước khi trích xuất hoặc bạn sẽ kết thúc với những đánh giá không đầy đủ.
Ảnh: Cuộn qua thư viện, sau đó lấy từng URL hình nền CSS. URL kết thúc bằng một cái gì đó như =w150-h150 cho hình thu nhỏ; thay đổi nó thành =w1600-h1600 cho kích thước đầy đủ. Cùng một URL, hậu tố kích thước khác nhau.
Thực đơn, Câu hỏi & Trả lời: Mỗi cái là một lần nhấp vào tab với bộ chọn riêng. Không phải mọi địa điểm đều có những cái này. Các quán cà phê, chẳng hạn, thường không hiển thị thực đơn trên Google Maps.


Bước 7 — Tạo Nó Hoạt Động Quy Mô

Đây là phần phân biệt giữa kịch bản hoạt động kiểu hoạt động và một kịch bản mà bạn có thể để chạy qua đêm.

Google Maps không ổn định. Tình trạng SPA trở nên lạ lùng sau các lần nhấp tab. Một lần nhấp đôi khi thành công nhưng tab không bao giờ được điền. Luồng dữ liệu đôi khi tải mà không có kết quả nào vì lý do không rõ ràng và việc tải lại sẽ khắc phục điều đó. Nếu bạn nhấp qua một hoặc hai địa điểm bằng tay, đây là những thiếu sót nhỏ, nhưng ở bất kỳ khối lượng thực tế nào, chúng tích lũy nhanh chóng.

Hai điều xử lý vấn đề này:

  1. Trình duyệt mới cho mỗi địa điểm. Sau khi bạn đã thu thập các kết quả tìm kiếm, hãy mở một phiên Trình duyệt Scraping mới cho mỗi địa điểm. Sử dụng lại một phiên cho các địa điểm khác nghe có vẻ là một tối ưu hóa hiển nhiên, nhưng trạng thái bảng điều khiển từ địa điểm N bị rò rỉ sang địa điểm N+1 theo những cách thực sự khó để gỡ lỗi. Phiên mới mỗi lần, và vấn đề sẽ tự biến mất.
  2. Thử lại tối đa ba lần. Hầu hết mọi lỗi đều mang tính tạm thời.
typescript Copy
for (let attempt = 1; attempt <= 3; attempt++) {
  const eb = await openBrowser(`gmp-enrich-${attempt}`);
  const ep = await eb.newPage();
  try {
    await ep.goto(searchUrl, { waitUntil: "domcontentloaded", timeout: 60000 });
    await ep.waitForSelector('div[role="feed"]', { timeout: 20000 });
    const place = await enrichPlaceOnSearchPage(ep, hit, cfg);
    if (place.title) return place;
  } finally {
    await ep.close();
    await eb.close();
  }
  await new Promise(r => setTimeout(r, 2000));
}

Trong các lần chạy thử nghiệm tôi đã thực hiện khi xây dựng điều này — các quán cà phê ở Austin, nhà hàng ở Manhattan, nha sĩ ở Chicago — tỷ lệ thành công theo địa điểm nằm trong khoảng 75–100%. Các lỗi hầu như luôn là Google không hiển thị bảng điều khiển sau khi nhấp vào thẻ, và vòng lặp thử lại bắt hầu hết trong số chúng.


Những gì bạn nhận lại

Một đối tượng JSON phẳng cho mỗi địa điểm. Nó cố ý rộng để bạn không phải chạy lại bộ thu thập thông tin lần thứ hai để lấy một phần khác — tạo khách hàng tiềm năng, đánh giá, thuộc tính, tất cả trong một tải trọng.

Dưới đây là một kết quả thực tế từ một lần chạy gần đây trên Haraz Coffee House ở Austin:

json Copy
{
  "title": "Haraz Coffee House",
  "placeId": "0x8644b52f8462f95f:0xa572bbcb1887b9bb",
  "cid": "11921797644567427515",
  "url": "https://www.google.com/maps/place/Haraz+Coffee+House/...",
  "rank": 2,
  "address": "500 W Martin Luther King Jr Blvd Suite A, Austin, TX 78701",
  "plusCode": "77J4+WJ Austin, Texas",
  "location": { "lat": 30.2823385, "lng": -97.7434096 },
  "phone": "(512) 243-5667",
  "phoneUnformatted": "5122435667",
  "website": "harazcoffeehouse.com",
  "domain": "harazcoffeehouse.com",
  "categoryName": "Quán cà phê",
  "categories": ["Quán cà phê"],
  "totalScore": 4.7,
  "reviewsCount": 47239,
  "openingHours": [
    { "day": "Thứ Hai", "hours": "7 AM–10 PM" },
    { "day": "Thứ Ba", "hours": "7 AM–10 PM" },
    "... 5 ngày nữa"
  ],
  "additionalInfo": {
    "Lựa chọn dịch vụ": [
      { "name": "Ngồi lại", "value": true },
      { "name": "Mang đi", "value": true }
    ],
    "Tiện ích": [
      { "name": "Lối vào cho xe lăn", "value": true }
    ],
    "Điểm nổi bật": [{ "name": "Cà phê ngon", "value": true }],
    "... 10 phần nữa": {}
  },
  "images": [
    "https://lh3.googleusercontent.com/.../=w1600-h1600",
    "... 4 URL nữa"
  ],
  "reviews": [
    {
      "name": "Maria T",
      "text": "Latte ngon nhất ở Austin, không nghi ngờ gì...",
      "publishedAtDate": "14 giờ trước",
      "stars": 5,
      "reviewerPhotoUrl": "https://lh3.googleusercontent.com/...",
      "responseFromOwnerText": "Cảm ơn Maria!"
    },
    "... 9 đánh giá nữa"
  ],
  "menu": [],
  "questionsAndAnswers": [],
  "popularTimesLiveText": null,
  "scrapedAt": "2026-04-13T13:23:18.450Z"
}

Những gì bạn sẽ nhận được — Mỗi lần chạy trả về JSON có cấu trúc với các trường này: title, placeId, cid, address, plusCode, location.{lat,lng}, phone, phoneUnformatted, website, domain, categoryName, categories, price, totalScore, reviewsCount, openingHours[], additionalInfo{}, images[], reviews[], questionsAndAnswers[], menu[], popularTimesLiveText, plus status flags. Mảng trống / null cho các trường mà Google không hiển thị cho loại địa điểm đó.


Kết luận: Cung cấp Dữ liệu Thế giới Thực cho Các tác nhân AI của Bạn

Thông thạo việc thu thập thông tin trên Google Maps với Scrapeless Scraping Browser là con đường quyết định để xây dựng các tác nhân AI tự động thực sự hiểu và tương tác với thế giới vật lý.
Hành trình trích xuất dữ liệu quý giá từ Google Maps đầy rẫy thách thức kỹ thuật, từ giới hạn 120 địa điểm đến các biện pháp phòng chống bot tinh vi. Tuy nhiên, bằng cách tận dụng các khả năng tiên tiến của Scrapeless Scraping Browser—cơ sở hạ tầng trình duyệt AI đặc biệt của bạn—bạn có thể biến những trở ngại này thành cơ hội. Hướng dẫn này đã trang bị cho bạn một giải pháp mạnh mẽ, sẵn sàng cho AI, kết hợp giữa gạch địa lý, trích xuất dữ liệu thông minh và các thực hành tốt nhất có chất lượng sản xuất.

Dù mục tiêu của bạn là tạo ra các khách hàng tiềm năng B2B chất lượng cao, theo dõi hiệu suất SEO địa phương, thực hiện nghiên cứu thị trường sâu sắc, hay cung cấp cho các tác nhân AI của bạn những thông tin có cấu trúc theo thời gian thực về thế giới vật chất, Scrapeless cung cấp nền tảng đáng tin cậy mà bạn cần. Ngừng chiến đấu với các biện pháp chống bot và bắt đầu tập trung vào những gì thực sự quan trọng: những hiểu biết rút ra từ dữ liệu của bạn.

Sẵn sàng để xây dựng đường dẫn dữ liệu được hỗ trợ bởi AI của bạn?

Tham gia vào cộng đồng sôi động của chúng tôi để nhận gói miễn phí và kết nối với những người đổi mới khác:


Câu hỏi thường gặp

Q: Tôi có cần một proxy để trích xuất từ Google Map không?
A: Có. Nếu không có, bạn sẽ bắt đầu bị giới hạn hạn chế tốc độ trong một vài yêu cầu, và từ đó sẽ là lỗi 429 và các tường đồng ý. Scrapeless Scraping Browser có sẵn các proxy dân cư, vì vậy không có gì tách biệt để tích hợp. Mỗi phiên bạn mở đều thông qua một IP dân cư khác ở quốc gia bạn chọn.

Q: Tôi thực sự có thể trích xuất bao nhiêu địa điểm?
A: Điều đó phụ thuộc vào thành phố. Một lưới 2×2 của các ô 2 km trên một khu trung tâm Mỹ cỡ vừa sẽ cho bạn 200–400 địa điểm độc đáo sau khi loại bỏ trùng lặp. Nếu đẩy lên 3×3 hoặc 4×4 trong các thành phố đông dân, bạn có thể thoải mái đạt tới hàng nghìn.

Q: Điều gì xảy ra khi Google thay đổi tên lớp?
A: Điều này xảy ra mỗi vài tháng. Công cụ trích xuất sử dụng nhiều chọn lọc dự phòng cho mỗi trường, vì vậy thông thường chỉ có một trường bị hỏng tại một thời điểm trong khi phần còn lại vẫn hoạt động. Hãy theo dõi nhật ký của bạn, cập nhật các bộ chọn khi có thứ gì đó trở thành null, và gửi đi.

Q: Tại sao lại sử dụng Scrapeless Scraping Browser thay vì một trình duyệt headless cục bộ?
A: Scrapeless Scraping Browser cung cấp khả năng chống phát hiện cấp doanh nghiệp, giải quyết CAPTCHA tự động và proxy dân cư tích hợp—các tính năng rất khó khăn và tốn kém để triển khai và duy trì với thiết lập trình duyệt headless cục bộ. Nó cung cấp một cơ sở hạ tầng trình duyệt AI thực sự, cho phép bạn tập trung vào logic trích xuất dữ liệu thay vì chống lại các biện pháp chống bot.

Q: Còn reviewsCount thì sao?
A: Công cụ trích xuất đọc reviewsCount từ khối F7nice trên tab Tổng quan — số trong dấu ngoặc nằm ngay sau xếp hạng ("4.7 (1,234)"). Khi Google hiển thị số lượng, nó là chính xác. Đối với bất kỳ địa điểm nào mà công cụ trích xuất thành công lấy được thẻ đánh giá, reviews.length cũng là một số lượng đáng tin cậy.

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục