python大数据可视化分析淘宝商品,开专卖店不行啊
python大数据可视化分析淘宝商品,开专卖店不行啊
现如今大数据分析异常火爆,如何正确分析数据,并且抓住数据特点,获得不为人知的秘密?今天沉默带你用python爬虫,爬取淘宝网站进行淘宝商品大数据分析的实战!
文章目录python大数据可视化分析淘宝商品,开专卖店不行啊 1.1 淘宝搜索接口的分析1.1.1 cookie获取的途径 1.3 格式化页面,查找数据1.4 将数据存储到csv文件中 1.2 价格分布直方图实现逻辑1.3 商品销售地分析实现逻辑1.4 商品店名称聚集实现逻辑
通过这场项目实战,我将带你进入大数据分析的世界,并且学习爬虫技术,pandas,pyecharts,matplotlib等技术。 干货主要有:
① 200 多本 Python 电子书(和经典的书籍)应该有
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且可靠的练手项目及源码)
④ Python基础入门、爬虫、网络开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
私信小编01即可获取大量Python学习资源 一、明确爬取方向
淘宝的商品数量是特别巨大的,如此海量的数据我们如何去爬取,并且分析?因此我们需要明确爬取方向。怎么才可以爬取自己想分析的数据?我们最有效的方法就是从淘宝主页的搜索接口找到突破口。 1.1 淘宝搜索接口的分析
淘宝web网站
我总结如下步骤: 第一步:登录淘宝网站,获取我们登录的淘宝账号 第二步:获取我们的cookie 第三步:获取搜索接口 第四步:分析接口,确定爬取数量 1.1.1 cookie获取的途径
我们登录上淘宝账户后,按电脑的F12键,进入开发者模式
点击Network,这里就是淘宝前端接口交互的信息,然后我们随便在搜索框中搜索信息,然后在开发者框中找search接口,点击该接口,你就会找到cookie信息,复制一份信息,保存起来,待后续爬虫使用。
1.1.2 搜索接口的分析
分析搜索接口 https://s.taobao.com/search?q=小米手机&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20200415&ie=utf8&sort=sale-desc&bcoffset=0&p4ppushleft=%2C44&s=0https://s.taobao.com/search?q=小米手机&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20200415&ie=utf8&sort=sale-desc&bcoffset=0&p4ppushleft=%2C44&s=44https://s.taobao.com/search?q=小米手机&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20200415&ie=utf8&sort=sale-desc&bcoffset=0&p4ppushleft=%2C44&s=88
分析得知:每个页面参请求数基本相同,只有最后一个页码参数不同,而且是规律的: 当前页面数据 (页数-1) *
所以当我们想要将前端页面跳转至下一页爬取数据只需要将url拼接上面逻辑
运算后的数据即可。 二、爬虫脚本编写
以男士衬衫商品为例子,开展的简单数据分析,其目的是了解淘宝网站线上销售男士内裤的方法和模式。通过获取到的淘宝网站男士衬衫销售数据情况,进一步分析和判断出哪个价格区间及品牌等信息更加受到网购消费者的青睐和偏好,从而给自己买一个性价比较好的衬衫。 1.1引入库
代码如下(局部): # -*- coding: utf-8 -*- import requests import re import pandas as pd import time
如果上述的的库没有下载,请安装后在使用;(如果没有安装库,就会爆红)
## 1.2 获取页面信息 # 此处写入登录之后自己的cookies cookie = "" # 获取页面信息 def getHTMLText(url): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"} user_cookies = cookie cookies = { } for a in user_cookies.split(";"): # 因为cookies是字典形式,所以用spilt函数将之改为字典形式 name, value = a.strip().split("=", 1) cookies[name] = value try: r = requests.get(url, cookies=cookies, headers=headers, timeout=60) print(r.status_code) print(r.cookies) return r.text except: print("获取页面信息失败") return ""1.3 格式化页面,查找数据# 格式化页面,查找数据 def parsePage(html): list = [] try: views_title = re.findall(""raw_title":"(.*?)","pic_url"", html) print(len(views_title)) # 打印检索到数据信息的个数,如果此个数与后面的不一致,则数据信息不能加入列表 print(views_title) views_price = re.findall(""view_price":"(.*?)","view_fee"", html) print(len(views_price)) print(views_price) item_loc = re.findall(""item_loc":"(.*?)","view_sales"", html) print(len(item_loc)) print(item_loc) views_sales = re.findall(""view_sales":"(.*?)","comment_count"", html) print(len(views_sales)) print(views_sales) comment_count = re.findall(""comment_count":"(.*?)","user_id"", html) print(len(comment_count)) print(comment_count) shop_name = re.findall(""nick":"(.*?)","shopcard"", html) print(len(shop_name)) for i in range(len(views_price)): list.append([views_title[i], views_price[i], item_loc[i], comment_count[i], views_sales[i], shop_name[i]]) # print(list) print("爬取数据成功") return list except: print("有数据信息不全,如某一页面中某一商品缺少地区信息")1.4 将数据存储到csv文件中# 存储到csv文件中,为接下来的数据分析做准备 def save_to_file(list): data = pd.DataFrame(list) data.to_csv("F:Githubpythonobjecttaobao商品数据.csv", header=False, mode="a+") # 用追加写入的方式1.5 完整代码# -*- coding: utf-8 -*- import requests import re import pandas as pd import time # 此处写入登录之后自己的cookies cookie = "" # 获取页面信息 def getHTMLText(url): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"} user_cookies = cookie cookies = { } for a in user_cookies.split(";"): # 因为cookies是字典形式,所以用spilt函数将之改为字典形式 name, value = a.strip().split("=", 1) cookies[name] = value try: r = requests.get(url, cookies=cookies, headers=headers, timeout=60) print(r.status_code) print(r.cookies) return r.text except: print("获取页面信息失败") return "" # 格式化页面,查找数据 def parsePage(html): list = [] try: views_title = re.findall(""raw_title":"(.*?)","pic_url"", html) print(len(views_title)) # 打印检索到数据信息的个数,如果此个数与后面的不一致,则数据信息不能加入列表 print(views_title) views_price = re.findall(""view_price":"(.*?)","view_fee"", html) print(len(views_price)) print(views_price) item_loc = re.findall(""item_loc":"(.*?)","view_sales"", html) print(len(item_loc)) print(item_loc) views_sales = re.findall(""view_sales":"(.*?)","comment_count"", html) print(len(views_sales)) print(views_sales) comment_count = re.findall(""comment_count":"(.*?)","user_id"", html) print(len(comment_count)) print(comment_count) shop_name = re.findall(""nick":"(.*?)","shopcard"", html) print(len(shop_name)) for i in range(len(views_price)): list.append([views_title[i], views_price[i], item_loc[i], comment_count[i], views_sales[i], shop_name[i]]) # print(list) print("爬取数据成功") return list except: print("有数据信息不全,如某一页面中某一商品缺少地区信息") # 存储到csv文件中,为接下来的数据分析做准备 def save_to_file(list): data = pd.DataFrame(list) data.to_csv("F:Githubpythonobjecttaobao商品数据.csv", header=False, mode="a+") # 用追加写入的方式 def main(): name = [["views_title", "views_price", "item_loc", "comment_count", "views_sales", "shop_name"]] data_name = pd.DataFrame(name) data_name.to_csv("F:Githubpythonobjecttaobao商品数据.csv", header=False, mode="a+") # 提前保存一行列名称 goods = input("请输入想查询的商品名称:".strip()) # 输入想搜索的商品名称 depth = 5 # 爬取的页数 start_url = "https://s.taobao.com/search?q=" + goods # 初始搜索地址 for i in range(depth): time.sleep(3 + i) try: page = i + 1 print("正在爬取第%s页数据" % page) url = start_url + "imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20200408&ie=utf8&sort=sale-desc&bcoffset=0&p4ppushleft=%2C44&s=" + str( 44 * i) html = getHTMLText(url) # print(html) list = parsePage(html) save_to_file(list) except: print("数据没保存成功") if __name__ == "__main__": main()
运行项目,输入男士衬衫,回车,自动爬取数据
保存的商品信息csv文件:
三、数据可视化实现
数据可视化说白了,也就是通过数据分析,将得出的结果用图表的形式展示出来,图表的展示无非就是k,v的方式实现,所以我们可以借助pandas,将海量的数据分析出来,并且将分析后的数据处理成可视化表所识别的数据格式就可以实现数据可视化。我们这里可视化依赖于pyecharts和matplotlib。 1.1 引入依赖
没有以下库的请下载安装 import pandas as pd import operator from matplotlib import pyplot as plt import matplotlib as mpl from pyecharts.charts import Bar, Pie # 用于设值全局配置和系列配置 from pyecharts import options as opts mpl.rcParams["font.sans-serif"] = ["KaiTi"] # 画图时显示中文 mpl.rcParams["font.serif"] = ["KaiTi"] data = pd.read_csv("F:Githubpythonobjecttaobao商品数据.csv", encoding="utf-8")1.2 价格分布直方图实现逻辑# 商品价格分析 def priceshow(): print(data["views_price"].describe()) # 价格分布直方图 plt.figure(figsize=(16, 9)) # 这里是图片长宽比例 plt.hist(data["views_price"], bins=30, alpha=0.4, color="orange") plt.title("价格频数分布直方图") plt.xlabel("价格") plt.ylabel("频数") plt.savefig("价格分布直方图.png")
1.3 商品销售地分析实现逻辑# 分析商品的数据(商品销售地分析) def shop_localdatashow(): # 销售地分布 group_data = list(data.groupby("item_loc")) loc_num = { } for i in range(len(group_data)): loc_num[group_data[i][0]] = len(group_data[i][1]) print(loc_num) plt.figure(figsize=(30, 10)) plt.title("销售地折线图") plt.scatter(list(loc_num.keys()), list(loc_num.values()), color="r") plt.plot(list(loc_num.keys()), list(loc_num.values())) plt.xlabel("销售地区") plt.ylabel("个数") plt.savefig("销售地.png") sorted_loc_num = sorted(loc_num.items(), key=operator.itemgetter(1), reverse=True) # 排序 loc_num_10 = sorted_loc_num[:10] # 取前10 loc_10 = [] num_10 = [] for i in range(10): loc_10.append(loc_num_10[i][0]) num_10.append(loc_num_10[i][1]) plt.figure(figsize=(16, 9)) plt.title("销售地TOP10") plt.xlabel("销售地区") plt.ylabel("个数") plt.bar(loc_10, num_10, facecolor="lightskyblue", edgecolor="white") plt.savefig("销售地TOP10.png")
top10生产地表
1.4 商品店名称聚集实现逻辑
数据获取,通过pyecharts展示数据 # 分析商品店名称聚集 def shop_name(): # 店名称分析 df1 = data["shop_name"].str[-3:] shop = list(df1.groupby(df1)) # print(shop) shop_num = { } for i in range(len(shop)): shop_num[shop[i][0]] = len(shop[i][1]) shop_num["其他"] =176 - shop_num["专卖店"] - shop_num["专营店"] - shop_num["旗舰店"] data1 = sorted(shop_num.values(), reverse=True)[:4] # print(shop_num) label = ["旗舰店", "专卖店", "其他", "专营店"] # 定义饼图的标签,标签是列表 # explode = [0.01, 0.01, 0.01, 0.01] # 设定各项距离圆心n个半径 # attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] v = [shop_num["旗舰店"], shop_num["专卖店"], shop_num["其他"], shop_num["专卖店"]] arr = [label, v] return arr
这里注意: shop_num[ "其他" ] = 176 - shop_num[ "专卖店" ] - shop_num[ "专营店" ] - shop_num[ "旗舰店" ] 176是指我爬出了多少条数据信息,文件第一行是表头,不算在内。
销售店名称饼图def text(x, y): # 饼图用的数据格式是[(key1,value1),(key2,value2)],所以先使用 zip函数将二者进行组合 data_pair = [list(z) for z in zip(x, y)] ( # 初始化配置项,内部可设置颜色 Pie(init_opts=opts.InitOpts(bg_color="#2c343c")) .add( # 系列名称,即该饼图的名称 series_name="销售店名称饼图分析", # 系列数据项,格式为[(key1,value1),(key2,value2)] data_pair=data_pair, # 通过半径区分数据大小 "radius" 和 "area" 两种 rosetype="radius", # 饼图的半径,设置成默认百分比,相对于容器高宽中较小的一项的一半 radius="60%", # 饼图的圆心,第一项是相对于容器的宽度,第二项是相对于容器的高度 center=["50%", "50%"], # 标签配置项 label_opts=opts.LabelOpts(is_show=False, position="center"), ) # 全局设置 .set_global_opts( # 设置标题 title_opts=opts.TitleOpts( # 名字 title="销售店名称饼图分析", # 组件距离容器左侧的位置 pos_left="center", # 组件距离容器上方的像素值 pos_top="20", # 设置标题颜色 title_textstyle_opts=opts.TextStyleOpts(color="#ffffff"), ), # 图例配置项,参数 是否显示图里组件 legend_opts=opts.LegendOpts(is_show=False), ) # 系列设置 .set_series_opts( tooltip_opts=opts.TooltipOpts( trigger="item", formatter="{a}
{b}: {c} ({d}%)" ), # 设置标签颜色 label_opts=opts.LabelOpts(color="rgba(255, 255, 255, 0.4)"), ) .render("销售店名称饼图分析.html") )
通过分析,旗舰店的商户占比较大,所以大部分用户都是在旗舰店购买的衣服。 1.5 完整代码import pandas as pd import operator from matplotlib import pyplot as plt import matplotlib as mpl from pyecharts.charts import Bar, Pie # 用于设值全局配置和系列配置 from pyecharts import options as opts mpl.rcParams["font.sans-serif"] = ["KaiTi"] # 画图时显示中文 mpl.rcParams["font.serif"] = ["KaiTi"] data = pd.read_csv("F:Githubpythonobjecttaobao商品数据.csv", encoding="utf-8") # 商品价格分析 def priceshow(): print(data["views_price"].describe()) # 价格分布直方图 plt.figure(figsize=(16, 9)) plt.hist(data["views_price"], bins=30, alpha=0.4, color="red") plt.title("价格频数分布直方图") plt.xlabel("价格") plt.ylabel("频数") plt.savefig("价格分布直方图.png") # 分析商品的数据(商品销售地分析) def shop_localdatashow(): # 销售地分布 group_data = list(data.groupby("item_loc")) loc_num = { } for i in range(len(group_data)): loc_num[group_data[i][0]] = len(group_data[i][1]) print(loc_num) plt.figure(figsize=(30, 10)) plt.title("销售地折线图") plt.scatter(list(loc_num.keys()), list(loc_num.values()), color="r") plt.plot(list(loc_num.keys()), list(loc_num.values())) plt.xlabel("销售地区") plt.ylabel("个数") plt.savefig("销售地.png") sorted_loc_num = sorted(loc_num.items(), key=operator.itemgetter(1), reverse=True) # 排序 loc_num_10 = sorted_loc_num[:10] # 取前10 loc_10 = [] num_10 = [] for i in range(10): loc_10.append(loc_num_10[i][0]) num_10.append(loc_num_10[i][1]) plt.figure(figsize=(16, 9)) plt.title("销售地TOP10") plt.xlabel("销售地区") plt.ylabel("个数") plt.bar(loc_10, num_10, facecolor="lightskyblue", edgecolor="white") plt.savefig("销售地TOP10.png") # 分析商品店名称聚集 def shop_name(): # 店名称分析 df1 = data["shop_name"].str[-3:] shop = list(df1.groupby(df1)) # print(shop) shop_num = { } for i in range(len(shop)): shop_num[shop[i][0]] = len(shop[i][1]) shop_num["其他"] = 176 - shop_num["专卖店"] - shop_num["专营店"] - shop_num["旗舰店"] data1 = sorted(shop_num.values(), reverse=True)[:4] # print(shop_num) label = ["旗舰店", "专卖店", "其他", "专营店"] # 定义饼图的标签,标签是列表 # explode = [0.01, 0.01, 0.01, 0.01] # 设定各项距离圆心n个半径 # attr = ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"] v = [shop_num["旗舰店"], shop_num["专卖店"], shop_num["其他"], shop_num["专卖店"]] arr = [label, v] return arr def text(x, y): # 饼图用的数据格式是[(key1,value1),(key2,value2)],所以先使用 zip函数将二者进行组合 data_pair = [list(z) for z in zip(x, y)] ( # 初始化配置项,内部可设置颜色 Pie(init_opts=opts.InitOpts(bg_color="#2c343c")) .add( # 系列名称,即该饼图的名称 series_name="销售店名称饼图分析", # 系列数据项,格式为[(key1,value1),(key2,value2)] data_pair=data_pair, # 通过半径区分数据大小 "radius" 和 "area" 两种 rosetype="radius", # 饼图的半径,设置成默认百分比,相对于容器高宽中较小的一项的一半 radius="60%", # 饼图的圆心,第一项是相对于容器的宽度,第二项是相对于容器的高度 center=["50%", "50%"], # 标签配置项 label_opts=opts.LabelOpts(is_show=False, position="center"), ) # 全局设置 .set_global_opts( # 设置标题 title_opts=opts.TitleOpts( # 名字 title="销售店名称饼图分析", # 组件距离容器左侧的位置 pos_left="center", # 组件距离容器上方的像素值 pos_top="20", # 设置标题颜色 title_textstyle_opts=opts.TextStyleOpts(color="#ffffff"), ), # 图例配置项,参数 是否显示图里组件 legend_opts=opts.LegendOpts(is_show=False), ) # 系列设置 .set_series_opts( tooltip_opts=opts.TooltipOpts( trigger="item", formatter="{a}
{b}: {c} ({d}%)" ), # 设置标签颜色 label_opts=opts.LabelOpts(color="rgba(255, 255, 255, 0.4)"), ) .render("销售店名称饼图分析.html") ) # 通过matplotlib产生的饼图并不完善 # plt.title("销售店名称饼图分析") # plt.pie(data1, explode=explode, labels=label, autopct="%1.1f%%") # 绘制饼图 # plt.savefig("销售店名称.png") if __name__ == "__main__": priceshow() shop_localdatashow() dist = shop_name() print(dist[0]) print(dist[1]) text(dist[0], dist[1])四 、扩展
我在脚本设计的时候灵活的将需要爬取的商品通过控制台输入,并没有固定一个商品,所以理论上可以实现所有商品的数据分析,这里我测试,统计小米手机的数据;
在测试前,需要删除csv文件,因为在数据爬取之前我是采用追加的方式,如果文件里有其他商品,数据分析是失败的 data.to_csv("F:Githubpythonobjecttaobao商品数据.csv", header=False, mode="a+") # 用追加写入的方式
话说,专卖店生意是真不行!
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。