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的Flask框架中实现简单的登录功能的教程
Apr 20 Python
Django实现图片文字同时提交的方法
May 26 Python
Python的socket模块源码中的一些实现要点分析
Jun 06 Python
python正则实现提取电话功能
Feb 24 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
Dec 04 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
Oct 14 Python
基于python cut和qcut的用法及区别详解
Nov 22 Python
Django 批量插入数据的实现方法
Jan 12 Python
什么是python的列表推导式
May 26 Python
Python中的全局变量如何理解
Jun 04 Python
python+playwright微软自动化工具的使用
Feb 02 Python
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
Oct 16 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
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
php全角字符转换为半角函数
2014/02/07 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
30个php操作redis常用方法代码例子
2014/07/05 PHP
php反射学习之依赖注入示例
2019/06/14 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
js点击button按钮跳转到另一个新页面
2014/10/10 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
深入解析Javascript闭包的功能及实现方法
2016/07/10 Javascript
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
vue项目中仿element-ui弹框效果的实例代码
2019/04/22 Javascript
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
[26:21]浴火之凤-TI4世界冠军Newbee战队纪录片
2014/08/07 DOTA
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
Python基于twisted实现简单的web服务器
2014/09/29 Python
python实现简单遗传算法
2018/03/19 Python
Python Pexpect库的简单使用方法
2019/01/29 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
Keras自定义实现带masking的meanpooling层方式
2020/06/16 Python
python中实现栈的三种方法
2020/12/19 Python
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
Cynthia Rowley官网:全球领先的生活方式品牌
2020/10/27 全球购物
人力资源主管岗位职责
2014/01/29 职场文书
中学生期中自我鉴定
2014/04/20 职场文书
作文评语大全
2014/04/23 职场文书
2014年售票员工作总结
2014/11/19 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL