返回博客
指南
Andrei OgiolanLast updated on Mar 31, 20261 min read

如何抓取谷歌地图的地点搜索结果

如何抓取谷歌地图的地点搜索结果

简介

谷歌地图是全球使用最广泛的地图和导航服务之一,为用户提供了一种便捷的方式来查找和探索地点、商家及兴趣点。谷歌地图的一项关键功能是能够搜索地点并查看其详细信息,例如位置、评论、照片等。

从 Google 地图抓取这些数据可用于多种用途。例如,企业可以利用这些数据来追踪和分析其各门店的运营表现,研究人员可以利用它来研究消费者行为模式,而个人则可以利用它来发现和探索新地点。

本文旨在提供一份分步指南,介绍如何使用 Node.js 配合我们的 API 抓取 Google 地图的地点搜索结果。我们将涵盖从搭建开发环境到提取相关数据的全部内容,并说明可能遇到的问题。读完本文后,您将掌握独立抓取 Google 地图地点搜索结果所需的知识和工具。

为何应使用专业爬虫工具而非自行开发?

出于以下几个原因,使用专业爬虫往往比自行开发更优。首先,专业爬虫专为处理各类爬取任务而设计,在性能、可靠性和可扩展性方面经过优化。它们能够处理海量数据,并兼容各类网站及网络技术。这意味着专业爬虫通常比自建爬虫能更快、更准确地提取数据。

此外,专业爬虫通常内置了验证码破解、IP轮换和错误处理等功能,这些功能能提高爬取效率并减少出错概率。它们还提供技术支持和详细文档,当您遇到问题时会非常有用。

另一个重要方面是,专业爬虫服务商严格遵守目标网站的爬取政策,并确保数据的使用合法合规,这一点在进行数据抓取时必须牢记。

最后,就我们具体的情况而言,若要抓取 Google 地图的地点结果,您需要像这样向 Google URL 传递一个数据参数:

https://www.google.com/maps/place/Waldo+Pizza/@43.821489,-43.4299553,3z/data=!4m5!3m4!1s0x87c0ef253b04093f:0xafdfd6dc1d3a2b4e!8m2!3d38.9930011!4d-94.5936805

data 参数通常看起来像这样:!4m5!3m4!1s + data_id + !8m2!3 + 纬度 + !4d + 经度。我知道这乍一看可能让人望而生畏,因为你可能不知道如何获取特定地点的 data_id 属性,而你的担忧是正确的——因为谷歌隐藏了这一信息,当你在谷歌地图中搜索地点时,页面上并不会显示该信息。 但幸运的是,使用像我们这样的专业爬虫工具可以帮你解决这个问题,自动为你获取这些数据。在后续章节中,我们将详细讲解如何获取 data_id 和坐标,以及如何轻松构建数据参数。

定义目标

什么是 Google 地图地点搜索结果?

Google 地图地点结果是指用户在 Google 地图上搜索地点时显示的结果。这些结果可能包含商家、餐厅、酒店、地标及其他兴趣点等各类地点。每个地点结果都包含名称、地址、电话号码、网站、评论和照片等信息。地点结果还包含该位置的 Google 地图街景图像,以及显示该地点位置的地图。 地点结果还可能包含指向该地点 Google 我的商家页面的链接。

当用户在 Google 地图上搜索地点时,系统会展示与搜索查询相匹配的地点结果列表。这些结果以地图和列表形式呈现,并可根据评分、价格和距离等多种条件进行筛选。

抓取这些数据对于希望追踪和分析门店表现的企业、希望研究消费者行为模式的研究人员,以及希望发现和探索新场所的个人而言都十分有用。

我们的目标是什么?

准备工作

在开始抓取 Google 地图地点结果之前,我们需要确保已备齐必要的工具。首先需要的是 Node.js,这是一个允许我们在服务器端运行 JavaScript 的运行时环境,您可从其官方网站进行安装。其次需要一个 API 密钥,您只需在此处创建账户并激活 SERP 服务即可轻松获取。

