零基础掌握百度地图兴趣点获取POI爬⾍(python语⾔爬取)(代码篇)
1.功能分解
先把这个爬⾍要实现的功能做⼀个分解。
已经知道在这个URL中,变量是bounds和page_num的值。
Bounds范围值要采取矩形分割,分4个矩形,就是4组坐标范围,page_num的值从0到19之间。
1组坐标范围20个page_num值,4×20=80。要⽣成的URL阵列是80个。
每个URL都能⽣成⼀个⽹页,每个⽹页上的信息都要被爬下来,保存到⼀个txt⽂件中。
A.根据bounds和page_num组合⽣成URL。
B.根据URL爬取⽹页数据,添加到txt⽂件中。
这将是⼀个循环代码:
Bounds=[矩形1,矩形2,矩形3,矩形4]
Page_nums=[0、1、2……19]
2.功能代码实现。
代码要实现的功能是哪⼏个呢?
按照步骤分:
A.bounds列表的⽣成。
B.URL列表的⽣成。
C.爬取的⽹页内容保存到txt⽂本中。
(1)bounds列表⽣成
再说⼀下,因为这个是零基础教程,所以我会讲解得⾮常细致,python代码会由浅⼊深,从最简单最基础的开始。
我们看⼀下坐标范围:
左下⾓:24.390894,102.174112
右上⾓:26.548645,103.678942
纬度差是2.157751,经度差是1.50483。
⽤代码表⽰⼀下坐标范围:
lat_1=24.390894
lon_1=102.174112
lat_2=26.548645
lon_2=103.678942
lat是纬度的英⽂,lon是经度的英⽂。
我们切分矩形的话,这个矩形的坐标肯定是由上⾯这⼏个坐标范围计算的来的,内插运算。
为了计算简便,我们就切⽅形吧,这个⽅形的边长我们设定⼀个值,假设是las(length of a side,边长英⽂)。
那么第⼀个矩形的左下⾓坐标是lat_1+las,lon_1,右上⾓坐标是lat_1+las*2,lon_1+las;第⼆个矩形的左下⾓坐标是
lat_1+las,lon_1+las,右上⾓坐标是lat_1+las*2,lon_1+las*2……
我们设定的计算规则是:
整个坐标范围的⼤矩形我们叫它矩形A,切分的⼩矩形我们叫它矩形B。
矩形A的左下⾓坐标是:lat_1,lon_1,右上⾓坐标是lat_2,lon_2;
矩形B的边长是las。
那么计算⼀下矩形B的数量:
(int((lat_2-lat_1)/las)+1)*(int((lon_2-lon_1)/las)+1)
int是⼀个取整函数。
int(1.334)=1
int((lat_2-lat_1)/las)+1计算的是在纬度上切了⼏个,int((lon_2-lon_1)/las)+1计算的是在经度上切了⼏个,乘积就是⼀共⼏个矩形。
c语言scanf怎么输入汉字我们看下⾯⼀段代码:
lat_1=24.390894
lon_1=102.174112
lat_2=26.548645
lon_2=103.678942#坐标范围
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):
lon_b1=lon_1+las*lon_c
print str(lat_b1)+','+str(lon_b1)
#这段代码⽣成的是矩形B的左下⾓坐标
在IDLE中敲⼊这些代码,运⾏结果是:
24.390894,102.174112
24.390894,103.174112
25.390894,102.174112
25.390894,103.174112
26.390894,102.174112python解析json文件
26.390894,103.174112
因为我把las设置为1了,所以切出来6个矩形,这是这六个矩形的左下⾓坐标。
这⾏代码很简单,只涉及到两组内嵌的循环语句:for lat_c in range(0,lat_count):
⽤VB语⾔翻译⼀下这⾏就是 for lat_c=0 to lat_count step 1。
说明⼏个注意点:
a.python语⾔不需要声明变量。
b.for语句后⾯的:别忘了。
c.range(0,3)是[0,1,2],3不在数组⾥⾯,好好理解⼀下函数关系,这么个算法,说明左下⾓坐标是正好的,不会多⼀个。
d.python没有结束循环的语句,靠回车,表⽰嵌套关系靠的“ ”,四个空格,for语句冒号后⾯跟着的那⾏,⽐for语句后退了四个空格,说明这个语句是在for循环中的,如果语句要跳出for循环的话,那么就删掉四个空格,表⽰跳出循环。这是⼀个很有意思的python写码规则。
我们把这段代码改⼀改,获取矩形B的范围坐标:
lat_1=24.390894
lon_1=102.174112
lat_2=26.548645
lon_2=103.678942#坐标范围
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):
final框架lat_b1=lat_1+las*lat_c
for lon_c in range(0,lon_count):
lon_b1=lon_1+las*lon_c
print str(lat_b1)+','+str(lon_b1)+','+str(lat_b1+las)+','+str(lon_b1+las)
#这段代码⽣成的是矩形B的范围坐标
运⾏结果如下:
24.390894,102.174112,25.390894,103.174112
24.390894,103.174112,25.390894,104.174112
25.390894,102.174112,26.390894,103.174112
25.390894,103.174112,26.390894,104.174112
26.390894,102.174112,27.390894,103.174112
26.390894,103.174112,27.390894,104.174112
好好理解⼀下这⾏代码。
(2)URL列表⽣成:
bounds列表⽣成之后,page_num在range(0,20)中遍历⼀遍,就⽣成了URL列表了。
代码如下:
(5)python默认编码问题。
马斯克脑芯片python默认的编码是ASCII,不过URL解析的json⽂件编码是uft-8。
如果不对编码⽅式进⾏重新设定,就会出现中⽂乱码问题。
把python默认编码从ascii转到uft-8的代码是固定的。
把这段代码放在代码前端即可。
我们将要实现的代码前端如图,保证代码⾏的顺序。
(6)txt⽂件写⼊
for item in data['results']:
jname=item ['name']
jlat=item ['location']['lat']
jlon=item ['location']['lng']
jadd=item ['address']
# -*- coding:utf-8 -*
import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
f=open(r'D:\','a')
f.write('zhongxue')
f.close()
# -*- coding:utf-8 -*
shiro jwt
import json #导⼊json库
import os
import urllib2 #导⼊urllib2库
import sys #我知道了,这个东东是为了把默认编码从ascii转到uft-8。
reload(sys)
sys.setdefaultencoding('utf-8')
lat_1=24.390894
lon_1=102.174112
lat_2=26.548645
lon_2=103.678942#坐标范围
las=1#给las⼀个值1
ak='9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO'
keyword='中学'
push=r'D:\'
#我们把变量都放在前⾯,后⾯就不涉及到变量了,如果要爬取别的POI,修改这⼏个变量就可以了,不⽤改代码了。
具有有效target属性的元素f=open(push,'a')
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.map.baidu/place/v2/search?query='keyword'& bounds='+str(lat_b1)+','+str(lon_b1)+','+str(lat_b1+las)+','+str(lon_b1+las)+ response = urllib2.urlopen(url2)
data=json.load(response)
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)
f.close()
说实话,⼀个脚本⾥⾯嵌⼊了四个循环,程序员见了能打⼈,不过能⽤就⾏。
接下来将要进⼊进阶篇教程,在这⾥会涉及到如何获取区域范围,例如昆明市的bounds值;如何更合理的切分矩形;如何简化代码,如何将代码移植到python3中;可否⽤别的⽅式、函数语句获取poi数据;通过什么样的设置可以更⾼效的获取poi;python中⽂乱码的解决⽅式;request、time等模块的应⽤;过程参考资料汇总……
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论