张家界建设网站,untitled怎么做网页,山东网页制作网站,临海市住房与城乡建设规划局 网站1.数据接口#xff1a;本次使用百度地图开放平台中的地点检索API来获取城市POI数据#xff0c;此次以矩形区域检索为例。2.获取思路#xff1a;因为百度出于数据保护目的#xff0c;单次访问服务最多同时返回400条数据#xff0c;不过官方也给出了解决方案#xff0c;即通…1.数据接口本次使用百度地图开放平台中的地点检索API来获取城市POI数据此次以矩形区域检索为例。2.获取思路因为百度出于数据保护目的单次访问服务最多同时返回400条数据不过官方也给出了解决方案即通过添加分类、设置范围等方式从而缩小检索范围满足数据获取要求。要想获取一个大的矩形区域内的数据就需要先将大区域划分成一个个的小区域然后通过小区域范围去访问接口获取数据。3.代码示例import requestsimport jsonimport timeimport pandas as pd# 构建URL访问API部分class BaiduPoi(object):def __init__(self, query, loc, ak): # query:行业分类loc:检索的位置坐标ak服务秘钥self.query queryself.loc locself.ak ak# 构建访问URLdef urls(self):urls []for i in range(0, 20):url http://api.map.baidu.com/place/v2/search?query self.query bounds self.loc page_size20page_num str(i) outputjsonak self.akurls.append(url)return urls# 访问APIP获取数据def get_data(self):for i, url in enumerate(self.urls()):try:# print(i,url)js requests.get(url).textdata json.loads(js)if data[total] ! 0:for item in data[results]:js {}js[一级行业] h1js[二级行业] h2js[name] item[name]js[lat] item[location][lat]js[lng] item[location][lng]yield jselse:print(url)print(本页及以后无数据)breakexcept:print(出现错误)with open(./log.txt, a) as fl:fl.write(url\n)# 大网格划分成小网格部分class LocalDiv(object):def __init__(self, loc_all,divd): # loc_all为构建访问url中的左下角(西南)坐标和右上角(东北)坐标(bounds39.915,116.404,39.975,116.414)divd分割网格大小self.loc_all loc_allself.divd divd# 划分纬度def lat_all(self):lat_sw float(self.loc_all.split(,)[0]) # 西南方向纬度lat_ne float(self.loc_all.split(,)[2]) # 东北方向纬度lat_list [str(lat_ne)]while lat_ne - lat_sw 0:m lat_ne - self.divdlat_ne lat_ne - self.divdlat_list.append({:.2f}.format(m))return sorted(lat_list)# 划分经度def lng_all(self):lng_sw float(self.loc_all.split(,)[1]) # 西南方向经度lng_ne float(self.loc_all.split(,)[3]) # 东北方向经度lng_list [str(lng_ne)]while lng_ne - lng_sw 0:m lng_ne - self.divdlng_ne lng_ne - self.divdlng_list.append({:.2f}.format(m))return sorted(lng_list)# 将划分的经纬度进行组合def ls_com(self):lat self.lat_all()lng self.lng_all()latlng_list []for i in range(0, len(lat)):a lat[i]for i2 in range(0, len(lng)):b lng[i2]ab a , blatlng_list.append(ab)return latlng_list# 构建每个小网格的西南和东北点的坐标对def ls_row(self):lat self.lat_all()lng self.lng_all()latlng_list self.ls_com()ls []for n in range(0, len(lat) - 1):for i in range(len(lng) * n, len(lng) * (n 1) - 1):coor_a latlng_list[i]coor_b latlng_list[i len(lng) 1]coor coor_a , coor_bls.append(coor)return lsif __name__ __main__:# 行业划分,根据需要可以自己构建行业划分标准pois {商业: [酒店, 购物....],教育: [高等院校, 中学, 小学, 幼儿园, ......],。。。。。。}print(----------开始爬取数据----------)start_time time.time()loc LocalDiv(填写要查询的坐标范围(例31.131387,121.413508,31.343321,121.540564), 0.01) # 查询范围坐标,网格大小现在采取0.01度进行分割locs_to_use loc.ls_row()for h1, v in pois.items():print(爬取, h1)file_name ./baidu_poi_{}.csv.format(h1)for loc in locs_to_use:for h2 in v: # 获取二级行业par BaiduPoi(h2, loc, akak值)dt par.get_data()df pd.DataFrame(dt)if len(df) ! 0:print(df)df.to_csv(file_name,header0,indexFalse,encodingutf_8_sig,modea)time.sleep(1)else:passend_time time.time()print(所有poi数据已经爬取完毕共耗时{:.2f}秒.format(end_time - start_time))