整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

商品录入教程

写在最前面※

【关于商品审核时间】

工作日

10:30之前提交审核的,11:00之前审完

15:00之前提交审核的,15:30之前审完

20:00之前提交审核的,20:30之前审完

周末/公共假期

20:00之前提交审核的,20:30之前审完

如果审核遇到问题,请将审核未通过的商品编号发到群里(如:6535408016756310200,可在商品管理中查看),我们会集中为大家处理。

商品前端展示与后台录入内容对照示例:

一、创建商品

点击“商品”—“创建商品”

二、设置产品参数

支付方式:在线支付。目前小店仅支持这一种支付方式

商品URL:(此项选填)可填入淘宝/天猫(其他平台暂不支持)商品链接后,点击获取宝贝详情,自动获取已有宝贝已有淘宝/天猫商品信息

-效果如图【抓取后的信息请认真核对,如有顺序颠倒、图片未能正常抓取 请手动补充调整】

产品标题:准确简洁的描述商品,如:不锈钢真空保温杯,长效保温,支持验货

※如果是虚拟商品,请在标题写清楚【线上发货,无物流信息】

卖点:四个汉字(前端不展示)

商家推荐语:用一句话描述并推荐一下商品的优点,如:大分量雨前龙井茶 (前端不展示)

商品类目:请根据商品属性选择,可参考:类目对应表:https://shimo.im/sheet/AbmrMa54LOgps9qT。不同类目涉及的商品规格信息不同。

商品规格:请按实际情况填写

价格:需不高于市场同类商品价格,并且在后续设置的订单套餐价格范围内

原价:不填

佣金比例:0

运费设置:运费默认为包邮,如果您设置运费的需求,请新建运费模板并选择。

※如何新建运费模板?

1.选择【运费设置】右边的【新建运费模板】

或者进入【物流】-【运费模板】新建运费模板

2.设置模板名称、宝贝地址

模板名称:请根据需求随意设置

宝贝地址:宝贝地址为商家发货地址,请选择商品上线后的实际发货地

3.选择计价方式

按件数计价:选择按件数计价,填写默认运费,如 1件10元,没增加1件,增加运费2元。

按重量计价:选择按件数计价,填写默认运费,如 1kg10元,每增加1kg,增加运费2元。

4.设置指定地区运费

如果有些地区不采用默认运费,需要单独设置。请点击【为指定地区设置运费】,设置特定地区的运费规则。计价方式 与之前选择的计价方式一致。

注意:此项不是必须设置,如统一运费规则,不需要设置此项。

5.点击【提交】完成新增运费模板

三、设置产品主图

主图要求如下:

1.必须上传5张图片

2.图片必须为正方形(长宽比1:1)简易图片裁剪教程:https://jingyan.baidu.com/article/cd4c29793d0a39756f6e6077.html

3.只支持png,jpg,jpeg三种格式的图片

四、产品详情

1.建议将详情内容做成宽度为600的图片后上传,每张图片大小最好控制在1M左右。只支持png,jpg,jpeg三种格式的图片。如需上传动图,请先将图片扩展名改为.jpg。

