Esempio n. 1
0
    def deal_with_data(self):
        '''
        得到需求数据
        :return:
        '''
        data = self.result_data
        # pprint(data)
        if data != {}:
            taobao = TaoBaoLoginAndParse(logger=self.my_lg)
            goods_id = data['goods_id']
            # 天猫类型
            tmall_type = data.get('type', 33)  # 33用于表示无法正确获取
            # self.my_lg.info(str(tmall_type))

            # 店铺名称
            shop_name = data['seller'].get('shopName', '')  # 可能不存在shopName这个字段

            # 掌柜
            account = data['seller'].get('sellerNick', '')

            # 商品名称
            title = data['item']['title']
            # 子标题
            sub_title = data['item'].get('subtitle', '')
            sub_title = re.compile(r'\n').sub('', sub_title)
            # 店铺主页地址
            # shop_name_url = 'https:' + data['seller']['taoShopUrl']
            # shop_name_url = re.compile(r'.m.').sub('.', shop_name_url)  # 手机版转换为pc版

            # 商品价格
            # price = data['apiStack'][0]['value']['price']['extraPrices'][0]['priceText']
            tmp_taobao_price = data['apiStack'][0].get(
                'value', '').get('price').get('price').get('priceText', '')
            tmp_taobao_price = tmp_taobao_price.split(
                '-')  # 如果是区间的话,分割成两个,单个价格就是一个
            # self.my_lg.info(str(tmp_taobao_price))
            if len(tmp_taobao_price) == 1:
                # 商品最高价
                # price = Decimal(tmp_taobao_price[0]).__round__(2)     # json不能处理decimal所以后期存的时候再处理
                price = tmp_taobao_price[0]
                # 商品最低价
                taobao_price = price
                # self.my_lg.info(str(price))
                # self.my_lg.info(str(taobao_price))
            else:
                # price = Decimal(tmp_taobao_price[1]).__round__(2)
                # taobao_price = Decimal(tmp_taobao_price[0]).__round__(2)
                price = tmp_taobao_price[1]
                taobao_price = tmp_taobao_price[0]
                # self.my_lg.info(str(price))
                # self.my_lg.info(str(taobao_price))

            # 商品库存
            goods_stock = data['apiStack'][0]['value'].get('skuCore', {}).get(
                'sku2info', {}).get('0', {}).get('quantity', '')

            # 商品标签属性名称,及其对应id值
            detail_name_list, detail_value_list = taobao._get_detail_name_and_value_list(
                data=data)
            '''
            每个标签对应值的价格及其库存
            '''
            price_info_list = taobao._get_price_info_list(
                data=data, detail_value_list=detail_value_list)

            # 所有示例图片地址
            all_img_url = taobao._get_all_img_url(
                tmp_all_img_url=data['item']['images'])
            # self.my_lg.info(str(all_img_url))

            # 详细信息p_info
            p_info = taobao._get_p_info(tmp_p_info=data.get('props').get(
                'groupProps'))  # tmp_p_info 一个list [{'内存容量': '32GB'}, ...]
            if p_info != []:
                p_info = [{
                    'id': 0,
                    'name': _i.get('p_name', ''),
                    'value': _i.get('p_value', ''),
                } for _i in p_info]
            '''
            div_desc
            '''
            # 手机端描述地址
            if data.get('item', {}).get('taobaoDescUrl') is not None:
                phone_div_url = 'https:' + data['item']['taobaoDescUrl']
            else:
                phone_div_url = ''

            # pc端描述地址
            if data.get('item', {}).get('taobaoPcDescUrl') is not None:
                pc_div_url = 'https:' + data['item']['taobaoPcDescUrl']
                # self.my_lg.info(phone_div_url)
                # self.my_lg.info(pc_div_url)

                div_desc = taobao.get_div_from_pc_div_url(pc_div_url, goods_id)
                # self.my_lg.info(div_desc)
                if div_desc == '':
                    self.my_lg.error('该商品的div_desc为空! 出错goods_id: %s' %
                                     str(goods_id))
                    self.result_data = {}
                    return {}

                # self.driver.quit()
                gc.collect()
            else:
                pc_div_url = ''
                div_desc = ''
            '''
            后期处理
            '''
            # 后期处理detail_name_list, detail_value_list
            detail_name_list = [{'spec_name': i[0]} for i in detail_name_list]

            # 商品标签属性对应的值, 及其对应id值
            if data.get('skuBase').get('props') is None:
                pass
            else:
                tmp_detail_value_list = [
                    item['values']
                    for item in data.get('skuBase', '').get('props', '')
                ]
                # self.my_lg.info(str(tmp_detail_value_list))
                detail_value_list = []
                for item in tmp_detail_value_list:
                    tmp = [i['name'] for i in item]
                    # self.my_lg.info(str(tmp))
                    detail_value_list.append(tmp)  # 商品标签属性对应的值
                    # pprint(detail_value_list)

            is_delete = self._get_is_delete(data=data, title=title)
            # self.my_lg.info('is_delete = %s' % str(is_delete))
            if is_delete == 1:
                self.my_lg.info('@@@ 该商品已下架...')

            # 月销量
            try:
                sell_count = str(
                    data.get('apiStack',
                             [])[0].get('value',
                                        {}).get('item',
                                                {}).get('sellCount', ''))
            except:
                sell_count = '0'
                # self.my_lg.info(sell_count)

            try:
                del taobao
            except:
                pass
            result = {
                'shop_name': shop_name,  # 店铺名称
                'account': account,  # 掌柜
                'title': title,  # 商品名称
                'sub_title': sub_title,  # 子标题
                'price': price,  # 商品价格
                'taobao_price': taobao_price,  # 淘宝价
                'goods_stock': goods_stock,  # 商品库存
                'detail_name_list': detail_name_list,  # 商品标签属性名称
                'detail_value_list': detail_value_list,  # 商品标签属性对应的值
                'price_info_list': price_info_list,  # 要存储的每个标签对应规格的价格及其库存
                'all_img_url': all_img_url,  # 所有示例图片地址
                'p_info': p_info,  # 详细信息标签名对应属性
                'pc_div_url': pc_div_url,  # pc端描述地址
                'div_desc': div_desc,  # div_desc
                'sell_count': sell_count,  # 月销量
                'is_delete': is_delete,  # 是否下架判断
                'type': tmall_type,  # 天猫类型
            }
            # pprint(result)
            # self.my_lg.info(str(result))
            # wait_to_send_data = {
            #     'reason': 'success',
            #     'data': result,
            #     'code': 1
            # }
            # json_data = json.dumps(wait_to_send_data, ensure_ascii=False)
            # print(json_data)
            gc.collect()
            return result

        else:
            self.my_lg.info('待处理的data为空的dict, 该商品可能已经转移或者下架')
            # return {
            #     'is_delete': 1,
            # }
            return {}
