前言

目的:本文试图爬取全北京市不同类别POI的所有数据。

大致流程:爬取北京市边界坐标

坐标映射到网格,得到北京市的边界网格

广度优先遍历,将整个北京市网格化

对每一个网格进行poi获取,当获取的数量过多时,对网格再次划分,递归查询

第一步,爬取北京市边界坐标

这里可以利用api来爬取,但为了方便,可以直接用高德地图的示例操作

1.2 更改参数并运行

1.3 在示例下的"districts"-->"0"-->"polyline";得到边界坐标值,复制保存到本地 border.csv,可以在mapinfo下可视化。需要说明的是,爬取的边界有一个缺口,我将缺口的最近两个点途径的三个位置添加了上去。在border.csv中添加的三行数据如下:

115.805,40.415

115.815,40.405

115.825,40.395

第二步,映射边界网格,北京市网格化

2.1 首先需要设置几个参数

网格大小:0.1 * 0.1 ,这里直接将经纬度的0.1作为网格大小,这意味着网格精确度为0.1

北京市左下角和右上角坐标 : (115.42,39.44)(117.52,41.07)

jmin = 115.42

jmax = 117.52

wmin = 39.44

wmax = 41.07

div = 0.1 #设置间隔

2.2 然后,将边界坐标映射到网格。

def to_n(rows):

j = rows.iloc[0]

w = rows.iloc[1]

