Exemple #1
0
        public string CreateBody(Dictionary <ThirdPartInventoryEntity, TaobaoProduct> InventoryQtyNotEquels)
        {
            if (InventoryQtyNotEquels == null || InventoryQtyNotEquels.Count == 0)
            {
                return(string.Empty);
            }
            StringBuilder sb = new StringBuilder();

            foreach (ThirdPartInventoryEntity entity in InventoryQtyNotEquels.Keys)
            {
                TaobaoProduct product = InventoryQtyNotEquels[entity];
                sb.Append("<tr>");
                sb.Append(string.Format("<td>{0}</td>", entity.ProductMappingSysno));
                sb.Append(string.Format("<td>{0}</td>", entity.ProductSysNo));
                sb.Append(string.Format("<td>{0}</td>", entity.SKU));
                sb.Append(string.Format("<td>{0}</td>", product.ProductID));
                sb.Append(string.Format("<td style='color:red'>{0}</td>", entity.InventoryOnlineQty));
                sb.Append(string.Format("<td>{0}</td>", entity.OldInventoryAlamQty));
                sb.Append(string.Format("<td>{0}</td>", entity.InventoryAlamQty));
                sb.Append(string.Format("<td>{0}</td>", entity.Status));
                sb.Append(string.Format("<td style='color:red'>{0}</td>", product.Qty));
                sb.Append(string.Format("<td>{0}</td>", product.Status));
                sb.Append("</tr>");
            }
            return(sb.ToString());
        }
Exemple #2
0
        /// <summary>
        /// 检测Mapping表中有记录,但淘宝没有的商品
        /// </summary>
        /// <returns></returns>
        public List <ThirdPartInventoryEntity> GetTaobaoProductNotExists()
        {
            List <ThirdPartInventoryEntity> list = new List <ThirdPartInventoryEntity>();

            foreach (ThirdPartInventoryEntity entity in ThirdPartInventoryEntityList)
            {
                TaobaoProduct product = TaobaoProductList.Find(item => item.ProductID == entity.ProductID);
                if (product == null)
                {
                    list.Add(entity);
                }
            }
            return(list);
        }
Exemple #3
0
        /// <summary>
        /// 检测本地库存和淘宝库存不平衡的信息
        /// </summary>
        /// <returns></returns>
        public Dictionary <ThirdPartInventoryEntity, TaobaoProduct> GetInventoryQtyNotEquels()
        {
            Dictionary <ThirdPartInventoryEntity, TaobaoProduct> dic = new Dictionary <ThirdPartInventoryEntity, TaobaoProduct>();

            foreach (ThirdPartInventoryEntity entity in ThirdPartInventoryEntityList)
            {
                TaobaoProduct product = TaobaoProductList.Find(item => item.ProductID == entity.ProductID);
                if (product != null)
                {
                    if (entity.InventoryOnlineQty - (entity.InventoryAlamQty ?? 0) != product.Qty)
                    {
                        if (!dic.ContainsKey(entity))
                        {
                            dic.Add(entity, product);
                        }
                    }
                }
            }
            return(dic);
        }
