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()); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }