🥳加入无抓取社区领取您的免费试用,访问我们强大的网页抓取工具包!
返回博客

如何使用Python抓取谷歌地图?

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

13-Feb-2025

Google Maps数据抓取是指使用自动化工具或脚本从Google Maps中提取信息(例如商家名称、位置和评论)的过程。

在本博文中,我们将讨论抓取Google Maps的好处,并逐步讲解如何使用Python和自动化工具来实现这一点。

抓取Google Maps的好处有哪些?

抓取Google Maps可以提供有价值的商业情报和基于位置的洞察。以下是主要好处:

提取商家信息 – 收集基本信息,例如商家名称、地址、电话号码、网站、评分、评论和营业时间。这些数据可用于潜在客户开发、目录列表和客户拓展。

进行市场分析和竞争对手研究 – 分析市场趋势,确定主要竞争对手,并评估特定位置的商业密度。这有助于企业就扩张、定价策略和客户参与做出明智的决策。

增强地理数据可视化和优化 – 基于真实的商业分布,改进服务覆盖范围、优化送货路线和规划商店位置。公司可以使用这些数据来提高运营效率和客户可及性。

抓取Google Maps的挑战

由于Google Maps严格的反抓取机制,抓取Google Maps面临着巨大的挑战。Google实施速率限制、验证码和API限制以防止自动化数据提取,使得大规模抓取变得困难,如果不遇到封锁几乎不可能。

另一个挑战是Google Maps的动态特性,它依赖于JavaScript加载商家信息。依赖于静态HTML解析的传统抓取方法无效,需要使用无头浏览器或自动化框架与页面交互并提取数据。

为了绕过这些限制,抓取工具必须实现诸如代理轮换和User-Agent欺骗之类的技术。这些方法有助于将请求分散到多个IP地址,并模拟真实用户的行为,从而降低被检测到的可能性,并确保更稳定的抓取过程。

##两种特殊的Google Maps抓取方法

1. Google Maps抓取API

Google是否提供抓取API?
是的。

许多流行的网站,例如Twitter和亚马逊,都提供自己的API,Google也不例外。Google Maps API推出后,迅速受到广泛关注和采用。但是,在使用官方API之前,问问自己:您真的需要使用Google Maps API吗?

为什么使用官方Google Maps API不符合您的需求?

让我们从定价开始。每个用户每月获得200美元的Google Maps API免费配额,其中包括:

  • 高达40,000个地理编码请求
  • 高达100,000个静态地图加载
  • 高达28,000个动态地图加载
  • 高达40,000个路线规划请求

乍一看,这个配额似乎足够了,但在实践中,它可能不够用。与许多其他API一样,一旦超过免费配额,Google Maps API按请求收费,而且价格相对较高。考虑这种情况:使用嵌入式API时,单个地图加载可能会触发多个API调用,例如地址搜索、路线规划或距离计算,从而迅速消耗您的配额。随着业务规模的扩大,API调用次数增加,Google Maps API可能会成为一笔昂贵的开支。

除了定价之外,Google Maps API还对请求有限制。目前,Google强制执行每秒100个请求的速率限制,这意味着在高并发的情况下,访问可能会受到限制,从而影响数据检索效率。

我还能使用API来抓取Google Maps吗?

当然可以!您只需要一个经济实惠、稳定且安全的API服务。但是,找到满足所有这些条件的API非常具有挑战性!幸运的是,Scrapeless Google Maps API在众多API产品中脱颖而出:

🔴 节省成本: 每次API调用只需低至0.80美元,订阅49美元即可享受10%的折扣!

🔴 准确的数据: 我们的开发人员不断分析Google的抓取算法和限制,以确保API得到更新和优化。

🔴 稳定且成功率高: Scrapeless 保证99%的成功率和可靠性。Google趋势抓取的稳定性和准确性已达到近100%!目前,平均响应时间约为3秒**,比大多数API提供商都快得多。此外,数据以标准化的JSON格式返回,可以直接使用。

Scrapeless已经赢得了超过2,000家企业用户的信任!立即加入Discord领取您的免费试用版! 名额有限,仅限1,000个名额——快行动!

进一步阅读:

2. 网页抓取

网页抓取器是网站抓取最常用的方法之一。您可以构建自己的Google Maps抓取工具来提取特定数据。在本文中,我们将使用Python Google Maps抓取器来抓取地图上的特定位置和路线。

继续滚动!

方法1. 使用Google Maps API抓取

步骤1. 获取您的API密钥

首先,您需要从Scrapeless Dashboard获取您的API密钥:

  • 登录到Scrapeless Dashboard
  • 导航到API密钥管理
  • 点击创建以生成您的唯一API密钥。
  • 创建后,只需点击API密钥即可复制它。