(修改方式:http://dwz.cn/7XOHP2)【请注意 一定要上传图片!文本形式的产品详情严重影响转化率,提交审核后会被驳回哦!】

2.详情页图片中要说明商品规格重量、特点、优势、使用方法、保质期等,从多角度尽量展示商品的全部细节。文字说明建议做成图片,便于阅读。

3.如无详情,可将主图图片辅以文字说明制作成详情图片,合理排序后上传。

五、订单套餐

↑这是个GIF↑

1.首先点击“创建商品规格”

-规格名称:可根据产品名称填写

-子规格名称:可根据商品的规格类型填写,如:颜色、套餐组合、图案、瓶、盒等

-子规格选项:可填写商品的具体规格内容,如:商品重量、商品数量、商品尺寸等

【子规格的数量。选项可根据实际情况增加减少】

设置完成后点击确定

2.选择已经保存的规格名称,设置库存价格商品编码

商品编码不展示给用户,可自行设置

单价可以大于或者小于售价,但是必须有一个套餐价格与售价保持一致

库存数量可设置较大数值,防止商品卖光库存不足

六、商品管理

正在售卖商品:已经提交审核正在线上售卖商品可以在这里查看

提交申请商品:已提交审核但仍在审核中的商品可以在这里查看

下架商品:已被下架商品可以在这里查看

封禁商品:违规被封禁处理的商品可以在这里查看

保存为提交商品:完成商品创建,点击了【保存】的商品可以在这里查看,如需给保存商品提交审核 请点击【修改商品】

回收站:已删除商品可以在这里查看

七、商品资质

商品所需相关资质,请查看:【特殊类目商家资质要求】 对照上传。

了解禁止投放商品请查看:【头条小店禁售商品管理规范】

辑导语:在日常生活中,“赠”这种促销非常常见,一般有:纯赠、买赠和满赠这三种形式。本文作者围绕业务含义、模型设计和后台配置,分析了关于赠品的玩法,一起来看一下吧。

上次我整理过一个促销系统的基础知识,很感兴趣的同学可以参考历史的文章http://www.woshipm.com/pd/5277720.html,这次来说下常见的促销类型中的【赠品】促销。

在我们日常生活中【赠】这种促销非常常见,从线下实体店到线上电商平台,都会大量涉及这种玩法。

一、赠品促销的形式

主要是有这几种:纯赠、买赠和满赠,其中买赠还分为买一赠N 、买N赠N。

虽然广义上来说,都是“免费给消费者一个权益/商品”,但是对于系统的实现来说其实是有区别的哦,下面我围绕业务含义、模型设计和后台配置来分享一下关于赠品这种玩法。

二、赠品对于商品模型的影响

常规的商品spu:sku=1:n,本质上说,赠品也是一种商品,可以在商品上通过设置一个赠品标签来控制是否可以为赠品,这样做可以做一些赠品发放的管控。

三、交易各个角色整体交互

整体来说,这种赠品的模式本身是一种类型的促销。它的交易链路和一个常规订单的流程,比如提单、支付、履约,下发wms等这些流程是没有区别的,只是不同角色的系统在自身的设计上有一点点不同。

1. 纯赠

1)业务含义

其实纯赠这种模式跟线下实体店里那种试吃、试用是很相似的。包括给潜在用户一些小样产品,主要目的来促成转化,增加销量。

线上比较常见的比如在线教育机构的试听课,当你接到了销售的电话,一番沟通后,突然有一天你会发现你的账户里多了一节价值不菲的体验课,没过多久,销售又来联系你,尝试让你购买正价课,如果你成功支付了,那么那节体验课就完成了它的使命。

有的人也许会有疑问,所有用户不一定都会被转化,那前期投入的这些试听课岂不是很亏,其实对于企业来说,虚拟课程的成本和获客成本相比,根本不值一提。据报道,在2019年时,在线教育的获客成本就已经为2000~3000元,2020年时升至3000~4000元,一节虚拟课程的成本远低于它。

2)系统边界

  • 触发下单:对于这种纯赠的场景下,一般是一个运营在一个工具型系统后台进行触发的,通过用户的uid、skuid 信息为用户发放权益
  • 交易订单:打标区分这种赠品订单,方便后续进行数据统计。订单里订单实付金额记录的是0元,这里会涉及到如果本身赠品的商品金额大于0的话,订单会额外记录一下优惠金额,目的就是把钱打平。举个栗子,这个品原价99,实付0,那么优惠金额就是99
  • 支付:创建0元支付单
  • 商品库存:其实赠品也是常规商品,对于商品模型是没有影响的。也可以通过设置一个赠品标签来控制是否可以为赠品,这样做可以做一些赠品发放的管控

