与昨天那样一步一步在jupyter notebook中编写测试代码不同,今天分享的代码,主体部分已经被写到了一个函数当中,这样如果需要抓取一个新的区域只需要调用函数即可。当然这些代码仍然可以在jupyter notebook中运行,待会儿你看到的代码运行测试结果就是在jupyter中进行展示的。
运行环境:安装anaconda3即可,这是一个Python3的打包发行版。新手可查看之前的几篇文章:
欢迎大家加入小编创建的Python行业交流群,有大牛答疑,有资源共享,有企业招人!是一个非常不错的交流基地!群号:683380553
#导入需要使用的Python库
importrequests
importjson
importre
importpandasaspd
#--------------------------------------------- #
#定义从百度地图获取区域边界点经纬度的函数 #
#--------------------------------------------- #
defgetRegion_baidu(keyword):
#
获取uid的网址格式uidUrl="http://map.baidu.com/su?wd={}&cid=289&type=0&pc_ver=2"#通过格式化函数得到网址,并进行抓取r_uid=requests.get(uidUrl.format(keyword),
headers={'user-agent':'Mozilla/5.0'})
#编码转换r_uid.encoding='utf-8'#使用正则表达式提取内容uids=re.findall('[a-zA-Z0-9]{24}', r_uid.text)
#用来保存区域边缘的点的经纬度lat_lng=[]
#循环每一个子区域foruidinuids:
#把网页上的数据抓取到本地poinstUrl='http://map.baidu.com/?pcevaname=pc4.1&qt=ext&uid=
{}&ext_ver=new&l=12'
r_point=requests.get(poinstUrl.format(uid),
headers={'user-agent':'Mozilla/5.0'}) r_point.encoding='ascii'#转换为python字典类型jd=json.loads(r_point.text)
#使用正则表达式进行提取points=re.findall('[0-9]{8}.[0-9]+,[0-9]{7}.[0-9]+',
jd['content']['geo']) sub_lat_lng=[]
#
将中间都逗号去掉forstrinpoints:
#将经纬度分开,并得到实际的经纬度temp=str.split(',') temp[0]=round(float(temp[0])/100000,6) temp[1]=round(float(temp[1])/100000,6) sub_lat_lng.append(temp)
# 转换成dataframelat_lng.append(sub_lat_lng) df=pd.DataFrame(lat_lng[0],columns=['longitude','latitude']) df['name']=keyword
# 返回结果returndf
然后我们可以把这整段代码放在jupyter notebook中,运行,测试一下能否抓取到结果,这里我抓到了结果。
你还可以使用这个函数去抓另外一个区域,比如华南理工大学,通过这种函数的形式,把中间过程封装起来,使用的时候进行调用即可,非常方便。
注意:百度地图上并不能查到现实中存在的所有区域,因此有些区域是抓不到结果的哦~
我将在下一篇文章中,对这段代码中使用的知识点进行更进一步详细的解释,因为今天有点不舒服,所以写的不多。
网友评论