获取您的API密钥

步骤2:输入您的API密钥

您现在可以使用您的API密钥将Scrapeless集成到您的项目中。请按照以下步骤测试和实现API:

  • 访问API文档
  • 点击所需端点的“试用”。
  • 在“Auth”字段中输入您的API密钥。
  • 点击“发送”以获取抓取响应。
在代码中使用您的API密钥

以下是您可以直接集成到Google Maps抓取器的示例代码片段。

Python

Python Copy
import http.client
import json

conn = http.client.HTTPSConnection("api.scrapeless.com")
payload = json.dumps({
   "actor": "scraper.google.maps",
   "input": {
      "engine": "google_maps",
      "q": "coffee",
      "type": "search",
      "ll": "@40.7455096,-74.0083012,14z",
      "hl": "en",
      "gl": "us"
   }
})
headers = {
   'Content-Type': 'application/json'
}
conn.request("POST", "/api/v1/scraper/request", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))

JavaScript

JavaScript Copy
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({
   "actor": "scraper.google.maps",
   "input": {
      "engine": "google_maps",
      "q": "coffee",
      "type": "search",
      "ll": "@40.7455096,-74.0083012,14z",
      "hl": "en",
      "gl": "us"
   }
});

var requestOptions = {
   method: 'POST',
   headers: myHeaders,
   body: raw,
   redirect: 'follow'
};

fetch("https://api.scrapeless.com/api/v1/scraper/request", requestOptions)
   .then(response => response.text())
   .then(result => console.log(result))
   .catch(error => console.log('error', error));

方法2. 使用Python构建您的第一个Google Maps抓取器

环境设置

首先,我们需要通过准备以下工具来设置一个网页抓取环境:

  1. Python: 从Python的官方网站下载它。建议安装最新版本的前一两个版本,而不是最新版本。
Python
  1. Python IDE: 任何支持Python的IDE都可以,但我们推荐PyCharm,一个专门的Python开发工具。免费的PyCharm社区版就足够了。
Python IDE

Windows用户的说明:
在安装过程中,请确保选中“将python.exe添加到PATH”选项。这允许您在终端中使用Python命令。由于Python 3.4及更高版本默认包含此选项,因此无需手动设置。

将python.exe添加到PATH

要检查是否安装了Python,请打开终端或命令提示符并运行:

Bash Copy
python --version
  1. 虚拟环境: 建议创建一个虚拟环境来管理依赖项并避免与其他Python项目冲突。在终端中导航到您的项目目录,并执行以下命令以创建一个名为“google_flights_env”的虚拟环境:
Bash Copy
python -m venv google_flights_env

使用适合您操作系统的命令激活虚拟环境:

  • Windows:
Bash Copy
google_flights_env\Scripts\activate
  • macOS/Linux:
Bash Copy
source google_flights_env/bin/activate
  1. 安装所需的库: 激活虚拟环境后,请安装网页抓取所需的Python库:requestsBeautifulSoup4。按照我们的命令安装它们:
Bash Copy
pip install requests
pip install beautifulsoup4
  1. 安装自动化工具: 由于Google Maps不会返回直接HTML页面进行解析,因此需要自动化工具来检索原始HTML。
  • 安装Selenium,一个Python自动化包:
Bash Copy
pip install selenium
  • 您还需要下载浏览器驱动程序。以最常用的Google Chrome为例,在官方网站上找到与浏览器版本匹配的ChromeDriver,下载并安装到本地,然后将其放在PyCharm中的代码目录中。
ChromeDriver

使用Python抓取位置或导航路线数据

抓取位置

步骤1: 打开Google Maps并搜索“coffee”。

抓取位置

步骤2. 从Google Maps搜索结果中抓取特定字段

我们可以使用BeautifulSoup解析HTML并找到包含所需信息的元素。以下是一些示例:

  • 抓取咖啡店名称:
抓取咖啡店名称

提取元素并使用Python抓取文本数据:

Python Copy
def scrape_title(listing):
    maps_element = listing.select_one('div.NrDZNb div.qBF1Pd.fonHeadlineSmall')
    return maps_element.text.strip()
  • 抓取评分:
抓取评分

提取元素并使用Python抓取文本数据。由于评分可能为空,我们添加了空值检查:

Python Copy
def scrape_rating(listing):
    maps_element = listing.select_one('span.MW4etd[aria-hidden="true"]')
    if maps_element is None:
        return None
    else:
        return maps_element.text.strip()
  • 抓取图片链接:
抓取图片链接

