将淘宝数据包导入到自己的商城系统

淘宝网有一个淘宝助理,可以方便的将淘宝店的商品资源导出成csv格式的数据包。很多商城系统为了能快速输入商品,都会要求开发者能最大限度的利用淘宝数据包直接导入产品数据。最近正好有这样一个需求,就研究了一下,记录下来~

大致思路是这样的,将淘宝的数据包上传到自己的商城中,然后解压,读取里面的csv文件,把数据导入到自己的商城中,然后读取淘宝的图片,对图片进行处理,转换成自己商城合适的格式和尺寸

一、直接分析csv,转化为DataTable,依次导入到自己的库中

1.淘宝的csv数据包是用"\t"做为字段间的分隔符,每行数据是用"\n"做为行分隔符
2.要注意的是:宝贝描述(html代码)本身也会包含换行符号,不过不是"\n",而是"\r\n"---幸好是这样,不然的话,宝贝描述本身的换行符与数据每行的分隔符混在一起,就很难区分了.

下面是示例关键代码;

1.上传压缩包

  [HttpPost]
        public static  string UploadPackage(string zipFile, string path, bool Unzip = false)
        {
            var uploadFile = HttpContext.Current.Request.Files[zipFile];
            var session = HttpContext.Current.Session;
            var server = HttpContext.Current.Server;
            if (uploadFile == null)
            {
                return "请选择上传文件!!";
            }
            var extension = Path.GetExtension(uploadFile.FileName) ?? string.Empty;
            if (extension.ToLower() != ".zip")
            {
                return "请上传zip格式的压缩文件!";
            }
            if (uploadFile.ContentLength >= 40960 * 1024)
            {
                return "文件大小超过指字限度!";
            }
            if (HttpContext.Current.Session["zipDir"] != null)
            {
                if (session != null)
                {
                    if (Directory.Exists(server.MapPath(session["zipDir"].ToString())))
                    {
                        Directory.Delete(server.MapPath(session["zipDir"].ToString()), true);
                    }
                }
            }
            var sysPath = ConfigManager.SystemConfig.图片上传路径;
            if (session != null)
            {
                var fileName = Path.GetFileNameWithoutExtension(uploadFile.FileName);
                var dir = sysPath + "/" + path + "/";
                var filePath = dir + fileName + Path.GetExtension(uploadFile.FileName);
                if (!Directory.Exists(server.MapPath(dir)))
                {
                    Directory.CreateDirectory(server.MapPath(dir));
                }
                uploadFile.SaveAs(server.MapPath(filePath));
                if (Unzip)
                {
                    string err;
                    bool zipResult = UnZipFile(server.MapPath(filePath), server.MapPath(dir + fileName), out err);

                    File.Delete(server.MapPath(filePath));
                    session["zipDir"] = dir + fileName;
                    if (zipResult)
                    {
                        if (File.Exists(server.MapPath(dir + fileName) + "/products.csv"))
                        {
                            return dir + fileName + "/products.csv";
                        }
                        return "压缩包中缺少products.csv文件!";
                    }
                    return "不是有效的zip文件格式,解压失败!";
                }
                return filePath;
            }
            return string.Empty;
        }

