前言

马上临近中秋了,月饼的销量持续增长,也推出了各个不同口味类别的月饼,价格差异也较大。我们究竟应该买哪种月饼呢?今天就一起用Python爬取某宝月饼信息,并对爬取的数据进行可视化分析,一起来看看哪种月饼最受欢迎,哪家店铺月饼销量最高吧~

直接跳到文末获取粉丝专属福利。

一、核心功能设计

总体来说,我们需要先从网站爬虫获取月饼数据,并将这些数据进行清洗,最后可视化分析展示。拆解需求,大致可以整理出我们需要分为以下几步完成:

  1. 通过爬虫获取月饼数据,主要包括月饼名称、销量、店铺、省份城市等。
  2. 对获取的数据进行预处理清洗,统一销量数据单位、省份城市等,获取清洗后的各个月饼数量。
  3. 对清洗的数据进行可视化展示,主要包括热销月饼口味TOP10、热销月饼店铺Top10、月饼价格区间分布、各省份城市月饼销量分布情况等。

二、实现步骤

1. 爬取数据

本文我们通过selenium模块进行月饼数据爬取。为了保证数据爬取顺利,首先我们需要安装selenium模块,通过pip指令即可安装。

pip install selenium

如果第一次安装使用selenium,不少人有可能会出现以下异常,那该怎么解决呢?

出现的主要原因是因为selenium模拟的客户端对浏览器的操作,但相应浏览器的驱动版本不匹配导致的。所以我们需要先了解我们当前浏览器的版本,可以打开浏览器,地址栏输入chrome://version/查看到谷歌当前的版本号。

这样我们就可以到谷歌浏览器驱动找到对应版本下载驱动就可以了。下载解压之后,可以看到chromedriver.exe。

我们需要把它拷贝到Python路径下面,至此我们就可以正常使用selenium模拟客户端浏览器操作了。
接下来我们进行网页分析,获取对应的月饼名称、店铺名、销售量、价格、地区。根据对数据分析,可以发现:

  • 各个月饼信息都在item的class=“item J_MouserOnverReq”
  • 月饼名称对应的class=“row row-2 title”
  • 价格对应的strong标签
  • 付款人数对应class=“deal-cnt”
  • 店铺信息在class="shop"中
  • 发货地区对应class=“location”


网页结构我们上面已经分析好了,那么我们就可以来动手爬取我们所需要的数据了,获取到所有的数据资源之后,可以把这些数据保存下来。

获取商品:

# author:Dragon少年
# 获取商品
def get_product(key_word):# 定位输入框browser.find_element_by_id("q").send_keys(key_word)# 定义点击按钮,并点击browser.find_element_by_class_name('btn-search').click()browser.maximize_window()# 等待20秒,方便手动登录time.sleep(20)# 定位这个“页码”,获取“共100页这个文本”page_info = browser.find_element_by_xpath('//div[@class="total"]').text# findall()返回的是一个列表page = re.findall("(\d+)", page_info)[0]return page

获取数据:

# author:Dragon少年
# 获取数据
def get_data():# 所有的信息都在items节点下items = browser.find_elements_by_xpath('//div[@class="items"]/div[@class="item J_MouserOnverReq  "]')for item in items:pro_desc = item.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text# 价格pro_price = item.find_element_by_xpath('.//strong').text# 付款人数buy_num = item.find_element_by_xpath('.//div[@class="deal-cnt"]').text# 店铺shop = item.find_element_by_xpath('.//div[@class="shop"]/a').text# 发货地address = item.find_element_by_xpath('.//div[@class="location"]').textwith open('{}.csv'.format(key_word), mode='a', newline='', encoding='utf-8-sig') as f:csv_writer = csv.writer(f, delimiter=',')csv_writer.writerow([pro_desc, pro_price, buy_num, shop, address])

selenium模拟爬取:

# author:Dragon少年
key_word = input("请输入您要搜索的商品:")browser = webdriver.Chrome()browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})browser.get('https://www.taobao.com/')page = get_product(key_word)print(page)get_data()page_num = 1while int(page) != page_num:print("=" * 100)print("正在爬取第{}页".format(page_num + 1))browser.get('https://s.taobao.com/search?q={}&s={}'.format(key_word, page_num * 44))browser.implicitly_wait(15)get_data()page_num += 1print("爬取结束!")

