Python爬虫实例_利用百度地图API批量获取城市所有的POI点


Posted in Python onJanuary 10, 2018

上篇关于爬虫的文章,我们讲解了如何运用Python的requests及BeautifuiSoup模块来完成静态网页的爬取,总结过程,网页爬虫本质就两步:

1、设置请求参数(url,headers,cookies,post或get验证等)访问目标站点的服务器;

2、解析服务器返回的文档,提取需要的信息。

而API的工作机制与爬虫的两步类似,但也有些许不同:

1、API一般只需要设置url即可,且请求方式一般为“get”方式

2、API服务器返回的通常是json或xml格式的数据,解析更简单

也许到这你就明白了,API简直就是开放的“爬虫”呀,可以告诉你,基本就是这个意思。好的,言归正传,本篇我们就演示如何运用Python结合百度地图API来批量获取POI(兴趣点)。

所谓POI(兴趣点),指的是人们感兴趣,比较常去的地方,比如银行、医院、学校等,利用城市的POI的空间属性可以做非常多的事情,至于什么事情呢,此处省略10000字。。。

说干就干,Let's go!

(1)创建百度地图应用

访问百度地图API需要一个信令(AK),打开百度地图开放平台,点击右上角“API控制台”,即进入了百度地图的开发界面。

Python爬虫实例_利用百度地图API批量获取城市所有的POI点

选择“创建应用”-应用类型勾选“浏览器端”?勾选所用到的服务(一般全选即可),此时就创建好了应用账号,得到“AK”

Python爬虫实例_利用百度地图API批量获取城市所有的POI点

Python爬虫实例_利用百度地图API批量获取城市所有的POI点

(2)Place API 及Web服务API

打开百度地图API的POI模块,网址:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi,这个页面详细介绍了Place API的请求参数及返回数据的情况。

可以看到,Place API 提供区域检索POI服务与POI详情服务。

1. 区域检索POI服务提供三种区域检索方法:

a.城市内检索(对应JavaScriptAPI的Search方法)

b.矩形检索(对应JavaScript API的SearchInBound方法)

c.圆形区域检索(对应JavaScript的SearchNearBy方法)。

2. POI详情服务提供查询单个POI的详情信息,如好评。

并给出了请求的一个示例,设置检索城市为北京,检索关键字为“饭店”,检索后返回10条数据:

http://api.map.baidu.com/place/v2/search?q=饭店®ion=北京&output=json&ak=您的AK

将上述url粘贴到浏览器里,返回的数据如下:

Python爬虫实例_利用百度地图API批量获取城市所有的POI点

上图是将返回的json数据解析之后的结果,可以看到,服务器返回了10条北京市的饭店的信息,包括饭店名称、经纬度、地址、联系电话等。

具体的参数设置,自行去该网页去看吧,这里就不再赘述,这里我们主要利用“矩形检索”的方式来获取整个城市的特定POI信息,其url格式如下:

http://api.map.baidu.com/place/v2/search?query=美食&page_size=10&page_num=0&scope=1&bounds=39.915,116.404,39.975,116.414&output=json&ak={您的密钥}

Python爬虫实例_利用百度地图API批量获取城市所有的POI点

通过实验可以发现,一个矩阵区域最多返回400(20*20)个POI点,即page_size = 20 & page_total = 20,虽然官方文档里说一个区域返回760+都不成问题的,但是测试了一下,发现并没有这么多,最多400个。

Python爬虫实例_利用百度地图API批量获取城市所有的POI点

显然,整个城市不可能仅400个特定描述的POI点,所以我们需要对整个城市进行分片操作,然后每片进行访问,通过Python的循环实现。

(3)获取城市特定POI点集合

比如:我们想获取北京市四环以内所有饭店的信息,即可通过上述步骤借助Python快速实现,废话不多说,直接上代码:

