在线上交易早已成熟的今天,电商交易量究竟有多少?为了清晰地比较天猫月销量,本文爬取了天猫2017年底、2018年初主流分类商品大量数据,并做了简单的数据统计。整体流程如下:
说明:利用scrapy爬取天猫店铺数据约50万
条,导入HDFS
分布式存储,利用大数据组件spark
操作算子分析及sparkSQL
查询分析得出处理结果,最后,EChart
前端组件将结果以图表形式展现出来。
Scrapy
是Python
开发的一个快速、高层次的爬虫框架,用于抓取web站点并从页面中提取结构化的数据。首先爬取天猫首页分类数据,如一级分类:女装、男装
,二级分类:羽绒服女、针织衫女
等。结果保存为class.json
,部分数据如下:
{"class2": ["羽绒服女", "毛呢外套女", "毛衣女", "针织衫女", "棉服女", "连衣裙", "风衣女装", "裤子女装", "卫衣女装", "T恤女装", "衬衫女装", "半身裙", "西装女", "打底衫女", "夹克女", "皮衣女", "妈妈装","婚纱礼服"], "class1": "女装"}
{"class2": ["外套男装", "夹克男装", "衬衫男装", "T恤男装", "棒球服男装", "牛仔外套男装", "卫衣男装", "西装男", "风衣男装", "皮衣男装", "针织衫男装", "呢大衣男装", "休闲裤男装", "牛仔裤男装", "运动裤男装", "九分裤男装", "马甲男装", "羽绒服男装", "棉衣男", "中老年男装"], "class1": "男装"}
...
{"class2": ["沙发", "床", "餐桌", "床垫", "茶几", "电视柜", "衣柜", "鞋柜", "椅凳", "书桌", "电脑桌", "现代简约家具", "美式家具", "北欧家具", "中式家具", "儿童家具", "真皮沙发", "布艺沙发", "皮床", "实木床", "儿童床", "乳胶床垫", "儿童学习桌", "书架", "椅子", "电脑椅"], "class1": "家具"}
{"class2": ["iphone", "荣耀", "三星", "小米", "华为", "魅族", "oppo", "vivo"], "class1": "手机"}
...
获取上述{key:value}
后,我们以search=value
的方式(等同于在页面搜索框输入关键字)进一步爬取店铺数据,对于每一个店铺我们获取到一级分类、二级分类、商品名称、价格、月销售量、店铺名称{class1, class2, title, sales, price, store}
,对于每一个搜索的商品,我们按销量获取约前1000个店铺(最多1020个店铺)。数据形式如下:
{"title": "清仓薄款连帽韩版羽绒服", "price": "189.90", "sales": 44000.0, "class2": "羽绒服女", "store": "翼素", "class1": "女装"}
{"title": "可自提", "price": "499.00", "sales": 37000.0, "class2": "羽绒服女", "store": "优衣库官方旗舰店", "class1": "女装"}
...
{"title": "Apple/苹果", "price": "8168.00", "sales": 67000.0, "class2": "iphone", "store": "卓辰数码旗舰店", "class1": "手机"}
{"title": "Apple/苹果", "price": "9688.00", "sales": 67000.0, "class2": "iphone", "store": "苏宁易购官方旗舰店", "class1": "手机"}
...
本部分详细过程及代码见 https://github.com/whbing/taobaospider
首先,将结果文件传输至HDFS:
hadoop fs -put /folder/origin/... /folder/...
为了描述商品结构,我们创建javabean:
public class Product{
private String class1;
private String class2;
private int price;
private int sales;
private String store;
private String title;
...
}
通过创建SparkSession
对象获得RDD
及DataSets
进行后续分析操作。
对整个结果数据,我们以二级分类为分组,对每个商品的月销量进行reduce
操作或sql分组求和,以总销量降序排序:
String sqlText = "SELECT class2 ,class1,sum(CAST(sales AS DOUBLE)) as sum_sales,count(class2) AS class2_num
FROM tmalldata GROUP BY class2,class1 ORDER BY sum_sales DESC";
我们先选取部分分析结果,并做数据修正,原结果数据如下:
+------+------+-----------+----------+
|class2|class1| sum_sales|class2_num|
+------+------+-----------+----------+
| 裤子女| 女装|1.7876922E7| 1020|
| 苹果| 生鲜|1.4588863E7| 1020|
| 坚果| 零食|1.3379527E7| 1020|
| 秋裤| 内衣|1.2177041E7| 1020|
| 保暖内衣| 内衣|1.1318308E7| 1020|
我们发现苹果
与坚果
销量过大,查看原店铺数据,发现有分类交叉干扰:
{"title": "Apple/", "price": "6688.00", "sales": 58000.0, "class2": "苹果", "store": "苏宁易购官方旗舰店", "class1": "生鲜"}
...
{"title": "Aosailo iPhone6电池", "price": "58.00", "sales": 97000.0, "class2": "苹果", "store": "aosailo旗舰店", "class1": "生鲜"}
...
{"title": "平安夜/", "price": "45.90", "sales": 34000.0, "class2": "苹果", "store": "禧爱壹家旗舰店", "class1": "生鲜"}
...
修正数据,取部分排名靠前数据如下:
+------+------+-----------+----------+
|class2|class1| sum_sales|class2_num|
+------+------+-----------+----------+
| 裤子女| 女装|1787.69万| 1020|
| 秋裤| 内衣|1217.70万| 1020|
| 保暖内衣| 内衣|1131.83万| 1020|
| 棉袜| 内衣| 9809210.0| 1020|
| 打底衫女| 女装| 8715402.0| 1020|
| 外套男装| 男装| 8641977.0| 1020|
| 休闲裤男| 男装| 8609225.0| 1020|
| 男鞋| 鞋靴| 8176627.0| 1020|
| 饼干| 零食| 7864698.0| 1020|
|iphone| 手机| 7321395.0| 331|
| 男士袜子| 内衣| 6933028.0| 1020|
| 毛衣女| 女装| 6290753.0| 1020|
| 抽纸| 个人护理| 6096333.0| 1020|
| 针织衫女| 女装| 5841158.0| 1020|
| 牛仔裤男| 男装| 5824355.0| 1020|
| 棉衣男| 男装| 5569577.0| 1020|
| 针织衫男| 男装| 5441920.0| 1020|
| 手套| 配件配饰| 5284268.0| 1020|
| 珊瑚绒睡衣| 内衣| 5129904.0| 1020|
| 清洁剂| 个人护理| 4862618.0| 1020|
| 板鞋| 鞋靴| 4853351.0| 1020|
| 靴子| 鞋靴| 4763410.0| 1020|
| 小米| 手机| 4746490.0| 1020|
| 洁面| 美妆| 4727331.0| 960|
| 儿童裤子| 童装玩具| 4694670.0| 1020|
| 棉袜女| 内衣| 4651058.0| 1020|
| 牛肉| 生鲜| 4630011.0| 1020|
| 内裤女| 内衣| 4612125.0| 1020|
| 长袖睡衣| 内衣| 4508023.0| 1020|
| 围巾| 配件配饰| 4426260.0| 1020|
| 内裤男| 内衣| 4417667.0| 1020|
| 巧克力| 零食| 4368916.0| 1020|
| 运动裤男装| 男装| 4332190.0| 1020|
| 面膜| 美妆| 4282905.0| 900|
| 乳液| 美妆| 4207855.0| 900|
| 柠檬| 生鲜| 4167727.0| 1020|
| 帽子| 配件配饰| 4166215.0| 1020|
| 童鞋| 童装玩具| 3931569.0| 1020|
| 卫衣男装| 男装| 3862480.0| 1020|
| 雪地靴| 鞋靴| 3851849.0| 1020|
| 洗发水| 个人护理| 3812539.0| 1020|
| oppo| 手机| 3725865.0| 361|
| T恤男装| 男装| 3696852.0| 1020|
| 卫生巾| 个人护理| 3568475.0| 1020|
| 牛奶| 美食| 3537466.0| 1020|
| 男士睡衣| 内衣| 3532434.0| 1020|
| 绘本| 儿童读物| 3492248.0| 636|
...
(1) 对全部数据按销量排序,结果如下:
原文请参见 http://www.whbing.cn