一般维护商品和配置活动的是不同的角色,有一些品如果作为赠品发放其实是有风险的。如果在商品这层做了标的限制,下游也需要识别这个标,非赠品的商品一旦下单为赠品订单,那么下单报错。如果没有这样的风险考虑,其实赠品的建品逻辑和其他商品是一样的。

  • 促销:记录优惠项、优惠金额。赠品的优惠金额等于赠品商品金额
  • 履约:与普通订单的履约流程无区别
  • 售后:一般是可以根据常规的订单来进行售后退货退款(即退0元,权益收回),如果设计实物的话,其实是需要用户退回实物的,但是由于是0原单,业务本身也不care是否会寄回,简单处理可以隐藏售后入口

2. 买赠

1)业务含义

常见的买赠形式包含买一赠一、买一赠N、买N赠N。包括“主商品和赠品一致”以及“主商品和赠品不一致的”情况,前者就赠品和主品一致;后者常见的比如生鲜平台买菜,买肉会送蒜,今年过年期间买生鲜还送窗花、窗帘,节日气氛拉满。

2)系统边界

  • 触发下单方:用户
  • 交易订单:这种包含赠品的订单,和常规订单没有什么区别,只是命中了一个赠品促销。订单这边会记录命中的促销ID、主品关联的赠品商品的信息如skuid、商品名称、商品金额
  • 支付:创建常规支付单
  • 商品库存:主商品和赠品都是常规的商品数据,可以通过设置一个赠品标签来控制是否可以为赠品,这样做可以做一些赠品发放的管控
  • 促销:根据创建的促销活动,关联主品和赠品的信息,制定活动生效时间、生效角色、范围等
  • 履约:与普通订单的履约流程无区别
  • 售后:根据常规的订单来进行售后策略来,一般买赠场景下,退主商品需要一并退回赠品。但是这里还区分是商家责任还是用户责任,一般如果是商家责任的话,会直接退费,主品和赠品也不需要退换

3. 满赠

1)业务含义

满赠顾名思义,就是满多少钱即获得赠品。赠的维度可以根据订单金额,比如订单实付满99有赠品;也可以根据部分商品金额来制定规则,比如生鲜类商品满39有赠品。

2)系统边界

  • 触发下单方:用户
  • 交易订单:买赠或者满赠,对于订单来说,和常规订单没有什么区别,只是命中了一个赠品促销。订单这边会记录命中的促销ID、赠品的信息如skuid、商品名称、商品金额
  • 支付:创建常规支付单
  • 商品库存:主商品和赠品都是常规的商品数据,可以通过设置一个赠品标签来控制是否可以为赠品,这样做可以做一些赠品发放的管控
  • 促销:根据创建的促销活动,制定促销规则,如活动生效时间、生效角色、范围等
  • 履约:与普通订单的履约流程无区别
  • 售后:根据常规的订单来进行售后策略来,一般满赠场景下,退主商品需要一并退回赠品。但是这里还区分是商家责任还是用户责任,一般如果是商家责任的话,会直接退费,主品和赠品也不需要退换

本文由 @闫秀儿 原创发布于人人都是产品经理,未经许可,禁止转载

题图来自 Unsplash,基于 CC0 协议

下是爬取京东商品详情的Python3代码,以excel存放链接的方式批量爬取。excel如下

代码如下

私信小编01即可获取大量Python学习资源

from selenium import webdriver
from lxml import etree
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import datetime
import calendar
import logging
from logging import handlers
import requests
import os
import time
import pymssql
import openpyxl
import xlrd
import codecs