# -*- coding: utf-8 -*-
# Python 2.7
# 提取城市的POI点信息并将其保存至MongoDB数据库
import urllib2 
import json 
from pymongo import MongoClient
left_bottom = [116.282387,39.835862]; # 设置区域左下角坐标(百度坐标系)
right_top = [116.497405,39.996569]; # 设置区域右上角坐标(百度坐标系)
part_n = 2; # 设置区域网格(2*2)
client = MongoClient('localhost',27001)
db = client.transdata
db.authenticate("user", "password")
col = db.taxi; # 连接集合
url0 = 'http://api.map.baidu.com/place/v2/search?';
x_item = (right_top[0]-left_bottom[0])/part_n;
y_item = (right_top[1]-left_bottom[1])/part_n;
query = '饭店'; #搜索关键词设置
ak = 'xxxxxxxxxxxxxxxxxxxxxx'; #百度地图api信令
n = 0; # 切片计数器
for i in range(part_n):
 for j in range(part_n):
 left_bottom_part = [left_bottom[0]+i*x_item,left_bottom[1]+j*y_item]; # 切片的左下角坐标
 right_top_part = [right_top[0]+i*x_item,right_top[1]+j*y_item]; # 切片的右上角坐标
 for k in range(20):
  url = url0 + 'query=' + query + '&page_size=20&page_num=' + str(k) + '&scope=1&bounds=' + str(left_bottom_part[1]) + ',' + str(left_bottom_part[0]) + ','+str(right_top_part[1]) + ',' + str(right_top_part[0]) + '&output=json&ak=' + ak; 
  data = urllib2.urlopen(url);
  hjson = json.loads(data.read());
  if hjson['message'] == 'ok':
  results = hjson['results'];  
  for m in range(len(results)): # 提取返回的结果
   col.insert_one(results[m]);
 n += 1;
 print '第',str(n),'个切片入库成功'

执行为上述代码,运行结果如下:

Python爬虫实例_利用百度地图API批量获取城市所有的POI点

Python爬虫实例_利用百度地图API批量获取城市所有的POI点

可以看到,我们将北京市四环以内区域分成4个切片来进行处理,之所以分切片处理,主要是单个区域访问最多返回400个结果,当区域较大的时候,区域内往往不止400个,所以讲大区域进行切片处理,最后,我们通过数据聚合操作,发现返回的结果总共1014个。(理论上应该返回1600,实际返回1014,说明切片的数量是合适的)

Python爬虫实例_利用百度地图API批量获取城市所有的POI点

好的,我们本篇的分享到这里就要结束了,最后只想说,API真的是个好东西,科学地使用它我们可以做出很多炫酷的应用,像现在比较活跃的数据型应用,其数据接口基本都是基于API形式的,后面的分享我们还会用到更多API的,大家一起期待吧,哈哈,今天就到这里了,各位回见。

Python 相关文章推荐
python中使用smtplib和email模块发送邮件实例
Apr 22 Python
在Python中操作字典之setdefault()方法的使用
May 21 Python
python中的字典使用分享
Jul 31 Python
Python探索之实现一个简单的HTTP服务器
Oct 28 Python
Python自定义函数定义,参数,调用代码解析
Dec 27 Python
Python使用random.shuffle()打乱列表顺序的方法
Nov 08 Python
Python 正则表达式匹配字符串中的http链接方法
Dec 25 Python
简单了解python中对象的取反运算符
Jul 01 Python
django+tornado实现实时查看远程日志的方法
Aug 12 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
May 07 Python
高考考python编程是真的吗
Jul 20 Python
pycharm + django跨域无提示的解决方法
Dec 06 Python
Python之多线程爬虫抓取网页图片的示例代码
Jan 10 #Python
Python设计模式之观察者模式简单示例
Jan 10 #Python
Python爬虫实例_城市公交网络站点数据的爬取方法
Jan 10 #Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
Jan 10 #Python
Python tornado队列示例-一个并发web爬虫代码分享
Jan 09 #Python
Python中join函数简单代码示例
Jan 09 #Python
Python中顺序表的实现简单代码分享
Jan 09 #Python
You might like
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
一个简单的jquery的多选下拉框(自写)
2014/05/05 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
jQuery制作简单柱状图实例
2015/01/28 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
2015/12/02 Javascript
Javascript 链式作用域详细介绍
2017/02/23 Javascript
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
JS 图片压缩原理与实现方法详解
2020/04/29 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
vue使用swiper实现左右滑动切换图片
2020/10/16 Javascript
在Django的URLconf中进行函数导入的方法
2015/07/18 Python
在Django的通用视图中处理Context的方法
2015/07/21 Python
Python单例模式的两种实现方法
2017/08/14 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
Python简单实现控制电脑的方法
2018/01/22 Python
python导出hive数据表的schema实例代码
2018/01/22 Python
win7下python3.6安装配置方法图文教程
2018/07/31 Python
python3 读取Excel表格中的数据
2018/10/16 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
2020/01/25 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
体育专业个人求职信范文
2013/12/27 职场文书
收银员岗位职责
2014/02/07 职场文书
家教广告词
2014/03/19 职场文书
卫生系统先进事迹
2014/05/13 职场文书
组工干部对照检查材料
2014/08/25 职场文书
团结友爱主题班会
2015/08/13 职场文书
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL