python高德 查询县_Python获取高德地图省市区县列表
项目中需要用省市区来进行检索,原想高德地图肯定会有API来获得这些数据,结果没有找到,有一个接口好像可以用,但是会附带大量的边界坐标点。
所以就不如自己把高德的省市区列表扒下来,自己写接口来完成这个功能。
看到高德地图的js的demo里面有这样的展示页面:http://lbs.amap.com/api/javascript-api/example/u/2001-2/,所以我就直接利用它来分析。
1. 省列表
省的列表是直接写死在这个界面里的,所以我也照搬,把省都直接写死:
provinceList = ['北京市', '天津市', '河北省', '山西省', '内蒙古自治区', '辽宁省', '吉林省','黑龙江省', '上海市', '江苏省', '浙江省', '安徽省', '福建省', '江西省', '山东省','河南省', '湖北省', '湖南省', '广东省', '广西壮族自治区', '海南省', '重庆市','四川省', '贵州省', '云南省', '西藏自治区', '陕西省', '甘肃省', '青海省', '宁夏回族自治区', '新疆维吾尔自治区', '台灣', '香港特别行>政区', '澳门特别行政区']
2. 市列表
从市列表开始,就要扒高德地图的接口了,首先模仿浏览器的访问设置几个Http头:
send_headers = {
'Accept':'*/*',
'Accept-Encoding':'gzip, deflate, sdch',
'Accept-Language':'zh-CN,zh;q=0.8',
'Connection':'keep-alive',
'Host':'restapi.amap.com',
'Referer':'http://lbs.amap.com/fn/iframe/?id=3556',
}
然后是根据省名获取市列表的函数:
def getCity(province):
print "Province->" + province
url = "http://restapi.amap.com/v3/config/district?subdistrict=1&extensions=all&level=province&key=608d75903d29ad471362f8c58c550daf&s=rsv3&output=json&callback=jsonp_" + getJsonP() + "_&keywords=" + province;
data = getData(url)
item = data['districts'][0];
if item['citycode'] == []:
item['citycode'] = ''
save([item['citycode'], item['adcode'], item['name'], item['center'], item['level'], ''])
for item in data['districts'][0]['districts']:
save([item['citycode'], item['adcode'], item['name'], item['center'], item['level'], ''])
while 1:
try:
getDistrict(item)
break
except Exception, e:
print 'retry:' + item['name'] + "->" + str(e)
这里有跨域访问用的getJsonP、发起网络请求的getData、存数据库的save,这三个函数的具体实现一会再说,先看其它逻辑,高德服务端返回数据是长得这个样子的:
districts域就是搜索的结果,因为这是按名称进行搜索,而不是id,所以很可能会搜出来多个结果,当然省名不会重,但一样得到的是一个JSONArray,所以用data['districts'][0]来得到省的信息,除了直辖市之外,省级单位的citycode都是空的,用item['citycode'] = ''给它一个空字符串做默认值,然后调用save方法把它存入数据库,在上图中也看到了,data['districts'][0]里面还有一个districts域,这里面就是所有市的信息,同样把它们存入数据库,然后针对每个市,去获取区的列表,这里有可能会出现网络问题,所以加上了失败重试。
下面依次来看上面几个关键方法的实现:
1)getJsonP:
跨域访问是通过jsonp回调的方式进行的,函数名都是jsonp_xxxxx_()的形式,这个xxxxx是一个变化的随机数字,我采用依次递增的形式来生成这个jsonp的数字:
jsonp = 9999
def getJsonP():
global jsonp
jsonp = jsonp + 1
if (jsonp > 99999):
jsonp = 10000
return str(jsonp)
这里我保证这个数字是一个5位数(理论上几位都可以),因为在图里可以看到,返回值是jsonp_xxxxx_({aaa})的形式,我们要分析json串需要把前后没用的字符去掉,如果长度固定就很好删了。
2)getData:
发起网络请求并把返回的数据转成JSONObject:
def getDataWithEx(url):
req = urllib2.Request(url,headers=send_headers)
r = urllib2.urlopen(req,timeout=30)
if r.info().get('Content-Encoding') == 'gzip':
buf = StringIO(r.read())
f = gzip.GzipFile(fileobj=buf)
data = f.read()
else:
data = r.read()
return json.loads(data[13:-1])
def getData(url):
while 1:
try:
response = getDataWithEx(url)
break
except Exception, e:
print 'retry:' + url + " with error " + str(e)
return response
这里也加入了失败重试,一般的数据都要用gzip进行解码,但是我忘了是哪个了,好像是有一个区的数据很特别没有用gzip,所以这里要分开判断,getJsonP里面介绍了,返回的数据前后是写无用的字符,用data[13:-1]删掉。
3)save
这是往MySQL里存数据的函数,没有特殊的点需要介绍,直接上代码:
def save(value):
try:
conn=MySQLdb.connect(host='www.xxx.com',user='xxx',passwd='xxx',port=3306,charset="utf8")
conn.select_db('test')
cur=conn.cursor()
cur.execute("insert into amap(citycode, adcode, name, center, level, areacode) values(%s,%s,%s,%s,%s,%s)",value)
conn.commit()
cur.close()
conn.close()
except MySQLdb.Error,e:
print "Mysql Error %d: %s" % (e.args[0], e.args[1])
3. 区列表
跟获取城市列表相似:
def getDistrict(city):
print "->City->" + city['name']
url = "http://restapi.amap.com/v3/config/district?subdistrict=1&extensions=all&level=city&key=608d75903d29ad471362f8c58c550daf&s=rsv3&output=json&callback=jsonp_" + getJsonP() + "_&keywords=" + city['name']
data = getData(url)
for possible in data['districts']:
if possible['adcode'] == city['adcode']:
for item in possible['districts']:
save([item['citycode'], item['adcode'], item['name'], item['center'], item['level'], ''])
while 1:
try:
getBusiness(item)
break
except Exception, e:
print 'retry:' + item['name'] + "->" + str(e)
break
和获取市列表稍微不同的是这里不能直接data['districts'][0]了,按市、区搜就有可能重名了,所以用城市的adcode来匹配,针对匹配上的市,遍历区的信息存入数据库,然后再针对区搜索商圈。
4. 商圈列表
跟获取市列表和获取区列表没有太大的区别:
def getBusiness(district):
print "->->District->" + district['name']
url = "http://restapi.amap.com/v3/config/district?subdistrict=1&extensions=all&level=district&key=608d75903d29ad471362f8c58c550daf&s=rsv3&output=json&callback=jsonp_" + getJsonP() + "_&keywords=" + district['name']
data = getData(url)
for possible in data['districts']:
if possible['adcode'] == district['adcode']:
values=[]
for item in possible['districts']:
values.append((item['citycode'], item['adcode'], item['name'], item['center'], item['level'], item['areacode']))
saveAll(values)
break
唯一不同的是直接用saveAll一次性存储所有的数据而不是一条条的save:
def saveAll(values):
try:
conn=MySQLdb.connect(host='www.xxx.com',user='xxx',passwd='xxx',port=3306,charset="utf8")
conn.select_db('test')
cur=conn.cursor()
cur.executemany("insert into amap(citycode, adcode, name, center, level, areacode) values(%s,%s,%s,%s,%s,%s)",values)
conn.commit()
cur.close()
conn.close()
except MySQLdb.Error,e:
print "Mysql Error %d: %s" % (e.args[0], e.args[1])
关键的逻辑就都介绍完了,下面是头部库的导入和编码设置:
# -*- coding: utf-8 -*-
#encoding=utf-8
import urllib2
import sys, json
from StringIO import StringIO
import gzip
import MySQLdb
import datetime
reload(sys)
sys.setdefaultencoding('utf-8')
这里要说的一点是:不知道为什么编译器会报错说setdefaultencoding方法不存在,有这个错误的话不用理会,可以正常运行,如果不设置那么在数据库插入的时候会报下面的一个错误:
UnicodeEncodeError:'latin-1' codec can't encode character
最后是上述方法的调用:
starttime = datetime.datetime.now()
for province in provinceList:
getCity(province)
print 'over'
endtime = datetime.datetime.now()
print (endtime - starttime).seconds
转载:http://www.cnblogs.com/smarterplanet/p/4700375.html
python高德 查询县_Python获取高德地图省市区县列表相关推荐
- python高德 查询县_Python和高德开放平台——地名地址空间化及采集POI信息
上一篇我们介绍微博开放平台时说道了通过高德开放平台获取地名地址的坐标,今天我们来说一说怎么使用高德开放平台查询相关关键词的地址坐标,或者采集学校.医院.餐厅.公园.企业等POI的信息. 高德开放平台h ...
- python高德 查询县_【python】获取高德地图省市区县列表
项目中需要用省市区来进行检索,原想高德地图肯定会有API来获得这些数据,结果没有找到,有一个接口好像可以用,但是会附带大量的边界坐标点. 所以就不如自己把高德的省市区列表扒下来,自己写接口来完成这个功 ...
- python数据展示平台_Python获取各大地图平台经纬度数据,哪家的数据最准确?
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于菜J学Python ,作者J哥 前言 不知道大家会在什么场合使用地图 ...
- python交通调查数据处理_Python突破高德API限制爬取交通态势数据+GIS可视化(超详细)...
一.需求: 爬取高德的交通态势API,将数据可视化为含有交通态势信息的矢量路网数据. 二.使用的工具: Python IDLE.记事本编辑器.ArcGIS 10.2.申请的高德开发者KEY(免费). ...
- 关于python数据的纬度_Python获取各大地图平台经纬度数据,哪家的数据最准确?...
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于菜J学Python ,作者J哥 前言 不知道大家会在什么场合使用地图 ...
- python下载谷歌地图瓦片_python获取bing地图发布自己的TMS服务(一)下载瓦片
部分结果 bing地图瓦片使用QuadKey作为命名方式. QuadKey简介 如何计算quadkey 在给定level下,把行号tileY和列号tileX转换为2进制,然后行列交叉存储,再转换为4进 ...
- python 打卡程序_python获取微信企业号打卡数据并生成windows计划任务
由于公司的系统用的是Java版本,开通了企业号打卡之后又没有预算让供应商做数据对接,所以只能自己捣鼓这个,以下是个人设置的一些内容,仅供大家参考 安装python python的安装,这里就不详细写了 ...
- python10086查询系统_Python获取移动性能指标
最近两天在研究移动性能这块,这个的用处非常大,比如说在做性能测试的时候用top 或者 dstat 1的时候获取到的性能指标是非常实用的,即时获取的指标评估和分析系统瓶颈. 再就是在自动化中调用性能指标 ...
- [转载] python字典查询功能_Python中的字典功能
参考链接: Python中的字典dictionary方法 (cmp(), len(), items()-) python字典查询功能 Let's check out some important fu ...
最新文章
- 19个人工智能(AI)热门应用领域,你知道多少?
- Network Manager碰到的问题
- maven配置阿里云镜像后Eclipse不生效解决办法
- 北京沙龙报名 | 关于Dubbo开源的那些事儿
- django-编辑功能
- 【clickhouse】Application: DB::Exception: Duplicate interserver IO endpoint: DataPartsExchange
- 如何借助OpenStack命令行工具管理虚拟机?
- QT5.12界面再win10下总是莫名卡死
- 能源管理系统背景概述
- linux ipv6 前缀 定义,家庭拨号动态前缀IPv6环境下的内部设备IPv6地址的端口放通...
- 风控教父谈模型风险管理(中文版)
- win10如何录制内部声音(非麦克风录音)
- Lodop打印参数方法参考
- codeigniter配置
- 带上问题来看:主流技术Java、Python怎么?基本功又该怎么学?(什么是MySQL、Linux、算法?又该怎么用?)
- 安卓模拟器配置了摄像头还是显示黑白棋盘
- 小米官宣:手表Color 2来了,6色多彩表带,你喜欢哪个?
- Google搜索中国定制版已黄了,百度再次PK的希望或落空
- 【数字信号处理】序列傅里叶变换(FT)的物理意义
- 字符串指针——指向字符串的指针