至此我们就可以爬取月饼的数据并保存下来,如下图所示。

2. 数据清洗

接下来我们需要把爬虫获取的数据进行清洗,首先可以去除重复数据,删除没有人购买的记录。核心代码如下:

# author:Dragon少年
# 读取爬虫数据
df = pd.read_csv("月饼.csv", encoding='utf-8-sig', header=None)
df.columns = ["商品名", "价格", "购买人数", "店铺", "地址"]
# 去除重复的数据
df.drop_duplicates(inplace=True)
print(df.shape)
# 删除购买人数0的记录
df['购买人数'] = df['购买人数'].replace(np.nan,'0人付款')

对于购买人数,有些是按照万为单位显示,我们需要将销售量进行统一,并将发货地区进行整理出各个省份信息,最后将这些清洗的数据保存下来。核心代码如下:

df['num'] = [re.findall(r'(\d+\.{0,1}\d*)', i)[0] for i in df['购买人数']]  # 提取数值
df['num'] = df['num'].astype('float')  # 转化数值型
# 提取单位(万)
df['unit'] = [''.join(re.findall(r'(万)', i)) for i in df['购买人数']]  # 提取单位(万)
df['unit'] = df['unit'].apply(lambda x:10000 if x=='万' else 1)
# 计算销量
df['销量'] = df['num'] * df['unit']# 删除没有发货地址的店铺数据 获取省份
df = df[df['地址'].notna()]
df['省份'] = df['地址'].str.split(' ').apply(lambda x:x[0])
# 删除多余的列
df.drop(['购买人数', '地址', 'num', 'unit'], axis=1, inplace=True)
# 重置索引
df = df.reset_index(drop=True)
df.to_csv('月饼清洗数据.csv')

至此我们就可以把爬取的月饼数据整理清洗完毕,如下图所示。

3. 可视化分析

接下来我们就需要对数据进行可视化显示, 这里使用的是pyecharts,是一个用于生成Echarts图表的类库,便于在Python中根据数据生成可视化的图表。

之前博主有写过一篇关于pyecharts的文章,里面很详细的介绍了各类图表的使用方法和案例,不会的可以先去学习下pyecharts相关的内容。【一文学会炫酷图表利器pyecharts】

销量Top10店铺:

下面我们可以读取清洗结束的数据,通过对店铺分组获取各个店铺的月饼销量数据,统计出销量前十的店铺,通过柱状图显示。核心代码如下:

# 计算月饼总销量Top10的店铺
shop_top10 = df.groupby('店铺')['销量'].sum().sort_values(ascending=False).head(10)
# 绘制柱形图
bar1 = Bar(init_opts=opts.InitOpts(width='600px', height='450px'))
bar1.add_xaxis(shop_top10.index.tolist())
bar1.add_yaxis('销量', shop_top10.values.tolist())
bar1.set_global_opts(title_opts=opts.TitleOpts(title='销量Top10店铺-Dragon少年'),xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30)))
bar1.render("销量Top10店铺-Dragon少年.html")
bar1.render_notebook()


我们可以看到稻香村食品店、天猫超市、华美食品、臻味食品等销量居前,其中销量最好的是稻香村,总销量遥遥领先。

销量Top10月饼:

我们还可以通过对月饼名称进行月饼分组获取销量最好的月饼,统计出销量前十的月饼,通过柱状图显示。核心代码如下:

# 计算销量top10月饼
shop_top10 = df.groupby('商品名')['销量'].sum().sort_values(ascending=False).head(10)# 绘制柱形图
bar0 = Bar(init_opts=opts.InitOpts(width='750px', height='450px'))
bar0.add_xaxis(shop_top10.index.tolist())
bar0.add_yaxis('销量', shop_top10.values.tolist())
bar0.set_global_opts(title_opts=opts.TitleOpts(title='销量Top10月饼-Dragon少年'),xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30)))
bar0.render("销量Top10月饼-Dragon少年.html")
bar0.render_notebook()


我们可以看到最受欢迎的10种月饼,其中的稻香村月饼礼盒装最受欢迎,销量达到了50w份。

不同价格月饼销量占比:

