Python实现淘宝爬取——奶粉销售信息爬取及其数据可视化

简介

双十一刚过,TB的销售额又创下了新高,我也为2000+亿做出了贡献
恰巧买了一袋德运奶粉,味道还不错。我就在想,接触爬虫也有两个多月了,还没有爬过TB这种经典的网站,借着劲头就爬取了一下TB上奶粉的销售信息

爬虫

在淘宝框搜索奶粉,就会弹出各式各样的奶粉
在这里插入图片描述
可以爬取的有用信息:价格、销售量、商品名称、店铺、地址
淘宝是一个典型用json格式存储信息的网址,通俗讲,json格式就是一层套一层的字典,像淘宝这样一个网页中有很多商品的网页,源码看起来可能会很复杂,但都是有规律可循,需要仔细观察
在这里插入图片描述
在这里插入图片描述
通过分析,可以看出所有的商品信息都存储在开头为g_page_config = 结尾为shopcardOff":true}};的一个字典中,只需要获取这个字典然后用python中的json库进行解析即可

response = requests.get(urls,headers = headers)
response.encoding = 'utf-8'
html = response.text
#print(html)
start = html.find('g_page_config = ')+len('g_page_config = ')
end = html.find('"shopcardOff":true}')+len('"shopcardOff":true}')
js = json.loads(html[start:end+1])
# goods = re.search(r'g_page_config = (.*?)}};', response.text)
# print(goods)
# js = json.loads(str(goods))

这里列举了两种获取方式,一是用find方法,二是用正则匹配,都能成功获取网页信息
解析网页过后,就可以从获取到的信息中提取有用信息,通过分析可得知有用信息都存储在很多层嵌套的字典中,所以通过遍历这个字典提取出信息

for i in js['mods']['itemlist']['data']['auctions']:
	#产品名称
	title = i['raw_title']
	#产品价格
	price = i['view_price']
	#地区
	location = i['item_loc'].split()[0]
	#销售量
	sales = i['view_sales'].replace('人收货','')
	#评价人数
	people  = i['comment_count']
	#店铺类型
	store = i['nick']

为了便于数据分析,所以在提取信息时,将地区和销售量做了处理,例浙江 杭州浙江500人收货500

数据处理

爬取数据结果如下
在这里插入图片描述
一共有2924条数据,其实是远远少于100页中商品数量
在进行数据处理前,必须先要确定所有数据的字段是否完整
在这里插入图片描述
只有评价人数这个字段缺少一个数据,填充数据或者删去都不会对数据集整体产生很大影响
在观察数据时,可能在写入csv文件时语句不规范,出现了下图问题
在这里插入图片描述
列索引多次出现在数据集中,所以必须要删去,只需要将数据集中不包含产品名称字样的样本保留即可

data1 = data[~data['产品名称'].isin(['产品名称'])]

数据集中6个特征都为object类型,所以为了进行数据可视化,需要对数据进行强制转换
价格和评价人数数据比较规范,直接用astype进行转化即可

data1['价格'] = data1['价格'].astype(float)
data1['评价人数'] = data1['评价人数'].astype(int)

但是销售量这一样本中还有其他字符存在,可以编写一个函数处理数据

def price(e):
    if '万+' in e:
        num1 = re.findall('(.*?)万+',e)
        return float(num1[0])*10000
    elif '+' in e:
        return e.replace('+','')
    else:
        return float(e)
data1['商品销售量'] = data1['销售量'].apply(price)

同时可以通过数据字符串中特有的字符,将奶粉和店铺进行分类
奶粉大致可分为:全脂奶粉、低脂奶粉、脱脂奶粉、婴幼儿奶粉、高钙奶粉、未知
店铺大致可分为:天猫超市、旗舰店、专营店、海外类型店铺、其他店铺
已知商品价格和销售量后,也可以算出该商品的销售额

data1['销售额'] = data1['价格']*data1['商品销售量']

处理后的数据如下
在这里插入图片描述
在对处理后数据大致浏览时,出现了评价人数为0的情况
在这里插入图片描述
评价人数为0并不能判断这个数据是否对错,但是销售量8500的商品评价为0,就显着不符合常理,为了确定判断,找到了该商品,评价人数有33w+,显然这些是错误数据

list = data1[data1['评价人数']<1].index.tolist()
data1.drop([24, 138, 388, 1418, 2484],inplace = True)

drop函数直接将这几行数据删去,下面进行数据可视化

数据可视化

1.类型

在这里插入图片描述
奶粉的类型,相对来说还是婴儿奶粉比较多,由于对产品名称提取特征不够细化,所以未知也比较多,达到了800+;店铺类型则是其他店铺占比最多,普通奶粉可依据价格挑选,但是婴儿奶粉一定要依据质量挑选才可,尽可能在旗舰店这样比较可靠的店铺购买

2.店铺地址分布

在这里插入图片描述
店铺地址仍然是江浙沪、广东占据大比例,可能不止奶粉,许多其他商品的网店、配货仓库都集中分布在这些地区;众所周知,澳大利亚的奶粉是及其出名的,所以也占一定比例

3.价格

在这里插入图片描述
婴儿奶粉的价格品牌是非常多的,所以价格分布也较广泛,有的甚至达到了2000+,看来养孩子真的是不容易;相比脱脂、低脂奶粉,全脂奶粉反而价格更高,有点出乎意料,多了工序价格却还低了?当然品牌造成的影响也不可否认;高钙奶粉价格相对来说中规中矩,贵一点的也不过500左右

4.销售额前50分布

在这里插入图片描述
这份数据中奶粉销售额最高的可以达到1100w+,所以在网店中,奶粉的市场还是不小的
在这里插入图片描述
销售额TOP50份样本,43.3%的店铺都为天猫超市,旗舰店也占有22.8%,所以可见大部分人买奶粉还是会到比较可靠的网店购买的;奶粉类型还是未知占据最多,其次婴幼儿奶粉占比28.8%,而低脂奶粉和脱脂奶粉总占比6.7%,这两类奶粉会对健身人士、老年人及消化不良的婴儿的人有些益处,所以销售额也会相对较低

发布了13 篇原创文章 · 获赞 140 · 访问量 6436

猜你喜欢

转载自blog.csdn.net/weixin_43434202/article/details/103276133