谷歌/Google
谷歌地图公交查询 Python 爬取 Google Map POI
2024-02-23 10:01

谷歌地图公交查询 Python 爬取 Google Map POI

Google Map 的 API文档:

这里使用的其中的 Place Search 接口。需要先注册谷歌地图的开发者平台获取 key。

原理上是按照一定的格点来请求周围的POI。每次请求会返回大约十几个POI点信息谷歌地图公交查询 Python 爬取 Google Map POI,类似于一种采样谷歌地图公交查询,如果在POI比较密集的地区谷歌地图公交查询产品目录,格网比较大会漏过许多POI。

下面这段代码爬取的是曼谷城区的部分POI

# 从谷歌API获取POI
import urllib.request 
from urllib.parse import quote 
import string
import json
import codecs
import numpy
# 参数
lonRange = [100.30, 100.60]  # the range of longitude 经度的范围 
latRange = [13.50, 14]  # the range of latitude 纬度的范围  
lonDivision = 0.005 # 分块查询,每格约0.4km
latDivision = 0.005 # 分块查询,每格约0.4km
radius = 500 # 查询参数 半径 500m
TIMEOUT = 30
outfile = "output.csv"
#   Google Key
googleKey = "在这里填你自己的key"
#restaurant_j = json_format(res_test)
print('开始爬取')
print('共有'+str(((lonRange[1]-lonRange[0])/lonDivision+1)*((latRange[1]-latRange[0])/latDivision+1))+'次请求')
count = 0
countLine = 0
place_id_list = []
csvFile=codecs.open(outfile,'a','utf-8')
csvFile.write('lat,lon,types\n')
for lon in numpy.arange(lonRange[0], lonRange[1], lonDivision):
    print('已进行'+str(count)+'次请求,得到'+str(countLine)+'条有效信息')
    for lat in numpy.arange(latRange[0], latRange[1], latDivision):
        print('已进行'+str(count)+'次请求,得到'+str(countLine)+'条有效信息')
        #   发请求
        latlon = str(lat)+','+str(lon)
        basic_url = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json?key={0}&location={1}&radius={2}'  
        url = basic_url.format(googleKey,latlon,radius)
        url = quote(url, safe = string.printable)
        req = urllib.request.urlopen(url,timeout=TIMEOUT)
        response = req.read().decode('utf-8')
        responseJSON = json.loads(response)
        for item in responseJSON['results']:
            #对每个POI
            place_id = item['place_id']
            types = item['types']
            #如果id不在已有的list里
            if not place_id in place_id_list:
                #如果类型中有point_of_interest
                if "point_of_interest" in types:
                    place_id_list.append(place_id)
                    line = str(item['geometry']['location']['lat']) + ',' + str(item['geometry']['location']['lng'])
                    for type in types:
                        line = line + ',' + str(type)
                    csvFile.write(line + '\n')
                    countLine = countLine + 1
        count = count + 1
csvFile.close()
print('结束')

爬取结果使用 ArcGIS Pro 可视化如下:

【本文来源于互联网转载,如侵犯您的权益或不适传播,请邮件通知我们删除】

发表评论
0评