python3异步task_python3 异步-协程版:常用高德方法总结

1 classMethod:2 def __init__(self):3 self.keys =KEY()4 self.k =self.keys.random_key()5 self.event_loop =asyncio.get_event_loop()6

7 #访问网址

8 async defget_response(self, base_url_, params_):9 """

10 :param base_url_: 网址11 :param params_: 访问网址的参数字典12 :return: 访问网址的响应内容13 """

14 async with ClientSession(connector=TCPConnector(verify_ssl=False)) as session:15 whileTrue:16 try:17 async with session.get(base_url_, params=params_) as r:18 response_ =await r.json()19 infocode = int(response_['infocode'])20 if infocode == 10000:21 returnresponse_22 else:23 print(infocode)24 print("切换key,重新查询中")25 self.k =self.keys.random_key()26 params_['key'] =self.k27 exceptclient_exceptions.ClientConnectorError:28 print('wait a moment')29 for i in range(60, 0, -1):30 print("倒计时{}秒".format(i), flush=True, end="\b" * 10)31 time.sleep(1)32 exceptException as e:33 print(e)34 for i in range(60, 0, -1):35 print("倒计时{}秒".format(i), flush=True, end="\b" * 10)36 time.sleep(1)37

38 #gps坐标转化高德坐标

39 defexchange(self, coordinate):40 """

41 :param coordinate: 坐标 经度,纬度|经度,纬度……42 :return: 高德坐标43 """

44 base_url = 'https://restapi.amap.com/v3/assistant/coordinate/convert'

45 task =[]46 for c incoordinate:47 _params_ = {'locations': c, 'coordsys': 'gps', 'output': 'json', 'key': self.k}48 task.append(self.get_response(base_url, _params_))49

50 response = self.event_loop.run_until_complete(asyncio.gather(*task))51 result =[]52 for r inresponse:53 result.append(r['locations'])54 returnresult55

56 #获取行政区信息

57 def get_region(self, coordinate_array, batch=False):58 """

59 :param coordinate_array: 坐标数组 【"经度,纬度",……】60 :param batch: 批量查询61 :return: 省,市,区(县),详细地址62 """

63

64 #坐标转换

65 coordinate =[]66 for c incoordinate_array:67 coordinate +=[c]68 coordinate =self.exchange(coordinate)69

70 task =[]71 for c incoordinate:72 base_url = 'https://restapi.amap.com/v3/geocode/regeo'

73 _params_ = {'location': c, 'extensions': 'all',74 'output': 'json', 'key': self.k, 'batch': str(batch).lower()}75 task.append(self.get_response(base_url, _params_))76 response_array = self.event_loop.run_until_complete(asyncio.gather(*task))77

78 for response inresponse_array:79 if notbatch:80 province = response['regeocode']['addressComponent']['province']81 city = response['regeocode']['addressComponent']['city']82 district = response['regeocode']['addressComponent']['district']83 address = response['regeocode']['formatted_address']84 pois = [[r['type'].split(';')[0], float(r['distance'])] for r in response['regeocode']['pois'][:3]]85

86 yieldprovince, city, district, address, pois87 else:88 regeocodes = response['regeocodes']89 result =[]90 for r inregeocodes:91 r['pois'] = sorted(r['pois'], key=lambda x: x['distance'])92 result.append(93 (94 r['addressComponent']['province'],95 r['addressComponent']['city'],96 r['addressComponent']['district'],97 r['formatted_address'],98 [[i['type'].split(';')[0], float(i['distance'])] for i in r['pois'][:3]]99 )100 )101 yieldresult102

103 #获取POI信息(多边形搜索--矩形搜索)

104 def get_poi(self, coordinate_array, lon_gap, lat_gap, poi_type, output_poiname=False):105 """

106 :param coordinate: 【【经度,纬度】,【经度,纬度】】 矩形的中心经纬度107 :param lon_gap: 矩形经度间隔108 :param lat_gap: 矩形纬度间隔109 :param poi_type: 查询POI类型110 :param output_poiname: 输出POI name111 :return: 相应poi数量112 """

113 #坐标转换

114 coordinate =[]115 for c incoordinate_array:116 coordinate += [c[0]-lon_gap/2, c[1]+lat_gap/2, c[0]+lon_gap/2, c[1]-lat_gap/2]117 coordinate =self.exchange(coordinate)118

119 base_url = 'https://restapi.amap.com/v3/place/polygon'

120

121 task =[]122 for i in range(0, len(coordinate), 4):123 params = {'polygon': '{},{}|{},{}'.format(coordinate[i], coordinate[i+1], coordinate[i+2], coordinate[i+3]),124 'types': poi_type, 'output': 'json', 'key': self.keys.random_key(), 'page': 1, 'offset': 20}125

126 task.append(self.get_response(base_url, params))127 response = self.event_loop.run_until_complete(asyncio.gather(*task))128

129 for r inresponse:130 n = int(r['count'])131 task =[]132 ifoutput_poiname:133 print('Crawling POI {} name'.format(poi_type))134 name = ['{}({})'.format(e['name'], e['typecode']) for e in r['pois']]135 while params['page'] < ceil(n/20):136 params['page'] += 1

137 task.append(self.get_response(base_url, params))138 result = self.event_loop.run_until_complete(asyncio.gather(*task))139 for res inresult:140 name += ['{}({})'.format(e['name'], e['typecode']) for e in res['pois']]141

142 yieldn, name143 else:144 yieldn145

146 defget_distance(self, coordinate_array):147 """

148 :param coordinate_array: [o_lon, o_lat, d_lon, d_lat]149 :return:150 """

151 #坐标转换

152 coordinate =[]153 for c incoordinate_array:154 coordinate +=c155 coordinate =self.exchange(coordinate)156

157 base_url = 'https://restapi.amap.com/v3/direction/driving'

158 task =[]159

160 for i in range(0, len(coordinate), 2):161 parameters ={162 'key': self.keys.random_key(), 'strategy': 2, 'nosteps': 1, 'extensions': 'base',163 'origin': coordinate[i],164 'destination': coordinate[i+1]165 }166 task.append(self.get_response(base_url, parameters))167 response = self.event_loop.run_until_complete(asyncio.gather(*task))168

169 for r inresponse:170 yield float(r['route']['paths'][0]['distance'])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值