我们接下来还可以根据月饼的价格区间进行划分,统计50元以下,50-150元,150-500元,500元以上的各个价格区间月饼的销量分布,并通过饼图进行可视化显示。核心代码如下:

def price_range(x): #按照淘宝推荐划分价格区间if x <= 50:return '50元以下'elif x <= 150:return '50-150元'elif x <= 500:return '150-500元'else:return '500元以上'
df['price_range'] = df['价格'].apply(lambda x: price_range(x))
price_cut_num = df.groupby('price_range')['销量'].sum()
data_pair = [list(z) for z in zip(price_cut_num.index, price_cut_num.values)]
# 饼图
pie1 = Pie(init_opts=opts.InitOpts(width='750px', height='350px'))
# 内置富文本
pie1.add( series_name="销量",radius=["35%", "55%"],data_pair=data_pair,label_opts=opts.LabelOpts(formatter='{b}—占比{d}%'),
)
pie1.set_global_opts(legend_opts=opts.LegendOpts(pos_left="left", pos_top='30%', orient="vertical"), title_opts=opts.TitleOpts(title='不同价格月饼销量占比-Dragon少年'))
pie1.render("不同价格月饼销量占比-Dragon少年.html")
pie1.render_notebook()


可以看出来,月饼的销售价格主要分布在≤150元之间,占据了销量的84%左右,单份月饼价格超过500元的购买的人较少。

各省月饼销量分布:

最好我们在统计下,月饼的产地销量分布省份地区,并通过地图可视化显示。核心代码如下:

# 计算销量
province_num = df.groupby('省份')['销量'].sum().sort_values(ascending=False)
# 绘制地图
map1 = Map(init_opts=opts.InitOpts(width='750px', height='350px'))
map1.add("", [list(z) for z in zip(province_num.index.tolist(), province_num.values.tolist())],maptype='china')
map1.set_global_opts(title_opts=opts.TitleOpts(title='各省月饼销量分布-Dragon少年'),visualmap_opts=opts.VisualMapOpts(max_=300000))
map1.render("各省月饼销量分布-Dragon少年.html")
map1.render_notebook()


可以看到月饼的销售地分布最多的是广东和浙江省,这两个省月饼销量最受欢迎。至此,月饼数据爬虫及分析可视化就完成啦~ 大家看完分析想好买什么月饼了吗?

源码及数据已上传,关注文末公众号回复【月饼源码】即可获取完整源码

Python往期精彩:

  • 见过仙女蹦迪吗?一起用python做个小仙女代码蹦迪视频

  • python自制一款炫酷音乐播放器,想听啥随便搜!

  • 斗地主老是输?一起用Python做个AI出牌器,豆子蹭蹭涨!

  • 桌面太单调?一起用Python做个自定义动画挂件,好玩又有趣!

  • 一起用Python做个车牌自动识别系统,好玩又实用!

  • 桌面太单调?一起用Python做个自定义动态壁纸,竟然还可以放视频!

  • 一起用Python做个自动化弹钢琴脚本,我竟然弹出了《天空之城》!
    往期精彩源码均可通过下方公众号获取

