python调用百度地图API爬取西安市POI数据

本文介绍了如何使用Python调用百度地图API爬取西安市的中学POI数据。通过申请百度地图API密钥,构建URL,设置请求头,访问并解析数据,最后将结果存储。因API限制,每页最多20条数据,需通过经纬度网格划分西安市以获取更多数据。
摘要由CSDN通过智能技术生成

任务前提
做该项目之前,首先得有基础知识:
编程语言:python
编译工具:PyCharm
网络爬虫相关知识,xpath库,numpy,pandas等库。

任务准备:
去百度地图开放平台申请密匙:http://lbsyun.baidu.com/
步骤:
登录----->控制台----->注册登录成为开发者(已成为则跳过该步骤)----->创建应用------>填写应用名称----->应用类型选择浏览器端---->refer白名单输入“*”—>创建应用成功----->得到密匙(AK)

我的密匙:************************************

任务目的:
爬取西安市各种兴趣点的POI数据(以西安市所有中学为例)

选取方法:由于我们需要爬取西安市所有兴趣点,区域较大,数据较多,我们采用矩形区域检索来进行,具体可参考:http://lbs.baidu.com/index.php?title=webapi/guide/webservice-placeapi 来进行选择。

爬取关键字:城市:西安(以西安经纬度来表示)兴趣点:中学(其他兴趣点同理)
西安市经纬度范围:

西安市 经度 纬度
左下角 107.671067 33.699374
右上角 109.82715 34.746103

URL模板:
http://api.map.baidu.com/place/v2/search?query=中学& bounds=33.699374,107.671067,34.746103,109.82715&page_size=20&page_num=0&output=json&ak=9toMp2Wls5la******************88fiX (此处填写自己申请的AK)

功能详解:
其实调用百度地图API来爬取没什么难度,基本都是静态页面,和爬取普通的静态页面没什么区别,都是以下几个步骤:
第一步:构建需要访问的URL
第二步:构建请求头(防止反爬手段有很多:伪造UA,代理IP,多进程延迟爬取等)
第三步:访问URL,获取数据
第四步:解析网页数据(xpath,bs4,lxml等)
第五步:存储数据(存入excel,数据库等)

通过调用百度地图API,爬取西安市所有数据,也是通过以上步骤完成的,唯一需要注意的就是我们构造目的URL时根据区域来构建URL的,但是每个URL所爬取到的数据有限,所以我们需要对区域进行合理的划分,来构造跟多的目的URL,这样才能爬取到更多的API数据。有几种不同的方法,圆形区域分割,矩形区域分割等,具体参考官方文档:http://lbs.baidu.com/index.php?title=webapi/guide/webservice-placeapi

因为由于百度的限制每一个区域只有20个url,即page_num从0–19,每一个url最多只有20条数据,所以哪怕该区域有成千上万条数据,最多只能获得400条数据,因此我们要用bound对应区域的经纬度进行网格划分,将西安市通过经纬度进行划分,为了计算简便,我们就切成正方形。(类似于数学中的微分思想)
坐标范围:
西安市经纬度:
左下角:107.671067,33.699374 右上角:109.82715,34.746103
lat_1 = 33.699374 ; lat_2 = 34.746103 ;lon_1 = 107.671067 ; lon_2 = 109.82715
纬度差:lat_2 - lat_1 = 1.046729
经度差:lon_2 - lon_1 = 2.156083
设切割的小正方形的边长为:las;则lat_count = int((lat_2 - lat_1) / las)+1计算的是在纬度上能够分割出多少个小正方形;lon_count = int((lon_2 - lon_1) / las )+1计算的是在经度上能够分割出多少个小正方形;二者乘积就是总共能够分割出多少个小正方形。为了简便计算,取las值为1
编写代码获取每一个小正方形的坐标范围:
代码如下:

lat_1=33.699374
lon_1=107.671067
lat_2=34.746103
lon_2=109.82715   #坐标范围
las=1  #给las一个值1
lat_count=int((lat_2-lat_1)/las+1)
lon_count=int((lon_2-lon_1)/las+1)
for lat_c in range(0,lat_count):
    lat_b1=lat_1+las*lat_c
    for lon_c in range(0,lon_count)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值