如何使用Google Places API获取一个城市或国家所有地点(或特定类型的地点,如餐厅)?

41

我正在尝试查找一个城市或国家中所有的“餐馆”或“保险机构”。好吧,也许国家范围太广泛了,但主要是大城市。

我正在使用Google Places API和Python,但我发现您只能使用“半径”参数或“rankby=distance”。问题是,根据文档,我认为每个查询只能返回3页中的20个结果,或者60个结果(如果我错了,请纠正我)。所以,如果我想找到例如纽约的所有餐馆,我将不得不从中心开始设置“rankby=distance”,以便它可以在一定半径内给我最接近的60个结果。但是我不知道下一个查询应该是什么......

有什么想法如何处理这个问题吗?

8个回答

36

很遗憾,您无法从Google Places API中获得超过60个结果;至少不会违反服务条款:

除非您已经收到Google(或适用的特定内容提供者)的事先书面授权,否则您不得:(d)以使您或任何其他人可以访问任何内容的大容量下载或批量提要的方式使用产品,包括但不限于数字纬度或经度坐标、图像和可见地图数据

此外,正如您可以在这里阅读到的那样:

这在很大程度上是一个许可问题。但这也是因为Places API的目标不是以你描述的方式促进对Google Places数据的抓取或聚合。任何这样做的应用程序几乎肯定不符合Google Maps或Google Maps API服务条款,并且可能随时被阻止使用API或其他Google服务。Places API旨在允许应用程序为其用户提供一种发现或识别附近地点的方式。用户将浏览并考虑的搜索结果数量存在实际限制。我不认为有必要向用户提供200个结果,我认为这样做只会增加抓取Google Places数据的应用程序的开发,而没有对API旨在服务的应用程序类型增加实质性的好处或效用,我们希望鼓励这些应用程序。

作为进一步的参考,请查看此答案


4

我曾经做过这样一个工具 https://github.com/Pithikos/Geoexplorer。你可以在这里看到它的外观。

如果你有API密钥,我甚至有一个使用Google Places的工作示例可供您使用。

  1. git clone https://github.com/Pithikos/Geoexplorer.git
  2. 在文件 examples/google_radar_search.py 中添加您的API密钥
  3. python3 examples/google_radar_search.py
  4. 在浏览器中打开 GUI/index.html

这将在瑞典的一个大区域内寻找名为“ICA”的杂货店。您可以在config.py中配置要扫描的区域,在google_radar_search.py中配置搜索查询。

这应该可以在Ubuntu 13.10之后的任何版本上正常运行。如果您使用Windows或早期版本,请阅读此处安装依赖项部分)。

您还可以通过使用API添加任何其他服务。请记住,在使用时不要违反Google或任何其他公司的政策。我制作这个工具只是为了测试哪种服务可以给我最好的结果,以便决定使用哪种。


这对于获取某个国家所有类型的企业是否合适?Radar Search不再存在,因此我们只剩下附近搜索。但是,它仅返回最多60个结果,因此如果您为特定半径检索60个结果,则算法需要连续钻取到较小的半径,直到检索到<60个结果。它能做到吗?您还处理重叠圆重复问题吗? - poshest

4
使用雷达搜索。请查看此处的文档。
一次可以获得200个结果,但会占用您配额的5个请求次数。与附近搜索相比,结果的细节较少,但您始终可以使用地点详细信息搜索来获取它们。
希望这能帮到您。
注意:雷达搜索自2018年6月30日起已弃用。在此之后,此功能将不再可用。

2

很不幸,Google 不希望人们能够做到这一点,因此他们设计了 API 来防止人们做出这样的事情。然而,还有其他选择。如果您想要使用 API 访问,Factual 是领先者;他们在 50 个国家拥有 1.02 亿条目。


2
我使用谷歌地图搜索创建了网络爬虫,您可以将其用于此用例。你可以在这里查看该爬虫:这里

1

在URL中使用页面令牌,您可以获取所有结果。

要求:

  • 需要地点API密钥。
  • 安装请求库。

您可以尝试以下代码:

import requests
import json

final_data = []

location='24.4165267,75.833981'
radius='2000'
types='restaurant'
url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=%s&radius=%s&types=%s&key=api key" % (location,radius,types)

while True:

    response = requests.request("POST", URL)
    response = json.loads(response.text)
    results = response['results']

    for result in results:
       final_data.append(data)

    if 'next_page_token' not in response:
        break
    else:
        next_page_token = response['next_page_token']

    next_page_token = '&pagetoken=%s' % str(next_page_token)
    url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=%s&radius=%s&types=%s&key=api key%s" % (location,radius,types,next_page_token)

print(final_data)

0
你可以使用像SerpApi这样的第三方解决方案。它是一个付费API,有免费试用期。我们处理代理,解决验证码,并为您解析所有丰富的结构化数据。
我们提供用于爬取完整Google Places结果和Google Maps结果的API。

0

根据我的理解,我们建议在我的情况下使用跨API引用,我会使用异步WCF调用的嵌套来处理谷歌规定的有限调用区域


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接