x = int((j-jmin)//div)

y = int((w-wmin)//div)

if x >= num_j: #防止落在边界上的点越界

x = num_j - 1

if y >= num_w:

y = num_w - 1

re[x][y] += 1

border = pd.read_csv('border.csv',header=None)

num_j = int((jmax-jmin)//div)

num_w = int((wmax-wmin)//div)

re = np.zeros([num_j,num_w]) #re存放落在每一个网格内的边界坐标个数

border = pd.read('border.csv',header=None) #border.csv存储边界坐标,有经纬度两列。

border.apply(to_n,axis=1,result_type='expand')

网格后的数据在mapinfo中可视化如下,下面是一个个的小方格。

2.3 从内部一个点出发,广度优先搜索,得到全市的网格数据

其实还有其他方法来实现网格化,但为了方(tou)便(lan),这里直接从一个网格出发,我选择 的是中心点,广度优先搜索,并在搜索过程中将走过的网格标记。

def BFS(x,y):

list1.append([x,y])

while len(list1)>0:

top = list1.pop()

xnow = top[0]

ynow = top[1]

if xnow<0:

return

re[xnow][ynow] = 1

#print(xnow,ynow)

if re[xnow+1][ynow]==0:

list1.append([xnow+1,ynow])

if re[xnow][ynow+1]==0:

list1.append([xnow,ynow+1])

if re[xnow-1][ynow]==0:

list1.append([xnow-1,ynow])

if re[xnow][ynow-1]==0:

list1.append([xnow,ynow-1])

list1 = []

BFS(int(num_j//2),int(num_w//2))

然后将网格映射到坐标,可以直接拿网格左小角作为映射结果。

for i in range(num_j):

for j in range(num_w):

if re[i][j]>0:

ix = round(i*div+jmin,2)

iy = round(j*div+wmin,2)

print(ix,',',iy)

得到的结果如下,图中的方格只是网格左小角坐标,大家懂意思就好:

第三步,对每一个网格爬取POI

这里需要介绍一下这一API的限制。高德地图规定每一个KEY每天只能调用2000次,经过测试,每一个账号可以申请10个KEY;在每一次调用“多边形搜索”API时,每一页最多返回25条数据,这意味着每天一个账号最多可获取50万条POI,这是最理想的情况,因为一页不可能总是满的。

同时,“多边形搜索”API最多只能返回一个多边形小于900的数据量;保险起见,当遇到某一个网格的POI数据量大于850的时候,需要再次划分网格进行递归查询。这一部分需要简单的调用requests和json库,构建URL参考请参考高德地图API文档-搜索POI中的“多边形搜索”,不多解释,完整代码如下。

import numpy as np

import pandas as pd

import requests

import json

def search_poi(x,y,divt,poi_type,page):

global keyi

global api_count

#构建URL

polygon = str(x)+','+str(y)+'|'+str(x+divt)+','+str(y+divt)

u= "https://restapi.amap.com/v3/place/polygon?key="+keys[keyi]+'&polygon='+polygon +'&types='+poi_type+'&extensions=all&output=json&offset=25&page='+str(page)

api_count += 1 #记录一次调用

#单个key超出2000次限额,更换key

if api_count>=2000:

keyi += 1

print("change key!now key is",keys[keyi])

api_count=0

#解析数据

data=requests.get(u)

s=data.json()

#查询错误

if s['status']!='1':

print('eror!')

return

#如果网格太大,递归查询

if int(s['count'])>800:

print("too much!count is"+s['count'])

search_poi(x,y,divt/2,poi_type,1)

search_poi(x+divt/2,y,divt/2,poi_type,1)

search_poi(x,y+divt/2,divt/2,poi_type,1)

search_poi(x+divt/2,y+divt/2,divt/2,poi_type,1)

return

#这里可以按照需求,修改成存储结果,我这里只做了输出

print('now location:',x,y,divt,';now page:',page,'now api count:',api_count)

if len(s['pois'])>0:

for i in range(len(s['pois'])):

print(s['pois'][i]['name'],s['pois'][i]['typecode'],s['pois'][i]['location'])

#若不止一页,查询下一页

if len(s['pois'])==25:

search_poi(x,y,divt,poi_type,page+1)

#main

keys = ['A','B','C','D','E','F','G','H','I','J']#自己申请的10个key

global keyi#当前使用的key编号

global api_count#每一个key调用api的次数

keyi = 0

api_count=0

div = 0.1 #设置网格大小

poi_type='150700'#当前搜索的POI类,具体参考

grid_jw = pd.read_csv('beijing_grid.csv',header=None) #保存的北京市网格数据

#对所有网格循环搜索POI

for index,rows in grid_jw.iterrows():

search_poi(rows[0],rows[1],div,poi_type,1)

(beijing_grid.csv存储之前得到的所有网格的左小角的经纬度)

每次只需要改变POI类,关于这一编码可以参考高德地图POI分类编码表;以及改变keyi,这个需要查看自己高德地图控制台的应用管理内的每一个KEY的额度。比如:

python爬取高德poi数据_python3爬虫-高德地图POI数据的爬取相关推荐

  1. [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  2. c#使用正则表达式获取TR中的多个TD_[Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例...

    首先祝大家中秋节和国庆节快乐,欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都 ...

  3. python3抓取数据_python3抓取到的拉勾数据统计

    趁着最近有时间写了个拉勾爬虫抓取了后端.前端和移动端技术岗位的数据,总共大约6多万条记录,对其取前十名进行统计 按地域划分: 可以看出北上广深杭的数量远远超出其它城市,机会相对较多 2. 按融资阶段来 ...

  4. python链家网高并发异步爬虫and异步存入数据

    python链家网二手房异步IO爬虫,使用asyncio.aiohttp和aiomysql 很多小伙伴初学python时都会学习到爬虫,刚入门时会使用requests.urllib这些同步的库进行单线 ...

  5. 地图poi数据下载-2019全国地图poi数据-百度高德腾讯

    百度高德腾讯地图poi数据下载 全国地图poi数据-下载 上海市(2947012) 上海城区(2947012) 江苏省(8157158) 南京市(1073860) 无锡市(974774) 徐州市(59 ...

  6. python如何爬虫股票数据_python爬虫实例,股票数据定向爬虫

    前言 我服了,这几天,怎么涨两天还不够跌一次,害.希望这个可以帮到自己! "股票数据定向爬虫"实例介绍 功能描述 目标:获取上交所和深交所所有股票的名称和交易信息 输出:保存到文件 ...

  7. python向kafka发送json数据_python3实现从kafka获取数据,并解析为json格式,写入到mysql中...

    项目需求:将kafka解析来的日志获取到数据库的变更记录,按照订单的级别和订单明细级别写入数据库,一条订单的所有信息包括各种维度信息均保存在一条json中,写入mysql5.7中. 配置信息: [Gl ...

  8. retrofit 解析百度地图api 返回数据_新版百度地图建筑数据含高度解析

    注:本文中所述内容仅作为研究用途,不包括任何技术细节,不提供数据爬取.非法攻击的咨询和支持.另:百度建筑轮廓数据中存在明显签名式错误,下载使用容易被追求侵权. 矢量瓦片:爬取百度地图必须要了解矢量瓦片 ...

  9. 数据分发服务器管理系统,地图差分数据分发系统、地图差分数据分发装置、地图数据保有装置、更新管理服务器、以及地图差分提取服务器...

    主权项: 1.一种地图差分数据分发系统,其包括:地图差分数据分发装置(1,2),其具备地图差分数据储存部(12)和分发部(137),该地图差分数据储存部(12)储存更新地图要素的数据之前的版本的地图数 ...

  10. python爬取加密qq空间_python3爬虫爬取QQ好友空间说说

    开发环境Win10 python 3.6.3 pycharm 2018.1 第三方库csv requests pymysql selenium 无头浏览器 PhantomJS 主要思路通过QQ邮箱导出 ...

最新文章

  1. Yii2.0 RESTful API 之版本控制
  2. .Net 基础new关键字的用法
  3. 零分钟即可在容器开发套件(CDK)上实现云运营
  4. 安装tron_具有Tron效果的JavaFX 2 Form
  5. html 字符串 放到webbrowser,delphi 直接将html字符串读入WebBrowser中
  6. VMware - 虚拟机系统中无法使用键盘
  7. librdkafka的安装和使用
  8. 玉米社:短视频运营主要做哪些工作?
  9. 版权符号模糊解决办法
  10. csapp实验摘选 I Data Lab ——小小菜下士的第一篇博客
  11. 流程控制之if...elif...else和流程控制之while循环
  12. iMazing2.16最新苹果手机备份同步工具
  13. Wallpaper 双屏单独显示壁纸
  14. py和ipynb文件互相转化
  15. Web目录文件扫描程序(python)
  16. 支持向量机(SVM)--小样本
  17. 教你一个用计算机表白的方法,七夕示爱教你用文件夹加密方式锁定表白
  18. 搜狗输入法,好用不?原理是什么?
  19. Coding-Party 基于飞桨的农作物智能识别系统病虫害识别
  20. 受控组件及非受控组件

热门文章

  1. sas和python哪个好学_Sas R和Python的比较 | 数据分析的工具选择
  2. 推荐几个不错的苹果电脑截图工具
  3. android studio gjson,Android Studio插件GsonFormat
  4. Visio2019自动闪退问题
  5. 密码字典生成工具:crunch
  6. PyQt5教程(二)——PyQt5的安装(详细)
  7. java代码控制别人电脑_java实现电脑远程控制完整源代码(转)
  8. linux nvme驱动编译,Linux nvme驱动初探
  9. iOS-常用宏定义大全
  10. 沪深股票历史数据下载,股票历史交易数据下载