完成上述配置后,要运行 Node.js 脚本,只需创建一个 js 文件即可。可通过执行以下命令实现:

$ touch scraper.js

现在将以下代码行粘贴到文件中:

console.log("Hello World!")

然后运行以下命令:

$ node scraper.js

若此时终端显示“Hello World!”字样,即表示您已成功安装 Node.js,并可继续进行最后一步。

现在最后一步是获取您感兴趣地点的 data_id 信息。此时我们的 API 便派上用场了。使用它非常简单,且无需安装任何外部库。

首先,在 JavaScript 文件中,您需要导入 Node.js 的 `https` 内置模块,以便向我们的 API 发送请求。具体操作如下:

​​const https = require("https");

其次,您需要指定 API 密钥、搜索词以及您感兴趣地点的坐标:

const API_KEY = "<YOUR-API-KEY-HERE>" // You can get by creating an account - https://app.webscrapingapi.com/register

const query = "Waldo%20Pizza"

const coords = "@38.99313451901278,-94.59368586441806"

接下来,您需要将这些信息封装在 options 对象中,以便我们的 API 能识别出您需要抓取信息的具体地点:

const options = {

  "method": "GET",

  "hostname": "serpapi.webscrapingapi.com",

  "port": null,

  "path": `/v1?engine=google_maps&api_key=${API_KEY}&type=search&q=${query}&ll=${coords}`,

  "headers": {}

};

接下来,您需要使用所有这些信息设置对 API 的调用:

const req = https.request(options, function (res) {

 const chunks = [];

 res.on("data", function (chunk) {

   chunks.push(chunk);

 });

 res.on("end", function () {

   const body = Buffer.concat(chunks);

   const response = JSON.parse(body.toString());

   const data_id = response.place_results.data_id;

   if (data_id) {

       console.log(data_id);

   }

   else {

       console.log('We could not find a data_id property for your query. Please try using another query')

   }

 });

});

req.end();

最后,只需运行您编写的脚本并等待结果:

​​$ node scraper.js

此时屏幕上应显示 data_id 属性:

$ ​​0x87c0ef253b04093f:0xafdfd6dc1d3a2b4es

就这样,至此您已具备创建 data 参数所需的一切条件,可以继续阅读下一节,该节将阐述本文的核心内容。

开始抓取 Google 地点结果

现在环境已配置完毕,您可以开始使用 Node.js 抓取 Google 地图的地点结果了。如上所述,要抓取 Google 地图的地点结果,您需要先设置 data 参数。既然所有内容都已准备就绪,您可以通过以下方式实现:

const data_id = "0x87c0ef253b04093f:0xafdfd6dc1d3a2b4e" // the data_id we retrieved earlier

const latitude = '38.99313451901278'

const longitude = '-94.59368586441806'

const data = '!4m5!3m4!1s' + data_id + '!8m2!3d' + latitude  + '!4d' + longitude

接下来,您需要修改 options 对象,告知 API 您要获取的是地点结果。有了这个新的 data 参数,API 就能准确知道您需要抓取哪个地点的信息:

const options = {

  "method": "GET",

  "hostname": "serpapi.webscrapingapi.com",

  "port": null,

  "path": `/v1?engine=google_maps&api_key=${API_KEY}&type=place&data=${data}`, // this time the type is place and there is no query needed

  "headers": {}

};

生成的脚本应如下所示:

const https = require("https");

const API_KEY = "<YOUR-API-KEY-HERE>" // You can get by creating an account - https://app.webscrapingapi.com/register

const data_id = "0x87c0ef253b04093f:0xafdfd6dc1d3a2b4e" // the data_id we retrieved earlier

const latitude = '38.99313451901278'

const longitude = '-94.59368586441806'

const data = '!4m5!3m4!1s' + data_id + '!8m2!3d' + latitude  + '!4d' + longitude

const options = {

  "method": "GET",

  "hostname": "serpapi.webscrapingapi.com",

  "port": null,

  "path": `/v1?engine=google_maps&api_key=${API_KEY}&type=place&data=${data}`, // this time the type is place and there is no query needed

  "headers": {}

};

