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 相关文章推荐
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
python MySQLdb Windows下安装教程及问题解决方法
May 09 Python
浅谈Python的文件类型
May 30 Python
python SSH模块登录,远程机执行shell命令实例解析
Jan 12 Python
python3+PyQt5使用数据库表视图
Apr 24 Python
Django项目中包含多个应用时对url的配置方法
May 30 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
Jun 27 Python
python mqtt 客户端的实现代码实例
Sep 25 Python
pytorch下大型数据集(大型图片)的导入方式
Jan 08 Python
Django数据模型中on_delete使用详解
Nov 30 Python
python温度转换华氏温度实现代码
Dec 06 Python
Python实现信息轰炸工具(再也不怕说不过别人了)
Jun 11 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
php项目打包方法
2008/02/18 PHP
推荐10个提供免费PHP脚本下载的网站
2014/12/31 PHP
thinkphp命名空间用法实例详解
2015/12/30 PHP
PHP 无限级分类
2017/05/04 PHP
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
jQuery 通过事件委派一次绑定多种事件,以减少事件冗余
2010/06/30 Javascript
javascript复制对象使用说明
2011/06/28 Javascript
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
js点击事件链接的问题解决
2014/04/25 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
js获取及修改网页背景色和字体色的方法
2015/12/29 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
Javascript中window.name属性详解
2020/11/19 Javascript
[06:21]完美世界亚洲区首席发行官竺琦TI3采访
2013/08/26 DOTA
使用Python编写爬虫的基本模块及框架使用指南
2016/01/20 Python
Python开发微信公众平台的方法详解【基于weixin-knife】
2017/07/08 Python
利用Python找出序列中出现最多的元素示例代码
2017/12/08 Python
Django中redis的使用方法(包括安装、配置、启动)
2018/02/21 Python
Python2.7 实现引入自己写的类方法
2018/04/29 Python
Python学习笔记之Django创建第一个数据库模型的方法
2019/08/07 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
在python中使用nohup命令说明
2020/04/16 Python
css3动画效果小结(推荐)
2016/07/25 HTML / CSS
德国高性价比网上药店:medpex
2017/07/09 全球购物
Burt’s Bees英国官网:世界领先的天然个人护理品牌
2020/08/17 全球购物
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
2014年精神文明工作总结
2014/12/23 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android