零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(进阶篇)

更新时间:2023-06-09 00:03:00 阅读: 评论:0

零基础掌握百度地图兴趣点获取POI爬⾍(python语⾔爬取)(进阶篇)
好,现在进⼊进阶篇教程。
1.获取昆明市的bounds值
看到下⾯这个东西了吧?在⽂本框⾥写⼊昆明市,或者其他的⾏政区划地名,北京市、朝阳区、⼤河沟⼦村什么的。
这也是通过调⽤百度地图开放平台API实现的。
实现起来很简单,把下⾯这段代码复制到⼀个txt⽂件中,然后把txt⽂件的拓展名改成html,⽤浏览器打开,就可以查询⾏政区划的范围了。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; chart=gb2312" />
<meta name="viewport"content="initial-scale=1.0, ur-scalable=no" />
<style type="text/css">
body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅⿊";}
#panel{
position:absolute;
left:5px;
top:5px;
}
#result{
background:#fff;
padding:5px;
}
</style>
<script src="/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript"src="api./api?v=2.0&ak=1XjLLEhZhQNUzd93EjU5nOGQ"></script>
<title>添加⾏政区划</title>
</head>
<body>
<div id="allmap"></div>
<div id="panel">
激素的副作用仙居旅游<div>
<input type="text"id="keyword"value="昆明市"/>
<input type="button"value="查看范围"id="commitBtn"/>
边界经纬度坐标
<textarea id="pathStr"></textarea>
边界墨卡托坐标
<textarea id="pathMc"></textarea>
</div>
</div>
<div id="result">阳台风景
</div>
</div>
</body>
</html>
<script type="text/javascript">
// 百度地图API功能
报关单证
var map = new BMap.Map("allmap");
var mercatorProjection = MapType().getProjection();
$("#commitBtn").bind('click', function(){
getBoundary($("#keyword").val());
});
function getBoundary(city){
var bdary = new BMap.Boundary();
<(city, function(rs){      //获取⾏政区域
map.clearOverlays();        //清除地图覆盖物
var count = rs.boundaries.length; //⾏政区域的点有多少个
if (count === 0) {
alert('未能获取当前输⼊⾏政区域');
return ;
}
var pointArray = [];
for (var i = 0; i < count; i++) {
var ply = new BMap.Polygon(rs.boundaries[i], {strokeWeight: 2, strokeColor: "#ff0000"}); //建⽴多边形覆盖物                map.addOverlay(ply);  //添加覆盖物
pointArray = Path());
}
var pathStr = "";
var pathMc = "";
for (var i = 0; i < pointArray.length; i++) {
var mc = mercatorProjection.lngLatToPoint(pointArray[i]);
pathStr += pointArray[i].lng + "," + pointArray[i].lat + ";";
pathMc += mc.x + "," + mc.y + ";";
}
苏轼的人生态度
$('#pathStr').html(pathStr);
$('#pathMc').html(pathMc);
var ply = new BMap.Polygon(pointArray , {strokeWeight: 2, strokeColor: "#ff0000"}); //建⽴多边形覆盖物
var bounds = Bounds();
var ne = NorthEast();
var sw = SouthWest();
var neMc = mercatorProjection.lngLatToPoint(ne);
var swMc = mercatorProjection.lngLatToPoint(sw);
var str = "经纬度:左下⾓,右上⾓:" + sw.lng + "," + sw.lat + ";" + ne.lng + "," + ne.lat
+ "<br/>墨卡托坐标:左下⾓,右上⾓:" + swMc.x + "," + swMc.y + ";" + neMc.x + "," + neMc.y;
$('#result').html(str);
console.log(bounds);
map.tViewport(pointArray);    //调整视野
});
}
//getBoundary('北京');
</script>
HTML是⼀个很神奇的格式,代码可以在⽂本⽂档⾥写,不过应该很少有⼈⽤⽂本⽂档写代码吧。
这段代码可以直接拿来⽤,也是我从⽹上找的,就不分析了。
2.更合理的对查询范围进⾏切分。
这是⼀个很常见的问题,我们要采集昆明市的中学兴趣点,然后就把矩形等分了六份,遍历⼀遍(其实要不遗漏的获取兴趣点,只切六个绝对不够⽤)。
这种切分⽅式其实并不完美,分析⼀下,中⼼城区兴趣点肯定分布更密集,⽽郊区会稀疏⼀些,⽽且⼀个城市的边界不可能是矩形的,我们⽤⼀个⼤矩形切分,会爬取到⼀些其他城市的兴趣点。
有相关从业经验的⼈应该能想到,如果有这个城市的分幅格⽹,遍历分幅格⽹来爬取兴趣点会更好⼀些,当然分幅格⽹我们也可以⾃⼰⽣成,根据预估的兴趣点疏密程度,中⼼城区格⽹加密⼀些,外围合并⼀些。
电脑如何录制视频arcgis有⼀个⼯具fishnet(创建渔⽹),可以⽣成格⽹。
四⾄坐标可以在字段计算器⾥计算,选⽤python语⾔
minX=!in!
maxX=!ax!
minY=!in!
maxY=!ax!
把arcgis属性表导出,可以⽤excel打开。
⽤这个坐标列表去⽣成url列表,主要就是open和write语句的运⽤,其实都可以直接在excel⾥⽤函数去⽣成url列表。
python逐⾏读⼊:
f=open(路径,’a’)
import sys
type = filesystemencoding()
print mystr.decode('utf-8').encode(type)
我的经验是,如果遇到乱码,怎么都调试不成功,那么可以换⼀个编译环境,从python2.7换到python3,或者⽤别的函数,例如不⽤urllib2,⽤beautiful soul,或者requests等,有可能莫名其妙乱
码的问题就不出现了呢!
4.并发量限制与延时功能
import time
time.sleep(10)
这两⾏代码的意思是,延时10秒中,它解决的是⼀分钟内并发量限制的问题,如果我们没有做认证,那么⼀分钟能访问API服务的次数不超过⼏次,超过了就会提⽰访问超过并发量,就爬不到数据了。
解决这个问题的⽅法就是⽤time.sleep(10),每次循环都先休眠10秒,就不会访问超过并发量了。
我觉得10秒够⽤了,所以就设定了10秒,不过如果认证过的开发者,应该不会遇到并发量限制的问题。
这段代码⽰例⼀下:
import time
time.sleep(10)
print time.time()百度网盘怎么上传视频
休眠⼗秒,打印当前时间,结果是⼀个浮点秒数。
5.把代码移植到python3中。
python2.7和python3略微有些差异,python3版本有⼀个好处就是中⽂乱码的情况没那么多,⽽且很多功能和第三⽅库都被整合了。
下⾯这段代码是python3中的,可以看出⽐较于python2.7版本,进⾏了⼏处改变,requests、webbrowr、列表的引⽤等。
#-*-coding:UTF-8-*-
import json
import sys
import requests  #导⼊requests库,这是⼀个第三⽅库,把⽹页上的内容爬下来⽤的
filesystemencoding()  #这个可以获取⽂件系统的编码形式
import time
lat_1=24.390894
卡通蘑菇
lon_1=102.174112
lat_2=26.548645
lon_2=103.678942#坐标范围
las=1#给las⼀个值1
ak='9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO'
push=r'D:\'
#我们把变量都放在前⾯,后⾯就不涉及到变量了,如果要爬取别的POI,修改这⼏个变量就可以了,不⽤改代码了。
print (time.time())  #相较于python2.7,,python3print 需要加括号。
print ('开始')
urls=[] 声明⼀个数组列表
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):
lon_b1=lon_1+las*lon_c
for i in range(0,20):
page_num=str(i)
url='api./place/v2/arch?query=中学& bounds='+str(lat_b1)+','+str(lon_b1)+','+str(lat_b1+las)+','+str(lon_b1+las)+'&page_size            urls.append(url)
#urls.append(url)的意思是,将url添加⼊urls这个列表中。
f=open(r'D:\','a',encoding='utf-8')
print ('url列表读取完成')
for url in urls:
time.sleep(10) #为了防⽌并发量报警,设置了⼀个10秒的休眠。
(url)#获取⽹页信息
data=html.json()#获取⽹页信息的json格式数据
for item in data['results']:
jname=item['name']
jlat=item['location']['lat']
jlon=item['location']['lng']
jadd=item['address']
j_str=jname+','+str(jlat)+','+str(jlon)+','+jadd+'\n'
f.write(j_str)
print (time.time())
f.clo()
print ('完成')
6.代码简化问题。
可以通过分析json数据提炼⼀下简化⽅式。
⽹页打开之后,看⼀下。
{
“status”:0,
“message”:”ok”,
“total”:400,
“results”:[
{
“name”:”北⼤附中云南实验学校”,
“location”:{
“lat”:25.009573,
“lng”:102.723208
},
“address”:”昆明市⽇新中路北⼤附中云南实验学校”,
“street_id”:”beabdbf4ac3394997069d3c7”,
“detail”:1,
“uid”:”beabdbf4ac3394997069d3c7”
主要看results上⾯那三⾏,其中total,是这个矩形范围内有多少个兴趣点,有400个,说明我矩形画⼤了,应该再细分⼀下,这个数应该⼩于400,因为我们之前已经说过20页⽹址最多爬400个poi,total是400,说明实际的poi数量是⼤于400个的。
提取某⼀坐标范围中第⼀页数据的时候,我们可以先获取total值,这样就可以计算出page_num的值了,如果total是100,那么只循环到第五页,page_num=4的时候就可以了。
这是代码的⼀个简化⽅式。
当然应该还有很多,有待我们发觉。

本文发布于:2023-06-09 00:03:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/906671.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:兴趣   并发   获取
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图