class EgongYePing:

     options = webdriver.FirefoxOptions()
     fp = webdriver.FirefoxProfile()
     fp.set_preference("browser.download.folderList",2)  
     fp.set_preference("browser.download.manager.showWhenStarting",False)
     fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/zip,application/octet-stream")
     global driver 
     driver= webdriver.Firefox(firefox_profile=fp,options=options)
     def Init(self,url,code):
                       print(url.strip())
                       driver.get(url.strip())
                       #driver.refresh()
                       # 操作浏览器属于异步,在网络出现问题的时候。可能代码先执行。但是请求页面没有应答。所以硬等
                       time.sleep(int(3))
                       html = etree.HTML(driver.page_source) 
                       if driver.title!=None:
                         listImg=html.xpath('//*[contains(@class,"spec-list")]//ul//li//img')
                         if len(listImg)==0:
                              pass
                         if len(listImg)>0:
                                            imgSrc=''
                                            for item in range(len(listImg)):    
                                                 imgSrc='https://img14.360buyimg.com/n0/'+listImg[item].attrib["data-url"]
                                                 print('头图下载:'+imgSrc)
                                                 try:
                                                  Headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
                                                  r = requests.get(imgSrc, headers=Headers, stream=True)
                                                  if r.status_code == 200:
                                                     imgUrl=''
                                                     if item==0:
                                                          imgUrl+=code + "_主图_" + str(item)  + '.' + imgSrc.split('//')[1].split('/')[len(imgSrc.split('//')[1].split('/'))-1].split('.')[1]
                                                     else:
                                                          imgUrl+=code + "_附图_" + str(item)  + '.' + imgSrc.split('//')[1].split('/')[len(imgSrc.split('//')[1].split('/'))-1].split('.')[1]
                                                     open(os.getcwd()+'/img/'+  imgUrl , 'wb').write(r.content) # 将内容写入图片
                                                  del r
                                                 except Exception as e:
                                                    print("图片禁止访问:"+imgSrc) 
                         listImg=html.xpath('//*[contains(@class,"ssd-module")]') 
                         if len(listImg)==0:
                              listImg=html.xpath('//*[contains(@id,"J-detail-content")]//div//div//p//img')
                         if len(listImg)==0:
                              listImg=html.xpath('//*[contains(@id,"J-detail-content")]//img')
                         if len(listImg)>0:
                               for index in range(len(listImg)):  
                                    detailsHTML=listImg[index].attrib
                                    if 'data-id' in detailsHTML:
                                          try:
                                           details= driver.find_element_by_class_name("animate-"+listImg[index].attrib['data-id']).value_of_css_property('background-image')
                                           details=details.replace('url(' , ' ')
                                           details=details.replace(')' , ' ')
                                           newDetails=details.replace('"', ' ')
                                           details=newDetails.strip()
                                           print("详情图下载:"+details)
                                           try:
                                                  Headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
                                                  r = requests.get(details, headers=Headers, stream=True)
                                                  if r.status_code == 200:
                                                     imgUrl=''
                                                     imgUrl+=code + "_详情图_" + str(index)  + '.' + details.split('//')[1].split('/')[len(details.split('//')[1].split('/'))-1].split('.')[1]
                                                     open(os.getcwd()+'/img/'+   imgUrl, 'wb').write(r.content) # 将内容写入图片
                                                  del r
                                           except Exception as e:
                                                    print("图片禁止访问:"+details) 
                                          except Exception as e:      
                                               print('其他格式的图片不收录');       
                                    if  'src' in detailsHTML:
                                         try:
                                           details= listImg[index].attrib['src']
                                           if 'http' in details:
                                                     pass
                                           else:
                                                     details='https:'+details
                                           print("详情图下载:"+details)
                                           try:
                                                  Headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
                                                  r = requests.get(details, headers=Headers, stream=True)
                                                  if r.status_code == 200:
                                                     imgUrl=''
                                                     imgUrl+=code + "_详情图_" + str(index)  + '.' + details.split('//')[1].split('/')[len(details.split('//')[1].split('/'))-1].split('.')[1]
                                                     open(os.getcwd()+'/img/'+   imgUrl, 'wb').write(r.content) # 将内容写入图片
                                                  del r
                                           except Exception as e:
                                                    print("图片禁止访问:"+details) 
                                         except Exception as e:      
                                               print('其他格式的图片不收录'); 

                       print('结束执行')

         

     @staticmethod
     def readxlsx(inputText):
        filename=inputText
        inwb = openpyxl.load_workbook(filename)  # 读文件
        sheetnames = inwb.get_sheet_names()  # 获取读文件中所有的sheet,通过名字的方式
        ws = inwb.get_sheet_by_name(sheetnames[0])  # 获取第一个sheet内容
        # 获取sheet的最大行数和列数
        rows = ws.max_row
        cols = ws.max_column
        for r in range(1,rows+1):
            for c in range(1,cols):
                if ws.cell(r,c).value!=None and r!=1 :
                 if 'item.jd.com' in str(ws.cell(r,c+1).value) and str(ws.cell(r,c+1).value).find('i-item.jd.com')==-1:
                     print('支持:'+str(ws.cell(r,c).value)+'|'+str(ws.cell(r,c+1).value))
                     EgongYePing().Init(str(ws.cell(r,c+1).value),str(ws.cell(r,c).value))
                 else:
                     print('当前格式不支持:'+(str(ws.cell(r,c).value)+'|'+str(ws.cell(r,c+1).value)))
                     pass
        pass

