def post(self, mmsi, **kwargs): if self.connet_count <= 5: try: return self.request.post(**kwargs) except Exception as E: ship_logger.error('当前第{}次请求MMSI:{}时,发生错误:{}'.format( self.connet_count, mmsi, E)) self.connet_count += 1 return self.post(mmsi, **kwargs) else: ship_logger.error('MMSI:{}已达到最大连接次数,准备放进二号队列'.format(mmsi)) return
def get_ais_info(self, mmsi): """获取船舶AIS信息 :param mmsi: :return: 返回船舶AIS信息(字典格式) """ time.sleep(random.randint(3, 5)) data = {'mmsi': mmsi} # r= self.request.post(url=SHIP_INFO_API,data=data) req = Request(request=self.request) # 创建Request对象 r = req.post(mmsi=mmsi, url=SHIP_INFO_API, data=data, timeout=60) if r: if r.status_code == 200: try: ship_msg = json.loads(r.content.decode()) res_status = ship_msg.get('status') ship_data = ship_msg.get('data') # 列表套一个字典 if res_status == 0: # todo 表示账号未封停 if ship_data: # 表示能查询到该船舶 if isinstance(ship_data, list): ship_info = ship_data[0] # 取字典 return ship_info elif isinstance(ship_data, dict): return ship_data else: ship_logger.info('无效的MMSI:{}'.format(mmsi)) else: ship_logger.critical( '目前账号:{},获取MMSI:{}时,可能被封停或者Cookies已失效'.format( self.username, mmsi)) return '账号异常' except: ship_logger.critical( '当前账号:{},请求MMSI:{}对应的AIS数据失败,请求url:{},返回内容:{}'.format( self.username, mmsi, r.url, r.content.decode())) self.db.push_mmsi(mmsi) return '账号异常' else: ship_logger.error('请求MMSI:{}的AIS数据失败,返回状态码为:{}'.format( mmsi, r.status_code)) self.db.push_mmsi(mmsi=mmsi) else: self.db.push_spare_mmsi(mmsi=mmsi) # 放进二号队列
def get_history_track(self, mmsi, start_time, end_time): """ 3.获取轨迹 :param mmsi: :param start_time: :param end_time: :return: 返回船舶轨迹信息(列表套字典,每个字典都是一个航点) """ time.sleep(random.randint(3, 5)) track_url = Track_API.format(mmsi, start_time, end_time) # r = self.request.get(url=track_url) req = Request(request=self.request) # 创建Request对象 r = req.get(mmsi=mmsi, url=track_url, timeout=60) if r: if r.status_code == 200: try: content = json.loads(r.content.decode()) ship_track = content.get('data') # 加密格式的字符串 if ship_track: # 表示有轨迹 ship_track_list = parse_ship_track(ship_track) # 列表套字典 return ship_track_list else: ship_logger.warning('MMSI:{}在时间段{}-{}没有对应的轨迹信息'.format( mmsi, start_time, end_time)) except: ship_logger.critical( '当前账号:{},请求MMSI:{}对应的轨迹失败,请求url:{},返回内容:{}'.format( self.username, mmsi, r.url, r.content.decode())) self.db.push_mmsi(mmsi) return '账号异常' else: ship_logger.error( '请求MMSI:{}在时间段{}-{}对应的轨迹信息失败,返回状态码为,{}'.format( mmsi, start_time, end_time, r.status_code)) self.db.push_mmsi(mmsi=mmsi) else: self.db.push_spare_mmsi(mmsi=mmsi) # 放进二号队列
def get_history_voyage(self, mmsi, start_time, end_time): """查询船舶历史航次信息 :param mmsi: :param start_time: :param end_time: :return: 返回船舶历史航班信息(列表套字典,每个字典就是一个航次) """ time.sleep(random.randint(3, 5)) data = {'mmsi': mmsi, 'btime': start_time, 'etime': end_time} # r = self.request.post(url=HISTORY_VOYAGE_API, data=data) req = Request(request=self.request) # 创建Request对象 r = req.post(mmsi=mmsi, url=HISTORY_VOYAGE_API, data=data, timeout=60) if r: if r.status_code == 200: try: content = json.loads(r.content.decode()) history_voyage = content.get('data') if history_voyage: # 表示有航次 return history_voyage else: ship_logger.warning( 'MMSI:{}暂无航次信息,放进2号队列'.format(mmsi)) self.db.push_spare_mmsi(mmsi=mmsi) except: ship_logger.critical( '当前账号:{},请求MMSI:{}对应的航次失败,请求url:{},返回内容:{}'.format( self.username, mmsi, r.url, r.content.decode())) self.db.push_mmsi(mmsi) return '账号异常' else: ship_logger.error('请求MMSI:{}的航次信息失败,返回状态码为'.format( mmsi, r.status_code)) self.db.push_mmsi(mmsi=mmsi) # 再次放回去 else: self.db.push_spare_mmsi(mmsi=mmsi) # 放进二号队列