如何使用Google Map Feed API用Python获取我的Google地图列表?

2 投票
2 回答
2246 浏览
提问于 2025-04-17 00:34

我想用Python写个脚本,下载我在Google地图上创建的所有地图的当前KML文件。

如果手动操作,我可以使用这个:

http://maps.google.com.br/maps/ms?msid=USER_ID.MAP_ID&msa=0&output=kml

这里的USER_ID是Google用来识别我的一个固定数字,而MAP_ID是每个地图的唯一标识符,可以通过右上角的link图标找到。

不过,这个过程不是很简单,因为我需要手动浏览Google地图上的“我的地点”页面,一个一个地获取链接。

根据Google地图API的HTTP协议参考

地图源是用户创建的地图的集合。

这个源的完整GET URI是:

http://maps.google.com/maps/feeds/maps/default/full

这个源会返回经过认证用户的所有地图列表。

** 页面上说这个服务已经不再提供了,所以我想知道现在有没有其他方法可以做到同样的事情。

所以,我的问题是:有没有办法获取/下载我所有地图的MAP_ID列表,最好是用Python来实现?

谢谢阅读

2 个回答

0

我找到了一种简单粗暴的方法,可以完全绕过谷歌地图的API,虽然这种方法可能在不久的将来会失效,具体方法如下:

# coding: utf-8

import urllib, re
from BeautifulSoup import BeautifulSoup as bs

uid = '200931058040775970557'
start = 0
shown = 1

while True:
    url = 'http://maps.google.com/maps/user?uid='+uid+'&ptab=2&start='+str(start)
    source = urllib.urlopen(url).read()
    soup = bs(source)
    maptables = soup.findAll(id=re.compile('^map[0-9]+$'))
    for table in maptables:
        for line in table.findAll('a', 'maptitle'):
            mapid = re.search(uid+'\.([^"]*)', str(line)).group(1)
            mapname = re.search('>(.*)</a>', str(line)).group(1).strip()[:-2]
            print shown, mapid, mapname
            shown += 1

            # uncomment if you want to download the KML files:
            # urllib.urlretrieve('http://maps.google.com.br/maps/ms?msid=' + uid + '.' + str(mapid) +
                               '&msa=0&output=kml', mapname + '.kml')                

    if '<span>Next</span>' in str(source):
        start += 5
    else:
        break

当然,这个方法只是打印出一个编号列表,但从这里开始,你可以保存一个字典,或者通过在网址后加上 &output=kml 的小技巧来自动下载KML文件,这样就很自然了。

1

这个问题的正确答案是使用谷歌地图数据接口,虽然这个接口已经不再推荐使用,但它仍然能以更官方的方式满足我的需求,至少比解析网页要更靠谱。下面是具体的代码:

# coding: utf-8

import urllib2, urllib, re, getpass

username = 'heltonbiker'
senha = getpass.getpass('Senha do usuário ' + username + ':')

dic = {
        'accountType':      'GOOGLE',
        'Email':            (username + '@gmail.com'),
        'Passwd':           senha,
        'service':          'local',
        'source':           'helton-mapper-1'
        }
url = 'https://www.google.com/accounts/ClientLogin?' + urllib.urlencode(dic)
output = urllib2.urlopen(url).read()
authid = output.strip().split('\n')[-1].split('=')[-1]

request = urllib2.Request('http://maps.google.com/maps/feeds/maps/default/full')
request.add_header('Authorization', 'GoogleLogin auth=%s' % authid)
source = urllib2.urlopen(request).read()

for link in re.findall('<link rel=.alternate. type=.text/html. href=((.)[^\1]*?)>', source):
    s = link[0]
    if 'msa=0' in s:
        print s

我得出这个解决方案是因为在Stack Overflow上看到很多其他问题,很多人给了我很大的帮助,所以我希望这段代码能帮助到将来有类似需求的人。

撰写回答