if __name__ == "__main__":
                 start = EgongYePing()
                 start.readxlsx(r'C:\Users\newYear\Desktop\爬图.xlsx')

基本上除了过期的商品无法访问以外。对于京东的三种页面结构都做了处理。能访问到的商品页面。还做了模拟浏览器请求访问和下载。基本不会被反爬虫屏蔽下载。

上面这一段是以火狐模拟器运行

上面这一段是模拟浏览器下载。如果不加上这一段。经常会下载几十张图片后,很长一段时间无法正常下载图片。因为没有请求头被认为是爬虫。

上面这段是京东的商品详情页面,经常会三种?(可能以后会更多的页面结构)

所以做了三段解析。只要没有抓到图片就换一种解析方式。这杨就全了。

京东的图片基本只存/1.jpg。然后域名是 https://img14.360buyimg.com/n0/。所以目前要拼一下。

京东还有个很蛋疼的地方是图片以data-id拼进div的背景元素里。所以取出来的时候要绕一下。还好也解决了。

以下是爬取京东商品详情的Python3代码,以excel存放链接的方式批量爬取。excel如下

因为这次是淘宝和京东一起爬取。所以在一个excel里。代码里区分淘宝和京东的链接。以下是代码

from selenium import webdriver
from lxml import etree
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import datetime
import calendar
import logging
from logging import handlers
import requests
import os
import time
import pymssql
import openpyxl
import xlrd
import codecs