2.解压数据包

        public static bool UnZipFile(string zipFilePath, string unZipDir, out string err)
        {
            err = "";
            if (zipFilePath == string.Empty)
            {
                err = "压缩文件不能为空!";
                return false;
            }
            if (!File.Exists(zipFilePath))
            {
                err = "压缩文件不存在!";
                return false;
            }
            if (!unZipDir.EndsWith("\\"))
            {
                unZipDir += "\\";
            }
            if (!Directory.Exists(unZipDir))
            {
                Directory.CreateDirectory(unZipDir);
            }

            try
            {
                using (var s = new ZipInputStream(System.IO.File.OpenRead(zipFilePath)))
                {
                    ZipEntry theEntry;
                    while ((theEntry = s.GetNextEntry()) != null)
                    {
                        string directoryName = Path.GetDirectoryName(theEntry.Name);
                        string fileName = Path.GetFileName(theEntry.Name);
                        if (!string.IsNullOrEmpty(directoryName))
                        {
                            Directory.CreateDirectory(unZipDir + directoryName);
                        }
                        if (fileName != String.Empty)
                        {
                            using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name))
                            {
                                var data = new byte[2048];
                                while (true)
                                {
                                    int size = s.Read(data, 0, data.Length);
                                    if (size > 0)
                                    {
                                        streamWriter.Write(data, 0, size);
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                err = ex.Message;
                return false;
            }
            return true;
        }

3.对解压中的csv文件进行处理

 public static DataTable ReadCsvFromTb(string fileName)
        {
            var dt = new DataTable();
            var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            var sr = new StreamReader(fs, Encoding.Default);
            var strLine = "";
            int columnCount = 0, rowNum = 0;
            var isTitle = true;
            while ((strLine = sr.ReadLine()) != null)
            {
                if (rowNum > 1)
                {
                    var aryLine = strLine.Split('\t');
                    if (isTitle)
                    {
                        isTitle = false;
                        columnCount = aryLine.Length;
                        for (var i = 0; i < columnCount; i++)
                        {
                            var dc = new DataColumn(aryLine[i]);
                            dt.Columns.Add(dc);
                        }
                    }
                    else
                    {
                        var dr = dt.NewRow();
                        for (var j = 0; j < columnCount; j++)
                        {
                            dr[j] = aryLine[j].Replace("\"\"", "\"").TrimStart('"').TrimEnd('"');
                        }
                        dt.Rows.Add(dr);
                    }
                }
                rowNum++;
            }
            sr.Close();
            fs.Close();
            return dt;
        }
4.导入淘宝数据包数据到自己的库中(下面是我自己的系统中用到的,根据自己的项目,做不同改动)

        public string ImportTbData(string zipPath, string area, string type, string sellerType, string brand, bool deleteZip = true)
        {
            var msg = "";
            var unZipDir = zipPath.Substring(0, zipPath.LastIndexOf('.'));
            if (FileHelper.UnZipFile(Server.MapPath(zipPath), Server.MapPath(unZipDir), out msg))
            {
                var filePath = unZipDir + "/products.csv";
                if (System.IO.File.Exists(Server.MapPath(filePath)))
                {
                    var taobaoList = new GoodsManager().GetTaoBaoData(CsvHelper.ReadCsvFromTb(Server.MapPath(filePath))).Select(tb => new SellerTaoBaoGoodsViewModel(tb)).ToList();
                    msg = SaveTbDataToLocalData(taobaoList, area, type, sellerType, brand, unZipDir);
                }
                else
                {
                    msg = "压缩包中缺少products.csv文件!";
                }

            }
            else
            {
                msg = "不是有效的zip文件格式,导入数据包失败!";
            }

            if (deleteZip)
            {
                System.IO.File.Delete(Server.MapPath(zipPath));
                System.IO.Directory.Delete(unZipDir, true);
            }
            return msg;
        }

        public string SaveTbDataToLocalData(List<SellerTaoBaoGoodsViewModel> list, string area, string type, string sellerType, string brand, string unZipDir)
        {
            foreach (var item in list)
            {
                if (!CopyTbImageToLocalImage(item.图片列表, unZipDir)) continue;
                var smallImgList = (List<string>)Session["smallImgListTb"];
                var middleImgList = (List<string>)Session["middleImgListTb"];
                var bigImgList = (List<string>)Session["bigImgListTb"];
                var goods = new Goods
                                {
                                    ID = Guid.NewGuid(),
                                    店铺ID = Seller.ID,
                                    地区ID = area,
                                    分类ID = Guid.Parse(type),
                                    卖家分类ID = sellerType == string.Empty ? new Guid() : Guid.Parse(sellerType),
                                    名称 = item.名称,
                                    品牌 = brand,
                                    小图 = string.Join(",", smallImgList),
                                    中图 = string.Join(",", middleImgList),
                                    大图 = string.Join(",", bigImgList),
                                    单价 = Math.Round(double.Parse(item.单价), 4),
                                    折扣价 = Math.Round(double.Parse(item.单价), 4),
                                    库存量 = int.Parse(item.库存量),
                                    编码 = item.编码,
                                    详细介绍 = item.详细介绍.Replace("'", ""),
                                    有无发票 = item.有无发票,
                                    退货承诺 = item.退货承诺,
                                    总销量 = 0,
                                    是否上架 = YesNo.是,
                                    是否精选 = item.是否精选,
                                    登记时间 = DateTime.Now
                                };
                new GoodsManager().AddGoods(goods);
                Session["smallImgListTb"] = null;
                Session["middleImgListTb"] = null;
                Session["bigImgListTb"] = null;
            }
            return string.Format("本次共成功导入{0}条数据!", list.Count);
        }

      

二、数据包中图片处理

1.从csv文件中获取到淘宝数据包中的tbi图片

 public class SellerTaoBaoGoodsViewModel
    {
        public string 名称 { get; set; }
        public string 单价 { get; set; }
        public string 库存量 { get; set; }
        public string 详细介绍 { get; set; }
        public string 编码 { get; set; }
        public YesNo 有无发票 { get; set; }
        public YesNo 是否精选 { get; set; }
        public YesNo 退货承诺 { get; set; }
        public List<string> 图片列表 { get; set; }
        public SellerTaoBaoGoodsViewModel(TaoBaoGoods taoBaoGoods)
        {
            名称 = taoBaoGoods.宝贝名称;
            单价 = taoBaoGoods.宝贝价格;
            库存量 = taoBaoGoods.宝贝数量;
            详细介绍 = taoBaoGoods.宝贝描述;
            编码 = taoBaoGoods.商家编码;
            有无发票 = taoBaoGoods.发票;
            是否精选 = taoBaoGoods.橱窗推荐;
            退货承诺 = taoBaoGoods.退换货承诺;
            var list = new List<string>();//这里对图片有一个小处理
            for (var i = 0; i < taoBaoGoods.新图片.Split(';').Length - 1; i++)
                list.Add(taoBaoGoods.新图片.Split(';')[i].Replace(string.Format(":1:{0}:|", i), ".tbi"));
            图片列表 = list;
        }

2.处理取到的tbi图片,转换为自己用到的图片格式

  public bool CopyTbImageToLocalImage(List<string> list, string unZipDir)
        {
            var imgDir = unZipDir + "/products/";
            foreach (var img in list)
            {
                var fileStream = new FileStream(Server.MapPath(imgDir + img), FileMode.Open);
                var stream = fileStream as Stream;
                var imgPath = ImageHelper.CopyToGoodsImg(stream);
                var imgPathList = imgPath.Split(new[] { ':' });
                if (imgPathList.Length <= 0) continue;
                List<string> smallImgList;
                List<string> middleImgList;
                List<string> bigImgList;
                if (Session["smallImgListTb"] == null)
                {
                    smallImgList = new List<string> { imgPathList[0] };
                    middleImgList = new List<string> { imgPathList[1] };
                    bigImgList = new List<string> { imgPathList[2] };

                    Session["smallImgListTb"] = smallImgList;
                    Session["middleImgListTb"] = middleImgList;
                    Session["bigImgListTb"] = bigImgList;
                }
                else
                {
                    smallImgList = (List<string>)Session["smallImgListTb"];
                    middleImgList = (List<string>)Session["middleImgListTb"];
                    bigImgList = (List<string>)Session["bigImgListTb"];

                    smallImgList.Add(imgPathList[0]);
                    middleImgList.Add(imgPathList[1]);
                    bigImgList.Add(imgPathList[2]);

                    Session["smallImgListTb"] = smallImgList;
                    Session["middleImgListTb"] = middleImgList;
                    Session["bigImgListTb"] = bigImgList;
                }
            }
            return true;
        }

到此,一个导入就算成功了~


Shop7z网上购物系统旗舰版集众家之所长,大气超美观页面+商品组合套餐+限时抢购秒杀+图片批量上传+淘宝数据包导入+可选手机版+弹出式分类菜单+不同规格不同价格+新订单邮件通知+销售报表打印与Excel输出+物流跟踪打印查询+会员积分及优惠券+邮件群发+图片在线管理+销售统计报表+五种价格体系+礼品礼券等等等。。。。 Shop7z网上购物系统旗舰版采用弹出式动态商品分类菜单,是当今非常流行的菜单模式,集大分类—小分类—子分类于一体弹出直观展示,同时分类菜单右侧会显示本分类的最新商品信息,非常美观! Shop7z旗舰版整合了商品组合套餐功能,即可以任意选择几款商品作为一个商品套餐来让用户购买,然后设定一个更低廉的价格,购买一个套餐即购买了本套餐中包含的所有商品,即让用户得到了实惠,也使网站的销售业绩更加突出诱人。网站商品可以任意灵活组合、重复组合套餐,在每个商品的展示页中都会显示它所隶属的组合类别,这也是Shop7z独有的网站促销宝典。 Shop7z网上购物系统旗舰版支持限时抢购秒杀活动,加入限时抢购的商品均可设置限时抢购的结束时间,期间商品页会倒计时显示抢购时间,此期间可以对加入抢购的商品设置更低一些的价格,吸引人们对商品的购买欲望,到期结束后会页面会自动显示抢购结束,但可以继续原价购买,这是网店非常流行的销售模式。 Shop7z率先支持不同规格不同价格功能!!添加宝贝时可以设置任意组规格的不同价格,例如某一商品有多种型号,但不同型号价格不同,就可以设置不同的型号对应的不同价格,用户在购买此商品时须选择的型号不同价格也会不同。此功能和淘宝中的套餐功能是一样的,是当今开网店中必不可少的功能。 Shop7z系统增加新订单邮件通知功能,后台可设置开启或关闭。管理员可以自定义新订单邮件通知的具体内容,有客户下订单后,系统会自动给下单者及管理员发送邮件,比如设置用QQ邮箱,QQ系统会自动弹出邮件通知,非常方便! Shop7z网上购物系统支持多种排序浏览,方便用户过滤、选择浏览商品,非常人性化。如支持按价格、人气、销量的上下排序,以及按文字或图片式浏览显示,同时还支持每页商品个数的自定义浏览,如此智能化的功能大大提高了人们的浏览积极性。 支持邮件群发功能,此功能需要服务器支持Jmail组件,在设置好邮件服务器后,可以在线实现邮件群发,支持选择商城的注册用户,系统自动读取用户邮箱地址,在线给商城用户群发邮件,邮件内容支持图文混排、上传图片等信息。 Shop7z网上购物系统新增管理员登陆日志功能,对所有试图登陆后台的信息均自动记录,大大提高了网站的安全性,对管理员排查安全隐患提供了最有力的证据,同时新增图片在线管理功能,对添加商品、新闻等一切信息所上传的图片,可以在线归类浏览,同时还可以清理不需要的图片,进行删除,以节约宝贵的网站空间资源, Shop7z旗舰版支持立即购买功能,此功能也叫快速购买,支持匿名购买,在商品中直接立即购买,输入送货的基本信息即可提交订单,并可完成在线支付过程,省去了正常购物中若干个下一步的繁琐过程,使购物简洁明了一步到位!当然系统同时支持正常的下单购物流程,可以方便的查看订单、管理个人资料等信息。 强大的广告位管理也是本系统的一大特色。Shop7z网上购物系统旗舰版除了可以设定某个分类在首页展示之外,还可以对在首页展示的分类设置扩充广告位,每个分类支持设置最多5个广告图片,即分类越多广告位越多,分类右侧同时会显示本类别下的10个小类,这样能够满足不同开店客户的需求! Shop7z网上购物系统拥有强大的管理功能和完善的在线支付平台体系。后台管理菜单合理分配,管理目录清晰明了。支持多种最新版本在线支付接口,如支付宝、网银在线、财付通等接口,支持多级商品分类划分功能,可以方便的划分各商品类别的上下级关系,支持单商品多分类展示功能,订单方面设计完美,如支持订单模糊查询、订单状态的编辑及打印等功能,灵活的DIY可以设置首页类别商品在首页显示的位置及状态。 商品管理方面,支持商品批量在线修改,一次性批量修改商品名称、价格、所属品牌等信息。同时系统支持单个商品分属两个分类功能,对于某些行业是很适用的,支持商品价格5级会员显示,相应会员显示对应价格功能。支持商品多图预览功能!鼠标指向图片移到位置,可以对图片细节进行观看,同时支持商品图片批量上传,对已上传的图片可以重复调用,系统还支持某些行业的尺码与颜色选择功能,以及购买量的设置,同时支持网页分享与收藏功能,最大限度的留住客户。 Shop7z网上购物系统支持自定义导航条及首页功能。商品分类管理功能一气呵成,可以方便的设置商城三级分类,以及对商品分类的从属关系的设置。支持商城首页导航条自定义,根据个人需要,可以设置某个商品分类是否在导航条上显示,设置后的导航条鼠标指向相应分类同时会显示出所有下属类别,点开后显示相应商品;强大的DIY首页功能同样如此,除了特价和促销商品外,可以设置某个类别下的商品是否于首页显示,合理的设置类别显示不仅使网站显的大气,而且会使网站内容丰富充沛。 完善的购物流程体系是Shop7z的显著特色!首先后台设置网站的送货方式以及相应的金额,并设置好支付方式即在线支付设置,各在线支付开关及配置以及收款帐号等信息。用户通过前台购物车购物提交订单后,可以输入自己的收货信息,然后选择送货方式即可,系统会根据不同的送货方式自动调整送货费用并计入订单价格,最后选择要用的支付方式,如支付宝、财付通等支付方式进行付款即可。如果用户在下完订单后并未及时付款,通过用户中心的订单管理也可以再次发起付款操作。 Shop7z网上购物系统支持淘宝数据批量导入,您在淘宝开店的同时,可以一次性批量把淘宝网上的店铺商品批量导入网趣商城旗舰版,大大减轻了您的重复工作。只需点击导入即可全部完成,让您的网店与淘宝数据同步更新。 Shop7z网上购物系统现已整合最新版Kindeditor编辑器。全新编辑器执行速度更快、效率更高。兼容所有浏览器。彻底解决原有编辑器只支持IE的垢病!。新版编辑器同时增加图片在线批量上传功能,可以单次上传任意张图片一次搞定!。且支持图片在线批量预览、重复调用功能。增加谷歌地图在线调用。可以调用全球任何位置的地理位置并插入。支持文件、文件、视频在线上传。大大的方便了使用。 商品品牌划分。系统支持商品品牌分类功能,支持品牌LOGO上传功能。商品列表页支持多种分类浏览,包括一行四个商品图片式、单条商品小图列表显示以及纯文字式显示,可以根据不同喜好自行选择,商品搜索方面支持按品牌、编号、名称进行模糊查询操作。 Shop7z拥有强大的订单管理功能,具体表现在: 一、支持按订单号码查询和按下单用户以及日期查询订单,支持模糊查询功能。 二、支持按点选查看订单6种状态下的所有订单信息 三、支持订单的快递单打印功能 四、支持物流单号、发货日期等填写设置功能。 五、支持订单文本打印!本功能以纯文本加普通单线黑表格方式进行打印订单,方便归纳与统计!  六、前台导航条支持订单搜索,方便及时查看订单的实时状况 七、支持发货管理,填写物流公司及单号后发货,系统自动进入发货状态。 八、商品销售报表统计!按日期统计一段时间内商品订单状态 九、支持订单优惠券。优惠券抵减相应订单金额的功能。。 十、支持新订单邮件自动通知,支持DIY订单邮件内容 十一、支持商品销售报表打印+报表Excel输出功能! 支持商品评论与留言功能。客户可以在商品页对商品进行评论,后台审核后显示并可回复评论内容增加互动。同时商城留言版可以对商城进行留言,管理员同样可以回复及删除操作。 支持网站友情链接设置。Shop7z支持网站LOGO图片或文字式友情链接,并可设置显示方式,支持网站调查栏目功能,可以发起调查信息,根据用户投票显示调查结果。 Shop7z网上购物系统采用当今流行的全屏幕的风格,流行而时尚,独特且新颖!优美的外观设计、给用户以美的视觉冲击,这是您网店成功的第一步。系统拥有多种广告位,所有广告图片内容均可以直接在线上传管理。首页大图切换广告不仅可以设置图片链接还可以设置提示文字,是非常不错的促销广告。系统支持滚动发货管理显示。系统将根据订单状态,自动读取已发货订单信息并滚动显示, 已付款的客户提供方便的查询服务。 支持积分兑换礼品功能,用户通过购物获赠的积分可以到礼品礼券栏目选择自己喜欢的礼品进行兑换。同时支持优惠券功能设置,均可在后台添加,如购物满一定金额赠送100元优惠券,客户下次购物时可以使用优惠券抵减订单金额,是一种非常不错的促销手段。同时购物车环节同样支持购物满一定金额满运费的设置。这些都是网上开店中常用的促销模式,非常实用。 支持网站底部帮助栏目自定义。可以设置商城底部如购物指南、运货说明、支付方式、服务政策、关于我们中的内容信息,自由增加或删除,网站最底部版权信息支持图文混排的编辑模式,根据自己的喜爱自由编辑该区域的内容。 Shop7z网上购物系统支持客服QQ浮动聊天功能,可以设置多个QQ号码,系统准确判断在线状态,同时还支持旺旺、MSN在线聊天设置功能,客服菜单状态可开启或关闭。 系统集多种智能化开关设置于一体,后台可以对网站的初始化进行方便的设置,如模板方面支持多种色调的设置、首页显示的新新闻条目数、商品的列数行数、以及商品的小图尺寸等等。 为确保网站数据万无一失,系统拥有强大的数据库在线管理功能。系统支持在线备份数据库、并支持在线恢复数据,也可以选择不同的备份进行恢复。支持数据库压缩功能,这是非常实用的功能,如网站商品过多,数据库会变得庞大且有冗余数据,使用压缩功能可使数据库大大减小,同时也会提高页面打开速度。支持查看当前数据库大小、下载数据库备份的功能。支持删除备份的数据库功能。为网站及时进行备份和恢复提供了良好的支持! Shop7z网上购物系统具有大的关键词设置功能,整个网站可以设置其搜索关键词,在SEO方面表现出众,可以设置任意个商品不同的搜索关键字和描述,同时经过优化过程序在搜索引擎优化上有了更大的飞跃,用户只需要通过在后台进行相关优化设置即可轻松实现在各大搜索引擎的靠前显示。 商城会员管理。管理员可以设置前台已注册用户的所有信息,如可以设置用户的帐号状态是否可用、会员身份级别、联系方式等,还可以查看某个会员的所有订单信息统计。还支持用户根据密码提示问题和答案找回密码功能。管理员设置方面可以添加任意个管理员帐号信息,并设置不同的管理权限,方便权限的划分。 灵活多变的配送计费模式。Shop7z网上购物系统拥有超强的送货计费方式。系统支持按普通计件和按重量计费两种模式,普通计件适合大部分商城使用,根据用户选择的送货方式不同计费即可。对于量大批发的商城,如超重物品则可以按运费计件,根据重量不同、送货地址不同分别设置计费模式。 支持商城新闻发布。可以添加网站新闻内容,标题支持Html语法调用,同时增加新闻搜索功能,可以对新闻标题进行模糊搜索便于查找已发布过的内容。 支持商品最近浏览功能,可以为用户列出最近所浏览过的所有商品记录,方便用户收藏或购买自己喜欢的商品,提高用户的购买欲望,为用户提供了很好的浏览保存记录功能。 在线支付方面,支持支付宝、财付通中介担保交易接口,支持北京网银在线和Pyapal贝宝接口,所有接口均为最新版本确保可用。用户只需到相应网站上申请支付帐号即可使用,所有接口系统均已订成。可以任意设置所有接口的开关,对于不需要用的接口直接关闭即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值