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

Senior Web Scraping Engineer
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密钥即可复制它。

步骤2:输入您的API密钥
您现在可以使用您的API密钥将Scrapeless集成到您的项目中。请按照以下步骤测试和实现API:
- 访问API文档。
- 点击所需端点的“试用”。
- 在“Auth”字段中输入您的API密钥。
- 点击“发送”以获取抓取响应。

以下是您可以直接集成到Google Maps抓取器的示例代码片段。
Python
Python
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
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抓取器
环境设置
首先,我们需要通过准备以下工具来设置一个网页抓取环境:
Python
: 从Python的官方网站下载它。建议安装最新版本的前一两个版本,而不是最新版本。

Python IDE
: 任何支持Python的IDE都可以,但我们推荐PyCharm,一个专门的Python开发工具。免费的PyCharm社区版就足够了。

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

要检查是否安装了Python,请打开终端或命令提示符并运行:
Bash
python --version
- 虚拟环境: 建议创建一个虚拟环境来管理依赖项并避免与其他Python项目冲突。在终端中导航到您的项目目录,并执行以下命令以创建一个名为“google_flights_env”的虚拟环境:
Bash
python -m venv google_flights_env
使用适合您操作系统的命令激活虚拟环境:
- Windows:
Bash
google_flights_env\Scripts\activate
- macOS/Linux:
Bash
source google_flights_env/bin/activate
- 安装所需的库: 激活虚拟环境后,请安装网页抓取所需的Python库:
requests
和BeautifulSoup4
。按照我们的命令安装它们:
Bash
pip install requests
pip install beautifulsoup4
- 安装自动化工具: 由于Google Maps不会返回直接HTML页面进行解析,因此需要自动化工具来检索原始HTML。
- 安装Selenium,一个Python自动化包:
Bash
pip install selenium
- 您还需要下载浏览器驱动程序。以最常用的Google Chrome为例,在官方网站上找到与浏览器版本匹配的ChromeDriver,下载并安装到本地,然后将其放在PyCharm中的代码目录中。

使用Python抓取位置或导航路线数据
抓取位置
步骤1: 打开Google Maps并搜索“coffee”。

步骤2. 从Google Maps搜索结果中抓取特定字段。
我们可以使用BeautifulSoup解析HTML并找到包含所需信息的元素。以下是一些示例:
- 抓取咖啡店名称:

提取元素并使用Python抓取文本数据:
Python
def scrape_title(listing):
maps_element = listing.select_one('div.NrDZNb div.qBF1Pd.fonHeadlineSmall')
return maps_element.text.strip()
- 抓取评分:

提取元素并使用Python抓取文本数据。由于评分可能为空,我们添加了空值检查:
Python
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
def scrape_image_links(listing):
maps_image_link = listing.select_one('div.SpFAAb').select_one("img")
return maps_image_link['src']
以上只是一个部分演示。您可以参考下面的最终代码:
Python
# 导入必要的库
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
[
{
"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
def scrape_via(listing):
maps_element = listing.select_one('h1.VuCHmb.fontHeadlineSmall')
return maps_element.text.strip()
- 抓取时间:

提取元素并使用Python抓取文本数据:
Python
def scrape_time(listing):
maps_element = listing.select_one('div.Fk3sm.fontHeadlineSmall.delay-light')
return maps_element.text.strip()
- 抓取距离:

Python
def scrape_distance(listing):
maps_element = listing.select_one('div.ivN21e.tUEI83.fontBodyMedium').select_one('div')
return maps_element.text.strip()
- 这是最终代码:
Python
# 导入必要的库
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
[
{
"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,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。