1 classMethod:2 def __init__(self):3 self.keys =KEY()4 self.k =self.keys.get_key()5
6 #访问网址
7 defget_response(self, base_url_, params_):8 """
9 :param base_url_: 网址10 :param params_: 访问网址的参数字典11 :return: 访问网址的响应内容12 """
13 whileTrue:14 try:15 response_ =requests.get(base_url_, params_)16 response_ =response_.json()17 infocode = int(response_['infocode'])18 if infocode != 10000:19 print(infocode, self.k)20 self.k =self.keys.next_key()21 params_['key'] =self.k22 else:23 break
24 exceptrequests.exceptions.ConnectionError:25 print('wait a moment')26 for i in range(60, 0, -1):27 print("倒计时{}秒".format(i), flush=True, end="\b"*5)28 time.sleep(1)29 exceptException as e:30 print(e)31 returnresponse_32
33 #gps坐标转化高德坐标
34 defexchange(self, coordinate):35 """
36 :param coordinate: 坐标 经度,纬度|经度,纬度……37 :return: 高德坐标38 """
39 base_url = 'https://restapi.amap.com/v3/assistant/coordinate/convert'
40 _params_ = {'locations': coordinate, 'coordsys': 'gps', 'output': 'json', 'key': self.k}41
42 return self.get_response(base_url, _params_)['locations'].replace(';', '|')43
44 #获取行政区信息
45 def get_region(self, *args, coordinate='', batch=False):46 """
47 :param coordinate: 坐标字符串48 :param args: 坐标 经度,纬度|经度,纬度……49 :param batch: 批量查询50 :return: 省,市,区(县),详细地址51 """
52 if coordinate == '':53 temp =[]54 for i in range(0, len(args), 2):55 temp.append('{},{}'.format(args[i], args[i+1]))56 str_coordinate = '|'.join(temp)57 else:58 str_coordinate =coordinate59
60 base_url = 'https://restapi.amap.com/v3/geocode/regeo'
61 _params_ = {'location': self.exchange(str_coordinate), 'extensions': 'all',62 'output': 'json', 'key': self.k, 'batch': str(batch).lower()}63
64 response =self.get_response(base_url, _params_)65
66 if notbatch:67 province = response['regeocode']['addressComponent']['province']68 city = response['regeocode']['addressComponent']['city']69 district = response['regeocode']['addressComponent']['district']70 address = response['regeocode']['formatted_address']71 pois = [[r['type'].split(';')[0], float(r['distance'])] for r in response['regeocode']['pois'][:3]]72
73 returnprovince, city, district, address, pois74 else:75 regeocodes = response['regeocodes']76 result =[]77 for r inregeocodes:78 result.append(79 (80 r['addressComponent']['province'],81 r['addressComponent']['city'],82 r['addressComponent']['district'],83 r['formatted_address'],84 [[i['type'].split(';')[0], float(i['distance'])] for i in r['pois'][:3]]85 )86 )87 returnresult88
89 #获取POI信息(多边形搜索--矩形搜索)
90 def get_poi(self, lon, lat, lon_gap, lat_gap, poi_type, output_poiname=False):91 """
92 :param lon: 矩形中心经度93 :param lat: 矩形中心纬度94 :param lon_gap: 矩形经度间隔95 :param lat_gap: 矩形纬度间隔96 :param poi_type: 查询POI类型97 :param output_poiname: 输出POI name98 :return: 相应poi数量99 """
100 base_url = 'https://restapi.amap.com/v3/place/polygon'
101 params = {'polygon': self.exchange('{},{}|{},{}'.102 format(lon-lon_gap/2, lat+lat_gap/2, lon+lon_gap/2, lat-lat_gap/2)),103 'types': poi_type, 'output': 'json', 'key': self.k, 'page': 1, 'offset': 20}104
105 response =self.get_response(base_url, params)106 n = int(response['count'])107
108 ifoutput_poiname:109 print('Crawling POI {} name'.format(poi_type))110 name = ['{}({})'.format(e['name'], e['typecode']) for e in response['pois']]111 while params['page'] < ceil(n/20):112 params['page'] += 1
113 name += ['{}({})'.format(e['name'], e['typecode']) for e in self.get_response(base_url, params)['pois']]114
115 returnn, name116 else:117 returnn118
119 defget_distance(self, o_lon, o_lat, d_lon, d_lat):120 base_url = 'https://restapi.amap.com/v3/direction/driving'
121 parameters ={122 'key': self.k, 'strategy': 2, 'nosteps': 1, 'extensions': 'base',123 'origin': self.exchange('{},{}'.format(o_lon, o_lat)),124 'destination': self.exchange('{},{}'.format(d_lon, d_lat))125 }126
127 response =self.get_response(base_url, parameters)128
129 return float(response['route']['paths'][0]['distance'])