Exemple #4
0
        /// <summary>
        /// 解析商品节点
        /// </summary>
        /// <param name="modelProduct"></param>
        /// <param name="productDom"></param>
        private TaobaoProduct ResolverProductDom(TaobaoPageJsonResut.Auctions productDom)
        {
            TaobaoProduct modelProduct = null;

            if (null == productDom)
            {
                return(modelProduct);
            }
            modelProduct = new TaobaoProduct();
            try
            {
                //id
                string itemId = productDom.nid;
                if (string.IsNullOrEmpty(itemId))
                {
                    return(modelProduct);//凡是没有id 的商品,要么是广告 要么是其他非正常的商品
                }
                long.TryParse(itemId, out long _ItemId);
                modelProduct.ItemId = _ItemId;

                //title
                modelProduct.Title   = productDom.title;
                modelProduct.ItemUrl = productDom.detail_url.GetHttpsUrl();

                //price
                var priceDom = productDom.view_price;
                if (null != priceDom)
                {
                    decimal.TryParse(priceDom, out decimal _price);
                    modelProduct.Price = _price;
                }
                //pic
                modelProduct.PicUrl = productDom.pic_url.GetHttpsUrl();
                //shop
                string shopId = productDom.user_id;
                long.TryParse(shopId, out long _shopId);
                //modelProduct.ShopId = _shopId;//天猫店铺id 在搜索列表未出现
                modelProduct.SellerId = _shopId;
                modelProduct.ShopUrl  = string.Format("https://store.taobao.com/shop/view_shop.htm?user_number_id={0}", shopId);
                modelProduct.ShopName = productDom.nick;


                //status
                //成交量

                modelProduct.Biz30Day = productDom.view_sales;

                //评论量
                modelProduct.TotalBizRemarkCount = productDom.comment_count;
                modelProduct.RemarkUrl           = productDom.comment_url;

                //卖家地址
                modelProduct.SellerAddress = productDom.item_loc;

                //是否天猫
                if (null != productDom.shopcard)
                {
                    modelProduct.IsTmall = productDom.shopcard.isTmall;
                }
                //是否金牌卖家 运费险等
                if (productDom.icon != null && productDom.icon.Any())
                {
                    foreach (var item in productDom.icon)
                    {
                        if (item.icon_key == "icon-service-jinpaimaijia")
                        {
                            modelProduct.IsGold = true;
                        }
                        else if (item.icon_key == "icon-service-baoxian")
                        {
                            modelProduct.IsHasYunfeiXian = true;
                        }
                        else if (item.icon_key == "icon-service-xinpin")
                        {
                            modelProduct.IsXinPin = true;
                        }
                        else if (item.icon_key == "icon-fest-ifashion")
                        {
                            modelProduct.IsFashion = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                PluginContext.Logger.Error(ex);
            }
            return(modelProduct);
        }
Exemple #5
0
        /// <summary>
        /// 执行内容解析
        /// </summary>
        ///<param name="webArgs"></param>
        /// <param name="content">要解析的内容</param>
        /// <returns>返回需要的字段对应的字典</returns>
        public override Dictionary <string, object> ResolveSearchPageContent(BaseFetchWebPageArgument webArgs, string content)
        {
            var resultBag = new Dictionary <string, object>();

            try
            {
                string jsonData = string.Empty;

                if (content.IndexOf("g_page_config") < 0)
                {
                    return(null);//无效的页面结果数据
                }


                //send request for load other data of first search page
                Task <string> tskSilcedJsonpContent = null;
                if (webArgs.PageIndex == 0)
                {
                    tskSilcedJsonpContent = Task.Factory.StartNew(() =>
                    {
                        string jsonpContent = "";
                        ////1 打开tcp 链接
                        ////2 发送参数
                        ////3 解析结果
                        if (!webArgs.SystemAttachParas.ContainsKey("SoapTcpConnectionString"))
                        {
                            return(jsonpContent);
                        }
                        var connStrConfig = webArgs.SystemAttachParas["SoapTcpConnectionString"] as WebCrawlerConnection;
                        if (null == connStrConfig)
                        {
                            return(jsonpContent);
                        }
                        //重写解析地址-首页的分片jsonp地址
                        string urlOfSlicedJsonp = this.ResolveSlicedSearchPageSilcedUrl(webArgs);
                        webArgs.ResolvedUrl     = new ResolvedSearchUrlWithParas {
                            Url = urlOfSlicedJsonp
                        };
                        using (var conn = new SoapTcpConnection(connStrConfig))
                        {
                            if (conn.State == ConnectionState.Closed)
                            {
                                conn.Open();
                            }

                            //发送soap
                            var soapCmd = new SoapMessage()
                            {
                                Head = CommandConstants.CMD_FetchPage
                            };
                            soapCmd.Body      = JsonConvert.SerializeObject(webArgs);
                            var dataContainer = conn.SendSoapMessage(soapCmd);
                            if (null != dataContainer && dataContainer.Status == 1)
                            {
                                jsonpContent = dataContainer.Result;
                            }
                            else
                            {
                                StringBuilder errMsg = new StringBuilder("抓取网页请求失败!参数:");
                                errMsg.Append(soapCmd.Body);
                                if (null != dataContainer && !string.IsNullOrEmpty(dataContainer.ErrorMsg))
                                {
                                    errMsg.Append(";服务端错误消息:")
                                    .Append(dataContainer.ErrorMsg);
                                }
                                PluginContext.Logger.Error(errMsg.ToString());
                            }
                        }

                        return(jsonpContent);
                    });
                }


                int startPos      = content.IndexOf("g_page_config");
                int endPos        = content.IndexOf("g_srp_loadCss") - startPos;
                var secondContent = content.Substring(startPos, endPos);
                int secStartPos   = secondContent.IndexOf('{');
                int secEndPos     = secondContent.IndexOf("};") - secStartPos + 1;
                jsonData = secondContent.Substring(secStartPos, secEndPos);



                TaobaoPageJsonResut pageJsonObj = JsonConvert.DeserializeObject <TaobaoPageJsonResut>(jsonData);
                if (null == pageJsonObj)
                {
                    return(null);
                }

                if (webArgs.IsNeedResolveHeaderTags == true)
                {
                    var navNode = pageJsonObj.mods.nav;
                    if (null != navNode && null != navNode.data)
                    {
                        var commonNode = navNode.data.common;
                        var advNode    = navNode.data.adv;

                        //解析common节点
                        if (null != commonNode && commonNode.Any())
                        {
                            //1 检测是否有品牌,有的话 解析品牌
                            #region 品牌解析


                            var brandNode = commonNode.FirstOrDefault(x => x.text == "品牌" && x.sub != null);
                            if (null != brandNode && brandNode.sub != null)
                            {
                                var lstBrands = new List <BrandTag>();
                                foreach (var subItem in brandNode.sub)
                                {
                                    var model = new BrandTag();
                                    model.Platform    = SupportPlatformEnum.Taobao;
                                    model.FilterField = "ppath";//使用的过滤字段参数

                                    model.BrandId   = subItem.value;
                                    model.BrandName = subItem.text;
                                    model.CharIndex = PinYin.GetFirstLetter(model.BrandName);
                                    lstBrands.Add(model);
                                }
                                //解析完毕品牌
                                resultBag.Add("Brands", lstBrands);
                            }

                            #endregion
                        }


                        //2其他筛选节点的分析

                        #region tags 解析


                        var lstTags = new List <KeyWordTagGroup>();

                        var otherFilterNode1 = commonNode.Where(x => x.text != "品牌" && x.sub != null);
                        foreach (var itemNode in otherFilterNode1)
                        {
                            //找到归属的组
                            string groupName = itemNode.text;
                            ProcessTags(lstTags, itemNode.sub, groupName);
                        }
                        ////////if (null!= advNode)----高级筛选不要了
                        ////////{
                        ////////    //advNode 的解析
                        ////////    foreach (var itemNode in advNode)
                        ////////    {
                        ////////        //找到归属的组
                        ////////        string groupName = itemNode.text;
                        ////////        ProcessTags(lstTags, itemNode.sub, groupName);
                        ////////    }
                        ////////}

                        resultBag.Add("Tags", lstTags);

                        #endregion
                    }
                }

                #region products  解析
                var lstProducts = new ProductBaseCollection();
                resultBag.Add("Products", lstProducts);

                var itemListNode = pageJsonObj.mods.itemlist;
                if (null != itemListNode && itemListNode.data != null && null != itemListNode.data.auctions)
                {
                    foreach (var itemProduct in itemListNode.data.auctions)
                    {
                        TaobaoProduct modelProduct = this.ResolverProductDom(itemProduct);

                        if (null != modelProduct)
                        {
                            lstProducts.Add(modelProduct);
                        }
                    }
                }

                //淘宝的搜索列表 - 第一页的数据是进行了分片的,在加载html ;36条数据, 后续会进行一次jsonp的请求;加载12条数据
                if (webArgs.PageIndex == 0 && null != tskSilcedJsonpContent)
                {
                    string jsonpContent = tskSilcedJsonpContent.Result;
                    if (!string.IsNullOrEmpty(jsonpContent) && jsonpContent.Contains("API.CustomizedApi"))
                    {
                        int    startIdx         = jsonpContent.IndexOf(':') + 1;
                        int    endIdx           = jsonpContent.Length - startIdx - 3;
                        string pureJsonContent  = jsonpContent.Substring(startIdx, endIdx);
                        var    slicedJsonpResut = JsonConvert.DeserializeObject <TaobaoSlicedJsonpResut>(pureJsonContent);


                        if (null != slicedJsonpResut)
                        {
                            var itemList = slicedJsonpResut.itemlist;
                            if (null != itemList && itemList.auctions != null)
                            {
                                foreach (var itemProduct in itemList.auctions)
                                {
                                    TaobaoProduct modelProduct = this.ResolverProductDom(itemProduct);

                                    if (null != modelProduct)
                                    {
                                        lstProducts.Add(modelProduct);
                                    }
                                }
                            }
                        }
                    }
                }
                #endregion
            }
            catch (Exception ex)
            {
                PluginContext.Logger.Error(ex);
            }
            return(resultBag);// string.Concat("has process input :" + content);
        }