中秋节月饼不知道买哪种?Python爬取4000种月饼类别告诉你答案!相关推荐

  1. 双11,用Python爬取4000多条笔记本电脑的销售数据并分析

    双11,用Python爬取4000多条笔记本电脑的销售数据并分析 2022年,大部分电子产品的销量都在下滑,比如手机,一方面,产品的创新和提升不足,另一方面,大部分人更愿意把钱存起来,降低生活中其他因 ...

  2. Python应用实战-Python爬取4000+股票数据,并用plotly绘制了树状热力图(treemap)

    目录: 1. 准备工作 2. 开始绘图 2.1. 简单的例子 2.2. px.treemap常用参数介绍 2.3. color_continuous_scale参数介绍 2.4. 大A股市树状热力图来 ...

  3. 仅用半小时,从Python爬取到BI可视化,告诉你深圳房价有多贵

    我有个小外甥,今年准备毕业,在我的极力劝说下来到了深圳工作,那第一件事就是租房子了. 深圳的房价大家也知道,最近几年涨的厉害,3万一平都买不到什么好房子,其实看到这个情况,我着实为下一代担心,月入2W ...

  4. Python爬取历年招聘数据,告诉你如何成为备受追捧的数据分析工程师!

    作者 | 法纳斯特 责编 | 郭芮 近年来,数据分析师的需求热度持续攀升,并且随着数据价值的不断挖掘越发得到市场认可.一个喜闻乐见的事实是,数据分析师.数据挖掘工程师.乃至于数据科学家都会有着较高的起 ...

  5. 【知乎热榜爬虫】python爬取知乎热榜问题及答案

    所用库 requests xpath解析库 multiprocessing多进程 pymysql数据库操作库 实战背景 主要是爬取知乎热榜的问题及点赞数比较高的答案,通过requests请求库进行爬取 ...

  6. python周末吃什么_中午不知道吃什么,用Python爬取美团外卖评论帮你选餐

    一.介绍 朋友暑假实践需要美团外卖APP评论这一份数据,一开始我想,这不就抓取网页源代码再从中提取数据就可以了吗,结果发现事实并非如此,情况和之前崔大讲过的分析Ajax来抓取今日头条街拍美图类似,都是 ...

  7. 哪些程序员在围观 996.ICU?Python 爬取 40000 条 GitHub 数据告诉你!

    作者丨Alfred 责编 | 伍杏玲 本文经授权转载自 Alfred数据室(ID:Alfred_Lab) 最近程序员界发生了一件大事儿.如果说"流浪大师" 沈巍在抖音快手里是顶级流 ...

  8. Python 爬取北京二手房数据,分析北漂族买得起房吗?(附完整源码)

    来源:CSDN 本文约3500字,建议阅读9分钟. 本文根据Python爬取了赶集网北京二手房数据,R对爬取的二手房房价做线性回归分析,适合刚刚接触Python&R的同学们学习参考. 房价高是 ...

  9. Python爬取视频之爱情电影及解密TS文件和两种合并ts的方法

    俗话说,兴趣所在,方能大展拳脚.so结合兴趣的学习才能事半功倍,更加努力专心,apparently本次任务是在视频网站爬取一些好看的小电影,地址不放(狗头保命)只记录过程. 实现功能: 从网站上爬取采 ...

最新文章

  1. Python enumerate() 函数的使用
  2. UVa1062 - Containers贪心算法
  3. 记住:用户不是傻*,她是你的老婆大人
  4. iOS之深入解析bitcode的功能与应用
  5. 限制网速 制造测试条件
  6. html计时器组件,vue 计时器组件的实现代码
  7. 【今日CS 视觉论文速览】Mon, 7 Jan 2019
  8. 成熟的Richardson模型
  9. 华为奇葩面试题:一头牛重800公斤一座桥承重700公斤,请问牛怎么过桥?
  10. 165. 小猫爬山(状压dp)
  11. MSVCR71.dll is missing from your computer-(Window7 install sqldeveloper for oracle )
  12. oracle同义词ddl,同义词 oracle,oracle里synonym的作用是什么?
  13. Origin的基础实验数据处理
  14. 都掏出来了,大学四年珍藏的26个宝藏网站,全部整理好给大家!!!
  15. 删除oracle所有表外键,Oracle中查询、禁用、起用、删除表外键
  16. 为Chrome设置代理
  17. 【LINUX】libgd-GD库安装
  18. 随笔日记2018 4.10 关于多选框
  19. 深度linux系统联想e42-80安装,联想E42-80笔记本win10改win7系统
  20. vue 实现强制类型转换 ,将数字变为字符串,字符串变为数字,数组数字变为字符串、js对象转数组

热门文章

  1. 【系统分析师之路】系统分析师再启程
  2. 电脑显示服务器意外终止啥意思,服务意外终止,请朋友们帮忙看一下什么原因...
  3. 部署Grafana环境 报错
  4. 参与国际化项目需遵循的java命名规范
  5. android 7相机拍照功能介绍,镜头配备及拍照功能介绍_华为 Mate 7_手机Android频道-中关村在线...
  6. Misc_冰蝎流量分析
  7. 全光谱台灯哪个牌子好?2022最新LED全光谱护眼台灯推荐
  8. 能让你更早下班的Python垃圾回收机制
  9. matlab二维信号卷积,matlab的二维卷积操作
  10. 电源的纹波及电压范围