class EgongYePing:

     options = webdriver.FirefoxOptions()
     fp = webdriver.FirefoxProfile()
     fp.set_preference("browser.download.folderList",2)  
     fp.set_preference("browser.download.manager.showWhenStarting",False)
     fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/zip,application/octet-stream")
     global driver 
     driver= webdriver.Firefox(firefox_profile=fp,options=options)
     def Init(self,url,code):
                       #driver = webdriver.Chrome('D:\python3\Scripts\chromedriver.exe')
                       #driver.get(url)
                       print(url.strip())
                       driver.get(url.strip())
                       #driver.refresh()
                       # 操作浏览器属于异步,在网络出现问题的时候。可能代码先执行。但是请求页面没有应答。所以硬等
                       time.sleep(int(3))
                       html = etree.HTML(driver.page_source) 
                       if driver.title!=None:
                         listImg=html.xpath('//*[contains(@id,"J_UlThumb")]//img')
                         if len(listImg)==0:
                              pass
                         if len(listImg)>0:
                                            imgSrc=''
                                            for item in range(len(listImg)):    
                                                 search=listImg[item].attrib
                                                 if 'data-src' in search:
                                                    imgSrc=listImg[item].attrib["data-src"].replace('.jpg_50x50','')
                                                 else:
                                                    imgSrc=listImg[item].attrib["src"]
                                                 if 'http' in imgSrc:
                                                     pass
                                                 else:
                                                     imgSrc='https:'+imgSrc
                                                 print('头图下载:'+imgSrc)
                                                 try:
                                                  Headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
                                                  r = requests.get(imgSrc, headers=Headers, stream=True)
                                                  if r.status_code == 200:
                                                     imgUrl=''
                                                     if item==0:
                                                          imgUrl+=code + "_主图_" + str(item)  + '.' + imgSrc.split('//')[1].split('/')[len(imgSrc.split('//')[1].split('/'))-1].split('.')[1]
                                                     else:
                                                          imgUrl+=code + "_附图_" + str(item)  + '.' + imgSrc.split('//')[1].split('/')[len(imgSrc.split('//')[1].split('/'))-1].split('.')[1]
                                                     open(os.getcwd()+'/img/'+  imgUrl , 'wb').write(r.content) # 将内容写入图片
                                                  del r
                                                 except Exception as e:
                                                    print("图片禁止访问:"+imgSrc) 
                         listImg=html.xpath('//*[contains(@id,"J_DivItemDesc")]//img')
                         if len(listImg)>0:
                               for index in range(len(listImg)):  
                                    detailsHTML=listImg[index].attrib
                                    if 'data-ks-lazyload' in detailsHTML:
                                        details= listImg[index].attrib["data-ks-lazyload"]
                                        print("详情图下载:"+details)
                                    else:
                                        details= listImg[index].attrib["src"]
                                        print("详情图下载:"+details)
                                    try:
                                                  Headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
                                                  r = requests.get(details, headers=Headers, stream=True)
                                                  if r.status_code == 200:
                                                     imgUrl=''
                                                     details=details.split('?')[0]
                                                     imgUrl+=code + "_详情图_" + str(index)  + '.' + details.split('//')[1].split('/')[len(details.split('//')[1].split('/'))-1].split('.')[1]
                                                     open(os.getcwd()+'/img/'+   imgUrl, 'wb').write(r.content) # 将内容写入图片
                                                  del r
                                    except Exception as e:
                                                    print("图片禁止访问:"+details)  
                       print('结束执行')

         

     @staticmethod
     def readxlsx(inputText):
        filename=inputText
        inwb = openpyxl.load_workbook(filename)  # 读文件
        sheetnames = inwb.get_sheet_names()  # 获取读文件中所有的sheet,通过名字的方式
        ws = inwb.get_sheet_by_name(sheetnames[0])  # 获取第一个sheet内容
        # 获取sheet的最大行数和列数
        rows = ws.max_row
        cols = ws.max_column
        for r in range(1,rows+1):
            for c in range(1,cols):
                if ws.cell(r,c).value!=None and r!=1 :
                 if 'item.taobao.com' in str(ws.cell(r,c+1).value):
                     print('支持:'+str(ws.cell(r,c).value)+'|'+str(ws.cell(r,c+1).value))
                     EgongYePing().Init(str(ws.cell(r,c+1).value),str(ws.cell(r,c).value))
                 else:
                     print('当前格式不支持:'+(str(ws.cell(r,c).value)+'|'+str(ws.cell(r,c+1).value)))
                     pass
        pass

if __name__ == "__main__":
                 start = EgongYePing()
                 start.readxlsx(r'C:\Users\newYear\Desktop\爬图.xlsx')

淘宝有两个问题,一个是需要绑定账号登录访问。这里是代码断点。然后手动走过授权。

第二个是被休息和懒惰加载。被休息。其实没影响的。一个页面结构已经加载出来了。然后也不会影响访问其他的页面。

至于懒惰加载嘛。对我们也没啥影响。如果不是直接写在src里那就在判断一次取 data-ks-lazyload就出来了。

最后就是爬取的片段截图

建议还是直接将爬取的数据存服务器,数据库,或者图片服务器。因为程序挺靠谱的。一万条数据。爬了26个G的文件。最后上传的时候差点累死了

是真的大。最后还要拆包。十几个2g压缩包一个一个上传。才成功。