Exemplo n.º 1
0
        // 导出竞争对手的产品信息
        /// <summary>
        /// 导出竞争对手的产品信息
        /// </summary>
        /// <param name="query">在淘宝中输入的产品信息</param>
        /// <param name="marketPrice">该产品的市场价</param>
        /// <param name="salePrice">我的售价</param>
        public void ExportRivalGoodsInfo(string query, double marketPrice = 0, double salePrice = 0)
        {
            _log.LogInfo(Resource.Log_ExportRivalGoodsInfoing.StringFormat(query));

            var searchUrl = SysConst.TaoBaoSearchUrl.StringFormat(query);

            var docSearchGoodsList = SysUtils.GetHtmlDocumentByHttpGet(searchUrl);

            var itemBoxs =
                docSearchGoodsList.DocumentNode.SelectNodes(
                    "//*[@class='col item icon-datalink']/div[@class='item-box']");

            itemBoxs.ThrowIfNull(Resource.ExceptionTemplate_MethedParameterIsNullorEmpty.StringFormat(new StackTrace()));

            // string sheetName = "价格数据{0}".StringFormat(DateTime.Now.ToString("HHmm"));
            string sheetName = "价格数据{0}".StringFormat("");

            var excel = CreateExcelForRivalPrice(sheetName);

            DataTable dt = excel.ReadTable(sheetName);

            DataRow drNew = dt.NewRow();

            //遍历搜索出来的产品列表
            foreach (var item in itemBoxs)
            {
                try
                {
                    GetRivalDetails(item, excel, sheetName, drNew);
                    drNew["款号"] = query.GetNumberStr();
                    if (marketPrice > 0)
                    {
                        drNew["成本价"] = (marketPrice * SysConst.CostRatio).ToType <int>() + SysConst.CostExtraPrice;
                    }
                    drNew["售价"] = salePrice;
                    drNew["利润"] = drNew["售价"].ToType <double>() - drNew["成本价"].ToType <double>();
                    excel.AddNewRow(drNew);
                    _log.LogInfo(Resource.Log_ExportSingleRivalGoodsInfoSuccess.StringFormat(drNew["用户名"]));
                }
                catch (Exception ex)
                {
                    _log.LogError(Resource.Log_InsertRivalGoodsInfoFailure.StringFormat(drNew["用户名"]), ex);
                }
                Thread.Sleep(500);
            }

            _log.LogInfo(Resource.Log_ExportRivalGoodsInfoSuccess.StringFormat(query));
        }
Exemplo n.º 2
0
        //读取或构造单个产品的基础信息
        /// <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
        }