const req = https.request(options, function (res) {

  const chunks = [];

  res.on("data", function (chunk) {

    chunks.push(chunk);

  });

  res.on("end", function () {

    const body = Buffer.concat(chunks);

    const response = JSON.parse(body.toString());

    console.log(response)

  });

});

req.end();

运行此脚本后,您将收到如下响应:

place_results: {

    title: 'Waldo Pizza',

    data_id: '0x89c259a61c75684f:0x79d31adb123348d2',

    place_id: 'ChIJT2h1HKZZwokR0kgzEtsa03k',

    data_cid: '8778389626880739538',

    website: 'https://www.stumptowntogo.com/',

    gps_coordinates: { latitude: 38.99313451901278, longitude: -94.59368586 },

    reviews_link: 'https://serpapi.webscrapingapi.com/v1?engine=google_maps_reviews&data_id=0x89c259a61c75684f:0x79d31adb123348d2',

    place_id_search: 'https://serpapi.webscrapingapi.com/v1?engine=google_maps&type=place&device=desktop&data=!4m5!3m4!1s0x89c259a61c75684f:0x79d31adb123348d2!8m2!3d38.99313451901278!4d-94.59368586',

    thumbnail: 'https://lh5.googleusercontent.com/p/AF1QipNtnPBJ2Oi_C2YNamHTXyqU9I8mRBarCIvM5g5v=w408-h272-k-no',

    rating: 4.6,

    reviews: 2594,

    price: '$$',

    type: [ 'Pizza restaurant' ],

    service_options: { dine_in: true, curbsidepickup: true, no_contactdelivery: true },

    extensions: [

      [Object], [Object],

      [Object], [Object],

      [Object], [Object],

      [Object], [Object],

      [Object], [Object]

    ],

    open_state: 'Closed',

    hours: [

      [Object], [Object],

      [Object], [Object],

      [Object], [Object],

      [Object]

    ],

    contact_details: {

      address: [Object],

      action_1: [Object],

      menu: [Object],

      phone: [Object],

      plus_code: [Object]

    },

    address: '7433 Broadway St, Kansas City, MO 64114',

    images: [

      [Object], [Object],

      [Object], [Object],

      [Object], [Object],

      [Object], [Object],

      [Object], [Object],

      [Object], [Object]

    ],

    people_also_search_for: [ [Object], [Object], [Object] ],

    user_reviews: { summaries: [Array], most_relevant: [Array] },

    popular_times: { graph_results: [Object] }

  }

}

就这样。这意味着您已成功使用我们的 API 抓取了 Google 地图地点结果,现在可以将获取的数据用于多种不同用途,例如数据分析、商业分析、机器学习等。如需进一步参考以及其他 6 种编程语言的代码示例以助您入门,欢迎查阅我们的 Google 地图文档

Google 地图地点结果的限制

尽管 Google 地图地点结果是查找和探索地点的强大工具,但您仍需注意其存在一些限制。首先,每个地点可获取的数据量有限,且部分数据(如照片、地点 ID 等)仅可通过 Google 地图 API 获取,并需要 API 密钥。此外,Google 地图地点结果中提供的数据可能是动态的,会随时间变化,这意味着您抓取的数据可能不够准确或不够及时。

结论

总而言之,抓取 Google 地图地点结果对于企业、研究人员及个人而言,是发现和探索新地点的有用工具。通过遵循本文概述的步骤,您现在应该已经掌握了使用 Node.js 通过我们的 API 抓取 Google 地图地点结果所需的知识和工具。

关于作者
Andrei Ogiolan, 全栈开发工程师 @ WebScrapingAPI
Andrei Ogiolan全栈开发工程师

安德烈·奥吉奥兰(Andrei Ogiolan)是 WebScrapingAPI 的全栈开发工程师,他在产品各领域均有贡献,并协助为该平台构建可靠的工具和功能。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网络数据。