class Control(WatchGuard): def __init__(self, user_product): super(Control, self).__init__(user_product) self.product_obj_list = [] self.log = Log('control') def save_performance_data(self): """ @summary 存储产品的performance数据 :return:None """ self.save_product_obj() # 遍历每个产品对象,获取所以的产品数据存以列表形式放在all_data中 all_data = [] for probj in self.product_obj_list: pf = probj.get_product_performance() all_data.append(pf) # 对all_data中的字典按照键值 Firewall Throughput 进行升排序, # 因为Firewall Throughput单位全部换算成以K为单位的数字,对应键值flag_number, # 所以这里以flag_number排序. all_data.sort(key=lambda x: x['flag_number'], reverse=False) title = [] value = [] for i, data in enumerate(all_data): temp = [] for k, v in data.items(): if not k == "flag_number": if i == 0: title.append(k) temp.append(v) value.append(temp) # 调用view层进行写文件 file_name = "..\\data\\performance.csv" visual = Visual(file_name) visual.write_to_csv(title, value) self.log.debug("存储产品performance数据完成, 结果在data文件下的performance.csv") def save_product_obj(self): """ @summary 采用多线程获取存储产品对象【如果产品数量过多,则要限制多线程,防止服务器忙于过多请求, 具体限制数量根据网站性能和要求给出】 :return:None """ user_prd = self.choose_product() thread_list = [] for prd in user_prd: name = prd['name'] pid = prd['id'] self.thread_action(name, pid) th = Thread(target=self.thread_action, args=(name, pid)) thread_list.append(th) for thread in thread_list: thread.start() for thread in thread_list: thread.join(60) def thread_action(self, name, pid): prd = self.get_product_obj(name, pid) self.product_obj_list.append(prd)
class WatchGuard(object): def __init__(self, user_product): self.compare_url = COMPARE_URL self.user_product = user_product self.log = Log('watchGuard') def choose_product(self): """ @summary 获取指定的产品列表 :return: data: [list] ,返回一个列表,其中元素是字典包含设备name和id """ data = [] page_text = connection.open_url(self.compare_url) soup = BeautifulSoup(page_text, 'lxml') select_tag = soup.find_all('select', attrs={'name': 'p1'})[0] optgroup = select_tag.find_all('optgroup') # 遍历下拉框选择Firebox M Series、Firebox T Series型号的设备id for group in optgroup: label = str(group.get('label').encode('utf-8')) if label in self.user_product: # 获取到该型号的option标签列表 option_list = group.find_all('option') for opt in option_list: name = str(opt.text.encode('utf-8')) value = str(opt.get('value')) data.append({'name': name, 'id': value}) self.log.debug("选取用户特定产品型号完成") return data def get_product_obj(self, name, pid): """ 获取产品对象 :return: Product 对象 """ url = COMPARE_URL + "/%s/%s/%s" % (pid, pid, pid) page = connection.open_url(url) prd = Product(name, page) short_name = name.split(' ')[-1] self.log.debug('%s 实例化产品对象完成' % short_name) return prd