百度地图POI数据爬取,突破百度地图API爬取数目“400条“的限制11。
1.POI爬取方法说明
1.1AK申请
登录百度账号,在百度地图开发者平台的API控制台申请一个服务端的ak,主要用到的是Place API.检校方式可设置成IP白名单,IP直接设置成了0.0.0.0/0比较方便。
Place API 提供的接口用于返回查询某个区域的某类POI数据,且提供单个POI的详情查询服务,用户可以使用C#、C++、Java,Python等开发语言发送请求,接收json、xml的数据。关于Place API的具体使用可以参考:Place API Web服务API
1.2爬取方式
百度地图将POI数据划分为多个类别,我想要爬取某个城市的所有类别的POI名称和经纬度信息。爬取时,先将类别存储在一个“POI总表.csv”文件中,再逐类别爬取POI数据。POI总表包含POI类别、POI类别对应的编码、各类POI记录条数。
Place API提供了3种爬取区域POI信息的方式:(1)城市内检索 (2)矩形检索 (3)圆形区域检索。这里,POI信息的爬取主要使用城市内检索和矩形检索两种方式。
1.2.1城市内检索
城市内检索主要的请求参数是query查询的类别、region查询的城市名称。将查询得到json格式的数据,解码为utf-8编码方式后存储在content中。通过正则表达式可以得到POI的名称和经纬度信息。
reg = r'"name":"([\d\D]*?)",[\d\D]*?"lat":([\d\D]*?),[\d\D]*?"lng":([\d\D]*?)},'
pattern = re.compile(reg)
items = re.findall(pattern,content)
1.2.2矩形检索
矩形检索的主要请求参数是query查询的类别、bounds查询区域的左下、右上经纬度。lat,lng(左下角坐标),lat,lng(右上角坐标)。查询得到的结果与城市范围内检索结果相似。
通过两种方式实现POI的区域检索都很便捷,但是当城市较大,某一类POI信息数量大时,由于百度API的限制,1.2.1城市内检索最多只能返回400条POI数据,会造成查不全的现象。这时,可以利用矩形检索,将区域的外包矩形划分为多个小网格,并确保每个网格中该类别POI数据的条数不会超过400条,这样逐个小网格进行矩形检索,最终得到城市区域某一类别POI的所有数据。
2.Python代码实现
2.1 城市内检索
城市区域内检索通过正则表达式re获取需要的信息,当该城市某一类POI数量大于400时,可使用划分为网格的矩形检索进行POI爬取,以保证爬取到完整的POI数据。
# -*- coding: utf-8 -*-
import sys
import codecs
import urllib
import urllib2
import re
import pandas as pdreload(sys)
sys.setdefaultencoding('utf-8')user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.2)'
headers = {'User-Agent':user_agent}inpath = 'POI总表.csv'
path = unicode(inpath, 'utf-8')
poi_list = pd.read_csv(path)
api_key="" #输入AKfor poi in range(len(poi_list)):
outpath = '+str(poi)+'_'+poi_list.iloc[poi, 1] + '.csv'
path = unicode(outpath, 'utf-8')
with open(path, 'w') as f:
f.write(codecs.BOM_UTF8)
f.write('id,name,lat,lng\n')
i=1
j=1
try:
for i in range(int(poi_list.iloc[poi,4])/10+2):
url = "http://api.map.baidu.com/place/v2/search?q="+poi_list.iloc[poi,3]+"&page_size=10&page_num="
url = url+str(i-1) + "&scope=1®ion=%E6%AD%A6%E7%A9%B4&city_limit=true&coord_type=1&output=json&ak="
+api_key # ak需输入申请的ak
request = urllib2.Request(url, headers=headers)
response = urllib2.urlopen(request)
content = response.read().decode("utf-8")
# print content
reg = r'"name":"([\d\D]*?)",[\d\D]*?"lat":([\d\D]*?),[\d\D]*?"lng":([\d\D]*?)},'
pattern = re.compile(reg)
items = re.findall(pattern,content)
for item in items:
# print "name:",item[0]
# print "lat:",item[1]
# print "lng:",item[2]
savestr = str(j)+','+str(item[0])+','+str(item[1])+','+str(item[2])
j += 1
f.write(savestr)
except urllib2.URLError, e:
if hasattr(e, "code"):
print e.code
if hasattr(e, 'reason'):
print e.reason
finally:
f.close()
2.2 矩形区域检索
BaiduPOI通过url获取POI数据,LocaDiv划分网格,逐个网格爬取POI数据。
# -*- coding:utf-8 -*-
import json
import codecs
import os
import urllib2
import sys
import timereload(sys)
sys.setdefaultencoding('utf8')class BaiDuPOI(object):
def __init__(self, itemy, loc):
self.itemy = itemy
self.loc = locdef urls(self):
api_key = baidu_api
urls = []
for pages in range(0, 20):
url = 'http://api.map.baidu.com/place/v2/search?query=' + self.itemy + '&bounds=' + self.loc + '&page_size=20&page_num=' + str(
pages) + '&output=json&ak=' + api_key
urls.append(url)
return urlsdef baidu_search(self):
json_sel = []
for url in self.urls():
json_obj = urllib2.urlopen(url)
data = json.load(json_obj)
for item in data['results']:
jname = item["name"]
jlat = item["location"]["lat"]
jlng = item["location"]["lng"]
js_sel = jname + ',' + str(jlat) + ',' + str(jlng)
json_sel.append(js_sel)
return json_selclass LocaDiv(object):
def __init__(self, loc_all):
self.loc_all = loc_alldef lat_all(self):
lat_sw = float(self.loc_all.split(',')[0])
lat_ne = float(self.loc_all.split(',')[2])
lat_list = []
for i in range(0, int((lat_ne - lat_sw + 0.0001) / 0.1)): # 0.1为网格大小,可更改
lat_list.append(lat_sw + 0.1 * i) # 0.05
lat_list.append(lat_ne)
return lat_listdef lng_all(self):
lng_sw = float(self.loc_all.split(',')[1])
lng_ne = float(self.loc_all.split(',')[3])
lng_list = []
for i in range(0, int((lng_ne - lng_sw + 0.0001) / 0.1)): # 0.1为网格大小,可更改
lng_list.append(lng_sw + 0.1 * i) # 0.1为网格大小,可更改
lng_list.append(lng_ne)
return lng_listdef ls_com(self):
l1 = self.lat_all()
l2 = self.lng_all()
ab_list = []
for i in range(0, len(l1)):
a = str(l1[i])
for i2 in range(0, len(l2)):
b = str(l2[i2])
ab = a + ',' + b
ab_list.append(ab)
return ab_listdef ls_row(self):
l1 = self.lat_all()
l2 = self.lng_all()
ls_com_v = self.ls_com()
ls = []
for n in range(0, len(l1) - 1):
for i in range(0 + len(l1) * n, len(l2) + (len(l2)) * n - 1):
a = ls_com_v[i]
b = ls_com_v[i + len(l2) + 1]
ab = a + ',' + b
ls.append(ab)
return lsif __name__ == '__main__':
# ak
baidu_api ="" # 这里填入你的百度API的ak
print "开始爬取数据,请稍等..."
start_time = time.time()
loc = LocaDiv('29.8255, 115.367400, 30.2194, 115.8287')
locs_to_use = loc.ls_row()for loc_to_use in locs_to_use:
par = BaiDuPOI(u'购物', loc_to_use) # 请修改爬取的类别
a = par.baidu_search()
doc = open('zhengfujigou.csv', 'a+')
doc.write(codecs.BOM_UTF8)
for ax in a:
doc.write(ax)
doc.write('\n')
doc.close()
end_time = time.time()
print "购物爬取完毕,用时%.2f秒" % (end_time - start_time)
2.3爬取结果示例
---------------------
作者:haha_point
来源:CSDN
原文:https://blog.csdn.net/haha_point/article/details/78079614
版权声明:本文为博主原创文章,转载请附上博文链接!
转载于:https://www.cnblogs.com/telwanggs/p/10383755.html
百度地图POI数据爬取,突破百度地图API爬取数目“400条“的限制11。相关推荐
- 2018全国百度地图poi数据
百度地图POI数据获取及后续处理的过程.POI数据获取及后续处理的过程主要包含了两个大的步骤,即 POI数据获取:从百度地图得到POI数据,以json格式保存: 数据的EXCEL导入:将json格式保 ...
- 地图poi数据下载-2019全国地图poi数据-百度高德腾讯
百度高德腾讯地图poi数据下载 全国地图poi数据-下载 上海市(2947012) 上海城区(2947012) 江苏省(8157158) 南京市(1073860) 无锡市(974774) 徐州市(59 ...
- [小O地图-数据] - 多条件查询及展示地图POI数据
小O地图提供自定义多边形范围下载地图POI数据,方便用户精准下载数据,提高工作效率. 操作步骤: [1]新建任务 输入必需条件后,选择[多边形范围]选项,并选择右侧下列菜单选择[拾取多边形]功能. [ ...
- 【数据工具】高德地图POI数据下载工具(支持选择省市以及POI类型)
1. 工具介绍 今天分享一个能够实现零代码获取高德地图POI数据的工具. 该工具目前支持通过框选地图以及点选省或市的方式输入数据下载范围.另外,支持通过点选的方式选择想要获取的POI类型. 获取方式在 ...
- 【数据工具】高德地图POI数据下载工具v1.3(新增输入POI关键词+稳定性提高)
1. 工具介绍 今天分享一个能够实现零代码获取高德地图POI数据的工具. 该工具当前版本号为v1.3,主要功能特点包括: 支持通过拉框多边形以及点选省或地级市的方式输入POI数据下载范围 支持多选输入 ...
- 实用工具|零代码实现高德地图POI数据下载
1 工具获取方式 点击下面链接,即可获取地理坐标系转换工具 地理坐标系转换工具 2 工具介绍 高德地图POI数据下载工具(下文称该工具)是一款能够让用户在不写代码的前提下实现高德地图POI数据批量下载 ...
- 全国2018地图poi数据-下载
全国地图poi数据-下载 上海市(2947012) 上海城区(2947012) 江苏省(8157158) 南京市(1073860) 无锡市(974774) 徐州市(593798) 常州市(673957 ...
- python爬取百度地图数据_百度地图POI数据爬取
利用百度地图开发者中心中的web API获取城市POI数据,后期会写出完整的多种参数详细数据获取教程.本次只写出了根据关键词和目的地的数据获取程序. 将爬取下来的数据保存到本地csv文件. 百度API ...
- python爬取地图地址_Python爬取百度地图poi数据 !
锵锵锵,我来啦.10天过的好快呀,4月份都已经过了三分之一,我的体重还居高不下,qwq.今天给大家分享python爬取百度地图小区的数据,希望大家看后,可以尝试自己编写爬取自己所在市的中学,公园,银行 ...
最新文章
- 两个点 定位_深圳Mark点定位的一般原理与步骤
- 图解Elasticsearch中的_source、_all、store和index属性
- Linux里find和grep命令
- tcp udp区别优缺点_Linux网络编程面试题--tcp和udp的区别
- web前端技术分享:多行文本溢出问题解决方案
- 乐山电子计算机职业学院,学校介绍
- oracle编写备份数据库代码,oracle_oracle数据库创建备份与恢复脚本整理,1:创建用户 复制代码 代码如 - phpStudy...
- Julia中的supertype()函数
- 4.Model Validation
- ps怎么对比原图快捷键_PS裁剪几大构图法
- (11)Xilinx BRAM或者ROM初始化文件.COE制作(FPGA不积跬步101)
- Spring4.x(14)---SpringEL-运算符
- 字符串查找函数(BF)
- 对于Typora(markdown)的基本使用
- RS485无线通讯模块工作原理及应用场景
- sql 语句高级用法常用合集
- 培训Java程序员技术真的差吗?
- 华为路由与交换 eSight基本概述学习笔记
- 我太机智了……30条关于数据行业内涵笑话漫画
- NLP聊天机器人笔记
热门文章
- php 数组 键值 初始化,PHP 自定义键值数组
- FPGA系统设计考虑因素
- 使用Vivado保存仿真波形数据并读取
- 3. GD32F103C8T6 GPIO的位带操作
- vs2010 导出创建dll 导入使用dll 导出有命名空间的类 函数 外部函数
- Python自定义包
- 数值计算方法(三)——变步长梯形法与龙贝格算法
- linux多线程学习(四)——互斥锁线程控制
- 【Shell教程】四----输入输出,条件判断,循环
- html 头尾代码自动,HTML Head Generator - 纯 CSS 实现的头部元标签代码生成器 - 钉子の次元...