提取元素的href属性并使用Python抓取图片链接:

Python Copy
def scrape_image_links(listing):
    maps_image_link = listing.select_one('div.SpFAAb').select_one("img")
    return maps_image_link['src']

以上只是一个部分演示。您可以参考下面的最终代码:

Python Copy
# 导入必要的库
import time

from bs4 import BeautifulSoup
import json
from selenium import webdriver

driver = webdriver.Chrome()

# 从Google Maps抓取列表元素的函数
def scrape_listings(soup):
    return soup.select('div.Nv2PK.THOPZb.CpccDe')

# 从google_maps抓取标题的函数
def scrape_title(listing):
    maps_element = listing.select_one('div.NrDZNb').select_one('div.qBF1Pd.fontHeadlineSmall')
    return maps_element.text.strip()

# 从google_maps抓取评分的函数
def scrape_rating(listing):
    maps_element = listing.select_one('span.MW4etd[aria-hidden="true"]')
    if maps_element is None:
        return None
    else:
        return maps_element.text.strip()

def scrape_image_links(listing):
    maps_image_link = listing.select_one('div.SpFAAb').select_one("img")
    return maps_image_link['src']

# 主函数
def main():
    # 向Google Maps URL发出请求并解析HTML
    url = 'https://www.google.com/maps/search/coffee/@47.4641284,-122.3855982,11z?entry=ttu&g_ep=EgoyMDI1MDIwOS4wIKXMDSoASAFQAw=='
    driver.get(url)
    time.sleep(2)
    page_source = driver.page_source
    soup = BeautifulSoup(page_source, 'html.parser')

    # 抓取地图列表
    listings = scrape_listings(soup)

    # 迭代每个列表并提取地图信息
    maps_data = []
    for listing in listings:
        title = scrape_title(listing)
        rating = scrape_rating(listing)
        image_link = scrape_image_links(listing)

        # 将地图信息存储在字典中
        maps_info = {
            'title': title,
            'rating': rating,
            'image_link': image_link
        }

        maps_data.append(maps_info)

    # 将结果保存到JSON文件
    with open('google_maps_data.json', 'w') as json_file:
        json.dump(maps_data, json_file, indent=4)

if __name__ == "__main__":
    main()

步骤3. 抓取结果并存储数据

一个名为google_maps_data.json的JSON文件将生成在您的PyCharm目录中,其中包含抓取的数据。以下是抓取结果的示例:

JSON Copy
[
    {
        "title": "Lucky Mugs",
        "rating": null,
        "image_link": "https://streetviewpixels-pa.googleapis.com/v1/thumbnail?panoid=36eAZcAEe5VpSUaFnPcOVA&cb_client=search.gws-prod.gps&w=80&h=92&yaw=139.65103&pitch=0&thumbfov=100"
    },
    {
        "title": "Retro Coffee",
        "rating": "4.4",
        "image_link": "https://lh5.googleusercontent.com/p/AF1QipPxJNNq_ddJeY4metdP0-Yv1gfAb8hwqtdjEk3R=w80-h106-k-no"
    },
    {
        "title": "Caffe Migliore.",
        "rating": "4.4",
        "image_link": "https://lh5.googleusercontent.com/p/AF1QipN5LhTxOs7TEicnyDcaeIwp5iOVD46aQ-vMpco=w80-h106-k-no"
    },
    {
        "title": "Local Coffee Spot",
        "rating": "4.2",
        "image_link": "https://lh5.googleusercontent.com/p/AF1QipO9UVq4zJ3G-xw62mFyQEj8jTdlehq7eLlZ4RyL=w163-h92-k-no"
    },
    {
        "title": "BigFoot Java",
        "rating": "4.1",
        "image_link": "https://lh3.googleusercontent.com/gps-proxy/ALd4DhGHbsVNZu27z_GxIxq3jTyZbJI5MUY_rpPTL7yZQX0Mbx4BEbKTwMTz6vJ16y1u1qVA97qxlMtjejRYMjEk7Riqx2dLl1CeDEcGfIWKWmIF5E3qcna_9faDEBRwLvhoiBcJywVx_TZ7jtM1tKUmynpAZdn-vvYju1pEGKDA34jUT38S8qip3Drk=w92-h92-k-no"
    },
    {
        "title": "Caffe Ladro - Downtown on Pine Street",
        "rating": "4.3",
        "image_link": "https://lh5.googleusercontent.com/p/AF1QipO84r3OrCAb6IjtMYbki4pAMpuWf8KoK5_ods89=w92-h92-k-no"
    },
    {
        "title": "Coffee Tree",
        "rating": "4.4",
        "image_link": "https://lh5.googleusercontent.com/p/AF1QipPYbEDGEskTGDCcpBHxF-nQqrFhR2yFi5cBt6Lu=w122-h92-k-no"
    }
]