Exemplo n.º 3
0
        // 得到对手的详细销售信息
        /// <summary>
        /// 得到对手的详细销售信息
        /// </summary>
        /// <param name="item">某个对手HTML结点</param>
        /// <param name="excel">excel</param>
        /// <param name="shellName">工作表名</param>
        /// <returns></returns>
        private void GetRivalDetails(HtmlNode item, ExcelHelper excel, string shellName, DataRow dr)
        {
            #region 得到taobao该对手的价格数据 并添加到excel中

            var salePrice     = item.SelectSingleNode("div[@class='row row-focus']/div[1]").InnerText.GetNumberDecimal();
            var postage       = item.SelectSingleNode("div[@class='row row-focus']/div[2]").InnerText.GetNumberDecimal();
            var salesVolume   = item.SelectSingleNode("div[@class='row']/div[1]").InnerText.GetNumberDecimal();
            var evaluate      = item.SelectSingleNode("div[@class='row']/div[2]").InnerText.GetNumberDecimal();
            var url           = item.SelectSingleNode("h3[@class='summary']/a").Attributes["href"].Value.Trim();
            var title         = XmlHelper.XmlDecode(item.SelectSingleNode("h3[@class='summary']/a/@title").InnerText.Trim());
            var rivalName     = item.SelectSingleNode("div[@class='row']/div[@class='col seller']/a").InnerText.Trim();
            var rivalLocation =
                item.SelectSingleNode("div[@class='row']/div[@class='col end loc']").InnerText.Trim();

            dr["标题"]  = title;
            dr["总价"]  = salePrice + postage;
            dr["价格"]  = salePrice;
            dr["邮费"]  = postage;
            dr["销量"]  = salesVolume;
            dr["评价数"] = evaluate;
            dr["用户名"] = rivalName;
            dr["地点"]  = rivalLocation;
            dr["网址"]  = url;

            #endregion

            _log.LogInfo(Resource.Log_GetRivalDetailsing.StringFormat(rivalName));


            ////如果有销售情况,就提取他的销售详情
            //if (salesVolume > 0)
            //{
            var saleDetail = SysUtils.GetHtmlDocumentByHttpGet(url);


            #region 获取SKU数据

            dr["SKU"]  = "";
            dr["成交记录"] = "";

            sbRivalSkuData.Clear();

            var nodeStock = saleDetail.DocumentNode.SelectSingleNode("//*[@id=\"J_SpanStock\"]");

            if (nodeStock != null)
            {
                sbRivalSkuData.AppendLine("库存:{0};".StringFormat(nodeStock.InnerText));
            }

            var nodeColors = saleDetail.DocumentNode.SelectNodes("//*[@id=\"J_isku\"]/div/dl[2]/dd/ul/li");
            if (nodeColors != null)
            {
                foreach (var nColor in nodeColors)
                {
                    var color =
                        "颜色:{0};".StringFormat(
                            nColor.InnerText.Trim()
                            .Replace("已选中", "")
                            .Replace("\\t", "")
                            .Replace("\\r\\n", "")
                            .Trim());
                    if (!color.IsNullOrEmpty())
                    {
                        sbRivalSkuData.AppendLine(color);
                    }
                }
            }

            var nodeSizes = saleDetail.DocumentNode.SelectNodes("//*[@id=\"J_isku\"]/div/dl[1]/dd/ul/li");
            if (nodeSizes != null)
            {
                foreach (var nSize in nodeSizes)
                {
                    var size =
                        "尺码:{0};".StringFormat(
                            nSize.InnerText.Trim()
                            .Replace("已选中", "")
                            .Replace("\\t", "")
                            .Replace("\\r\\n", "")
                            .Trim());
                    if (!size.IsNullOrEmpty())
                    {
                        sbRivalSkuData.AppendLine(size);
                    }
                }
            }


            dr["SKU"] = TextHelper.TrimEndLf(sbRivalSkuData.ToString());

            sbRivalSkuData.Clear();

            #endregion


            #region 提取详细销售记录数据

            var buyer = saleDetail.GetElementbyId("J_listBuyerOnView");
            if (buyer == null)
            {
                _log.LogWarning(Resource.Log_UnableGetMallSaleData.StringFormat(rivalName));

                return;
            }

            /*可以提取数量和邮费等信息
             * http://ajax.tbcdn.cn/json/ifq.htm?id=20651779110&sid=820330575&sbn=fe93d967b0bacbda0f41f3eb67d4c0f4&p=1&al=false&ap=1&ss=0&free=0&q=1&ex=0&exs=0&shid=&at=b&ct=1*/

            var saleRecordUrl =
                saleDetail.GetElementbyId("J_listBuyerOnView").Attributes["detail:params"].Value.Replace(
                    ",showBuyerList", "&t={0}&callback=Hub.data.records_reload".StringFormat(DateTime.Now.Ticks));

            /* var saleDetailHtml =
             *   SysUtils.GetHtmlByHttpGet(saleRecordUrl)
             *           .Trim()
             *           .Replace("Hub.data.records_reload(", "")
             *           .TrimEnd(')');*/

            var saleDetailHtml =
                HttpHelper.GETDataToUrl(saleRecordUrl)
                .Trim()
                .Replace("Hub.data.records_reload(", "")
                .TrimEnd(')');

            if (saleDetailHtml.StartsWith("{html:"))
            {
                JObject jObj = JObject.Parse(saleDetailHtml);

                saleDetail.LoadHtml(jObj.SelectToken("html").Value <string>());

                var nodes =
                    saleDetail.DocumentNode.SelectNodes("/table/tbody/tr");

                if (nodes == null)
                {
                    return;
                }

                var sbContent = new StringBuilder();

                foreach (var node in nodes)
                {
                    sbContent.AppendLine(XmlHelper.XmlDecode(node.InnerText.Trim()));
                }

                dr["成交记录"] = TextHelper.TrimEndLf(sbContent.ToString());
            }

            #endregion

            _log.LogInfo(Resource.Log_GetRivalDetailsSuccess.StringFormat(rivalName));
        }