//读取或构造单个产品的基础信息 /// <summary> /// 读取或构造单个产品的基础信息。 /// 包括:标题、价格、销量、产品描述 /// </summary> /// <param name="product">产品</param> /// <param name="requestModel">请求模型</param> private void GetProductBaseInfo(BanggoProduct product, RequestModel requestModel) { #region 得到banggo数据 product.ThrowIfNull(Resource.ExceptionTemplate_MethedParameterIsNullorEmpty.StringFormat( new StackTrace())); requestModel.ThrowIfNull(Resource.ExceptionTemplate_MethedParameterIsNullorEmpty.StringFormat( new StackTrace())); var doc = SysUtils.GetHtmlDocumentByHttpGet(requestModel.Referer,Encoding.UTF8); #endregion #region 获得品牌 HtmlNode selectNodesForProductBrandCode = doc.DocumentNode.SelectSingleNode(Resource.SysConfig_GetBanggoProductBrandCodeXPath); if (selectNodesForProductBrandCode == null) { FileHelper.WriteFileLog("邦购没有的产品.txt", requestModel.GoodsSn); } selectNodesForProductBrandCode.ThrowIfNull(Resource.Exception_XPathGetDataError.StringFormat( new StackTrace())); product.Brand = selectNodesForProductBrandCode.InnerText; #endregion #region 获取产品详细界面的类别 HtmlNode selectNodesForProductCategory = doc.DocumentNode.SelectSingleNode(Resource.SysConfig_GetBanggoProductCategoryXPath); selectNodesForProductCategory.ThrowIfNull(Resource.Exception_XPathGetDataError.StringFormat( new StackTrace())); product.Category = selectNodesForProductCategory.InnerText; #endregion #region 得到banggo的父目录,如 T恤 HtmlNode selectNodeForProductParentCatalog = doc.DocumentNode.SelectSingleNode(Resource.SysConfig_GetBanggoProductParentCatalogXPath); selectNodeForProductParentCatalog.ThrowIfNull(Resource.Exception_XPathGetDataError.StringFormat( new StackTrace())); product.ParentCatalog = selectNodeForProductParentCatalog.InnerHtml; #endregion #region 获得产品目录 HtmlNode selectNodesForProductCatalog = doc.DocumentNode.SelectSingleNode(Resource.SysConfig_GetBanggoProductCatalogXPath); // selectNodesForProductCatalog.ThrowIfNull(Resource.Exception_XPathGetDataError.StringFormat( // new StackTrace())); product.Catalog = selectNodesForProductCatalog != null ? selectNodesForProductCatalog.InnerText : ""; #endregion #region 得到产品描述 //修改获取的HTML img 的SRC URL HtmlNodeCollection imgNodes = doc.DocumentNode.SelectNodes(Resource.SysConfig_GetGoodsModeImgGreyXPath); sbDesc.Clear(); sbDesc.AppendLine(SysConst.PrefixGoodsDesc); sbDesc.AppendLine( "款号:{1} -> Banggo 产品地址:<a href=\"{0}\" target=\"_blank\" title=\"{0}\">{0}</a> <br/>".StringFormat( requestModel.Referer,product.GoodsSn)); #region 这是用html的方式,现在淘宝不支持外链接图片,所以只有用截图的方法 if (imgNodes != null) { sbDesc.AppendLine(GetProductDesc(requestModel, imgNodes, doc, Resource.SysConfig_GoodsDescId)); } else { #region 处理请求HTML 没有grey.gif的情况,以及产品描述节点ID不为Goods_Mode的情况 //有可能是没有grey.gif文件,检查是否有描述结点。如果有,直接返回 var desNode = doc.GetElementbyId(Resource.SysConfig_GoodsDescId); if (desNode != null) { sbDesc.AppendLine(desNode.OuterHtml); } else //说明是该描述id为productinfo_div { //检查是否有grey.gif文件 imgNodes = doc.DocumentNode.SelectNodes( Resource.SysConfig_GetProductInfoImgGreyXPath); if (imgNodes != null) { sbDesc.AppendLine(GetProductDesc(requestModel, imgNodes, doc, Resource.SysConfig_ProductInfoId)); } else { //检查是否有productinfo_div结点 var descNode = doc.GetElementbyId(Resource.SysConfig_ProductInfoId); if (descNode != null) { sbDesc.AppendLine(descNode.OuterHtml); } else { sbDesc.AppendLine("详情到:" + requestModel.Referer); } } } #endregion } #endregion product.Desc = ModifyGoodsDetailsCss(sbDesc.ToString()); //todo截图没有实现 /* var lstFile = new List<FileItem>(); using (var bitmap = CaputureHtmlElement.CaptureBanggo(requestModel.Referer)) { var fileItem = new FileItem("{0}Detail.jpg".StringFormat(product.GoodsSn),ImageHelper.SetBitmapToBytes(bitmap,System.Drawing.Imaging.ImageFormat.Jpeg)); lstFile.Add(fileItem); } product.GoodsDetailPic = lstFile;*/ #endregion }
//得到该商品的价格和销量信息 private static void GetPriceAndSalesVolume(BanggoProduct product, HtmlDocument doc) { product.SalePrice = GetSalePrice(doc); product.VipPrice = GetVipPrice(doc); product.SvipPrice = GetSvipPrice(doc); product.MarketPrice = GetMarketPrice(doc); // ReSharper disable CompareOfFloatsByEqualityOperator if (product.MarketPrice == 0) // ReSharper restore CompareOfFloatsByEqualityOperator { product.MarketPrice = product.SalePrice; } product.SalesVolume = GetSalesVolume(doc); }
/// <summary> /// 得到可售商品Sku /// </summary> /// <param name="product">产品</param> /// <param name="requestModel">请求模型</param> public void GetProductSku(Product product, RequestModel requestModel) { BanggoProduct banggoProduct; bool isError = false; try//如果该对象以前是父类,那么此时就直接强制转换,如果不是都重新new一个子类,然后进行赋值 { banggoProduct = (BanggoProduct) product; } catch (Exception) { isError = true; banggoProduct = new BanggoProduct(); Util.CopyModel(product, banggoProduct); } var doc = GetProductSkuBase(banggoProduct, requestModel); banggoProduct.ColorList = GetProductColorByOnline(requestModel, doc); if (isError) //如果是new的一个新对象,那么,就要把在GetProductSkuBase,GetProductColorByOnline中获取到的值,赋给product对象 { Util.CopyModel(banggoProduct,product); } }
/// <summary> /// 得到SKU基本信息不包括,颜色和尺码, 主要用于手动发布产品功能 /// </summary> /// <param name="product"></param> /// <param name="requestModel"></param> public HtmlDocument GetProductSkuBase(BanggoProduct product, RequestModel requestModel) { string result = GetGoodsPriceAndColorContent(requestModel); JObject jObj = JObject.Parse(result); var data = jObj.SelectToken("data").Value<string>(); var doc = new HtmlDocument(); doc.LoadHtml(data); product.ThumbUrl = jObj.SelectToken("thumb_url").Value<string>(); GetPriceAndSalesVolume(product, doc); product.BSizeToTSize = GetBSizeToTSize(doc); return doc; }
/// <summary> /// 得到单个产品信息 /// </summary> /// <param name="requestModel"></param> /// <returns></returns> public Product GetGoodsInfo(RequestModel requestModel) { var product = new BanggoProduct {GoodsSn = requestModel.GoodsSn}; GetProductBaseInfo(product, requestModel); GetProductSku(product, requestModel); return product; }