抓取导航路线

步骤1. 在Google Maps中输入起点和终点。

抓取导航路线

步骤2. 从Google Maps导航路线搜索结果中抓取特定字段。

继续使用BeautifulSoup解析HTML并找到包含所需信息的元素:

  • 抓取“途经”字段:
抓取“途经”字段

提取元素并使用Python抓取文本数据:

Python Copy
def scrape_via(listing):
    maps_element = listing.select_one('h1.VuCHmb.fontHeadlineSmall')
    return maps_element.text.strip()
  • 抓取时间:
抓取时间

提取元素并使用Python抓取文本数据:

Python Copy
def scrape_time(listing):
    maps_element = listing.select_one('div.Fk3sm.fontHeadlineSmall.delay-light')
    return maps_element.text.strip()
  • 抓取距离:
抓取距离
Python Copy
def scrape_distance(listing):
    maps_element = listing.select_one('div.ivN21e.tUEI83.fontBodyMedium').select_one('div')
    return maps_element.text.strip()
  • 这是最终代码:
Python Copy
# 导入必要的库
import time

from bs4 import BeautifulSoup
import json
from selenium import webdriver

driver = webdriver.Chrome()

# 从Google Maps抓取列表元素的函数
def scrape_listings(soup):
    return soup.select('div.UgZKXd')

# 从google_maps抓取途经的函数
def scrape_via(listing):
    maps_element = listing.select_one('h1.VuCHmb.fontHeadlineSmall')
    return maps_element.text.strip()

# 从google_maps抓取时间的函数
def scrape_time(listing):
    maps_element = listing.select_one('div.Fk3sm.fontHeadlineSmall.delay-light')
    return maps_element.text.strip()

# 从google_maps抓取距离的函数
def scrape_distance(listing):
    maps_element = listing.select_one('div.ivN21e.tUEI8e.fontBodyMedium').select_one('div')
    return maps_element.text.strip()

# 主函数
def main():
    # 向google maps URL发出请求并解析HTML
    url = 'https://www.google.com/maps/dir/Austin-Bergstrom+International+Airport/5540+N+Lamar+Blvd,+Austin,+TX+78756/@30.2603068,-97.7871692,12z/data=!3m1!4b1!4m13!4m12!1m5!1m1!1s0x8644b13b8b4aff45:0x1ca7fca8c9dc2768!2m2!1d-97.6710889!2d30.194085!1m5!1m1!1s0x8644cba140fad1fb:0x2db903443245739c!2m2!1d-97.7286733!2d30.3247493?hl=en&entry=ttu&g_ep=EgoyMDI1MDIwOS4wIKXMDSoASAFQAw%3D%3D'
    driver.get(url)
    time.sleep(2)
    page_source = driver.page_source
    soup = BeautifulSoup(page_source, 'html.parser')

    # 抓取地图列表
    listings = scrape_listings(soup)

    # 迭代每个列表并提取地图信息
    maps_data = []
    for listing in listings:
        via = scrape_via(listing)
        time_consuming = scrape_time(listing)
        distance = scrape_distance(listing)

        # 将地图信息存储在字典中
        maps_info = {
            'via': via,
            'time': time_consuming,
            'distance': distance
        }

        maps_data.append(maps_info)

    # 将结果保存到JSON文件
    with open('google_maps_dir_data.json', 'w') as json_file:
        json.dump(maps_data, json_file, indent=4)

if __name__ == "__main__":
    main()

步骤3. 抓取结果并存储数据。

一个名为google_maps_dir_data.json的JSON文件将生成在您的PyCharm目录中,其中包含抓取的数据。以下是抓取结果的示例:

JSON Copy
[
    {
        "via": "via 183 Toll",
        "time": "17 min",
        "distance": "13.4 miles"
    },
    {
        "via": "via State Hwy 71 W and I-35 N",
        "time": "19 min",
        "distance": "15.5 miles"
    },
    {
        "via": "via S Hwy 183 and 183 Toll",
        "time": "17 min",
        "distance": "13.6 miles"
    }
]

总结

现在您已经掌握了像专业人士一样抓取Google Maps的技能!本博客中的两种方法绝对可以节省您的时间和金钱!时间不多?复杂的编码过程让您感到困惑?请使用您的API密钥免费调用我们的Google Maps API以轻松完成数据抓取!

您是API爱好者还是资深的网页抓取者?在我们的社区分享您的经验

在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。

最受欢迎的文章

目录