本文将记录有关利用百度地图API去搜索一个城市内的POI的相关内容
百度地图API
百度地图API服务说明见其主页:
http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
地址解析:根据地址获取坐标
http://api.map.baidu.com/geocoder?address=地址&output=json&key=用户密钥&city=城市名)
它返回的是个json类型数据,一个区域最大返回数为400,每页最大返回数为20
逆地址解析:根据坐标获取地址
http://api.map.baidu.com/geocoder?location=纬度,经度&output=输出格式类型&key=用户密钥
根据地址获取POI
http://api.map.baidu.com/place/v2/search?query=%E8%B6%85%E5%B8%82&page_size=0&page_num=2&scope=1®ion=%E6%98%8C%E9%BB%8E&output=json&ak=40bUQeFSGGs8c45LHMfe2Ram0hSCKZks
秘钥的申请在百度API的官方网站http://lbsyun.baidu.com/apiconsole/key
秘钥是免费申请的,每天有固定的流量,如果您要使用我的代码,还麻烦您自主申请下秘钥,以免流量用完影响您的使用
在这两个API中有关query类型的选择可以参考http://lbsyun.baidu.com/index.php?title=lbscloud/poitags这个网址内的类别。
接下来需要考虑的就是有关在地图内小方格的选择,参考了一些博文里面提到方格的大小选择是2KM*2KM的大小比较好,我是对一个县城进行搜索,所以将该县城分割为四份或者8份即够了。
整体流程
1 区域划分,2km*2km的区域基本可以满足需求,获取每个区域的对角坐标(经纬度),逐行写入一个txt文本里
2 爬虫程序编写 读取1中的txt文本,逐行循环;调用百度API接口,爬取json;将爬取的数据存入数据库中; 每个类别跑一次程序
python实现
#该代码是学习其他博文,在此对其他博主表示感谢
import sys
import requests #导入requests库,这是一个第三方库,把网页上的内容爬下来用的
ty=sys.getfilesystemencoding() #这个可以获取文件系统的编码形式
import time
#百度API接口,通过输入经纬度范围查询范围内的POI数据,
#http://lbsyun.baidu.com/index.php?title=lbscloud/poitags 该网址为POI类型,即API链接中的query的类型
base_url='http://api.map.baidu.com/place/v2/search?query={}&bounds={}&page_size=20&page_num={}&output=json&ak=SAKipkD157dL2Mamat8D4FqgxzYz0x7X'
#1.获取每个格网起始URL
def get_begin_url(keyword,page=0):
with open('E:/贾学斌/格网矩形范围.txt', 'r') as f:
#网格矩形范围内每一行是一个小方格的经纬度范围,保存顺序为小方格的左下经度纬度、右上经度纬度
f=f.readlines()
for line in f:
w1 = float(line.split(',')[1])
j1 = float(line.split(',')[0])
w2 = float(line.split(',')[3])
j2 = float(line.split(',')[2])
url2 = base_url.format(keyword, str(w1) + ',' + str(j1) + ',' +