Esempio n. 2
0
    def deal_with_data(self):
        """
        得到需求数据
        :return:
        """
        data = self.result_data
        # pprint(data)
        if data == {}:
            return self._data_error_init()

        taobao = TaoBaoLoginAndParse(
            logger=self.lg,
            is_real_times_update_call=self.is_real_times_update_call)
        goods_id = data['goods_id']
        # 天猫类型
        tmall_type = data.get('type', 33)  # 33用于表示无法正确获取
        # 可能不存在shopName这个字段
        shop_name = data['seller'].get('shopName', '')
        account = data['seller'].get('sellerNick', '')
        title = data['item']['title']
        sub_title = data['item'].get('subtitle', '')
        if sub_title is None:
            # 处理tm 2版为None的情况
            sub_title = ''
        else:
            pass
        sub_title = re.compile(r'\n').sub('', sub_title)

        price, taobao_price = taobao._get_price_and_taobao_price(data=data)
        # 商品库存
        goods_stock = data['apiStack'][0]['value']\
            .get('skuCore', {})\
            .get('sku2info', {})\
            .get('0', {})\
            .get('quantity', '')
        # 商品标签属性名称,及其对应id值
        detail_name_list, detail_value_list = taobao._get_detail_name_and_value_list(
            data=data)

        # 上下架判断放在这里避免已下架的不进行taobao_price为空断言判断
        is_delete = self._get_is_delete(data=data, title=title)
        # self.lg.info('is_delete: {}'.format(is_delete))
        try:
            # 每个标签对应值的价格及其库存
            price_info_list = taobao._get_price_info_list(
                data=data,
                detail_value_list=detail_value_list,
                is_delete=is_delete,
            )
            # 多规格进行重新赋值
            price, taobao_price = taobao._get_new_price_and_taobao_price_when_price_info_list_not_null_list(
                price_info_list=price_info_list,
                price=price,
                taobao_price=taobao_price,
                is_delete=is_delete)
        except Exception:
            self.lg.error('遇到错误[goods_id: {}]:'.format(goods_id),
                          exc_info=True)
            return self._data_error_init()

        # 所有示例图片地址
        all_img_url = taobao._get_all_img_url(
            tmp_all_img_url=data['item']['images'])
        # self.lg.info(str(all_img_url))

        # tmp_p_info 一个list [{'内存容量': '32GB'}, ...]
        p_info = taobao._get_p_info(
            tmp_p_info=data.get('props').get('groupProps'))
        if p_info != []:
            p_info = [{
                'id': 0,
                'name': _i.get('p_name', ''),
                'value': _i.get('p_value', ''),
            } for _i in p_info]
        """div_desc"""
        div_desc = taobao.get_div_from_pc_div_url(goods_id=goods_id)
        # self.lg.info(div_desc)
        if div_desc == '':
            self.lg.error('该商品的div_desc为空! 出错goods_id: {}'.format(goods_id))
            return self._data_error_init()
        else:
            pass
        """后期处理"""
        # 后期处理detail_name_list, detail_value_list
        detail_name_list = [{
            'spec_name': i[0],
            'img_here': i[2],
        } for i in detail_name_list]

        # 商品标签属性对应的值, 及其对应id值
        if data.get('skuBase').get('props') is None:
            pass
        else:
            tmp_detail_value_list = [
                item['values']
                for item in data.get('skuBase', '').get('props', '')
            ]
            # self.lg.info(str(tmp_detail_value_list))
            detail_value_list = []
            for item in tmp_detail_value_list:
                tmp = [i['name'] for i in item]
                # self.lg.info(str(tmp))
                detail_value_list.append(tmp)  # 商品标签属性对应的值
                # pprint(detail_value_list)

        # 月销量
        sell_count = '0'
        try:
            sell_count = str(
                data.get('apiStack',
                         [])[0].get('value', {}).get('item',
                                                     {}).get('sellCount', ''))
            # self.lg.info(sell_count)
        except:
            pass
        if target_str_contain_some_char_check(
                target_str=title, check_char_obj=CONTRABAND_GOODS_KEY_TUPLE):
            self.lg.info('违禁物品下架...')
            is_delete = 1
        else:
            pass

        try:
            del taobao
        except:
            pass
        result = {
            'shop_name': shop_name,  # 店铺名称
            'account': account,  # 掌柜
            'title': title,  # 商品名称
            'sub_title': sub_title,  # 子标题
            'price': price,  # 商品价格
            'taobao_price': taobao_price,  # 淘宝价
            'goods_stock': goods_stock,  # 商品库存
            'detail_name_list': detail_name_list,  # 商品标签属性名称
            'detail_value_list': detail_value_list,  # 商品标签属性对应的值
            'price_info_list': price_info_list,  # 要存储的每个标签对应规格的价格及其库存
            'all_img_url': all_img_url,  # 所有示例图片地址
            'p_info': p_info,  # 详细信息标签名对应属性
            'div_desc': div_desc,  # div_desc
            'sell_count': sell_count,  # 月销量
            'is_delete': is_delete,  # 是否下架判断
            'type': tmall_type,  # 天猫类型
        }
        # pprint(result)
        # self.lg.info(str(result))
        # wait_to_send_data = {
        #     'reason': 'success',
        #     'data': result,
        #     'code': 1
        # }
        # json_data = dumps(wait_to_send_data, ensure_ascii=False)
        # print(json_data)
        return result