用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

Aidan075
• 阅读 1613

↑ 点击上方 “凹凸数据” 关注 + 星标 ~

文章干货!有福利 ! 用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

端午节快要到了,甜咸粽子之争也快要拉开帷幕。

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

小五准备用Python爬取淘宝上的粽子数据并进行分析,看看有什么发现。

(顺便送大家一波福利)

爬虫

爬取淘宝数据,本次采用的方法是:Selenium控制Chrome浏览器自动化操作[1]。其实我们还可以利用Ajax接口来构造链接,但是非常繁琐(包含加密秘钥等),直接使用Selenium来模拟浏览器会省去很多事情;

之前的文章我们也用过相同的方法,比如:爬电脑、爬电脑、爬完电脑买不起

最常见的问题是chromedriver驱动与谷歌浏览器的版本不匹配,很容易就可以解决。接下来,我们就开始利用selenium抓取淘宝商品,并使用Xpath解析得到商品名、价格、付款人数、店铺名、发货地址信息,最后将数据保存在本地。

爬虫过程如下图:

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

selenium自动化爬取(需要淘宝扫描登录一次)

from selenium import webdriver  

# 搜索商品,获取商品页码  
def search_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()  
    # 等待15秒,给足时间我们扫码  
    time.sleep(15)  
    # 定位这个“页码”,获取“共100页这个文本”  
    page_info = browser.find_element_by_xpath('//div[@class="total"]').text  
    # 需要注意的是:findall()返回的是一个列表,虽然此时只有一个元素它也是一个列表。  
    page = re.findall("(\d+)",page_info)[0]  
    return page  

详细爬虫代码下载见文末。

数据整理

此时我们爬取得到的数据:

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

整理前的数据

数据还是比较粗糙的,有几个问题需要我们去处理:

  1. 添加列名

  2. 去除重复数据(翻页爬取过程中会有重复)

  3. 购买人数为空的记录,替换成0人付款

  4. 将购买人数转换为销量(注意部分单位为

  5. 删除无发货地址的商品,并提取其中的省份

部分代码:

# 删除无发货地址的商品,并提取省份  
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.head(10) 

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

整理后的数据

这样我们就对数据完成了清洗与整理,方便下一步进行可视化。

顺便做个排序,看看什么粽子最贵!

df1 = df.sort_values(by="价格", axis=0, ascending=False)  
df1.iloc[:5,:]  

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

价格TOP5的粽子

前三名都来自御茶膳房旗舰店,让我们看看1780元的粽子长啥样吧!

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

想尝尝用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

数据可视化

本文我们打算用pyecharts进行可视化展示。有同学可能使用的是老版本(0.5X),Pyecharts的1.x版本与老版本(0.5X)不兼容,如果无法导入可能是这个问题哈。

可视化所有语句均基于v1.7.1,通过以下语句可查询你的pyecharts版本:

import pyecharts  

print(pyecharts.__version__)  

具体安装与使用案例可以参考教程:Pyecharts 1.x 教程

扇形图

最贵的粽子1780元看来是吃不起了,那大家都买什么价位的呢?

先按照淘宝推荐的区间划分一下:

def price_range(x): #按照淘宝推荐划分价格区间  
    if x <= 22:  
        return '22元以下'  
    elif x <= 115:  
        return '22-115元'  
    elif x <= 633:  
        return '115-633元'  
    else:  
        return '633元以上'  

再使用pyecharts来生成不同价格区间的粽子销量占比图。

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

不同价格区间的粽子销量占比

看来百元以内的粽子(礼盒装)才是大家的正常承受范围,不过我还是选择小区门口的5块钱3个。

词云图

我们用jieba对爬取得到的商品名称分词,生成词云。

from pyecharts.charts import WordCloud  
from pyecharts.globals import SymbolType  

# 词云图  
word1 = WordCloud(init_opts=opts.InitOpts(width='1350px', height='750px'))  
word1.add("", [*zip(key_words.words, key_words.num)],  
          word_size_range=[20, 200],  
          shape=SymbolType.DIAMOND)  
word1.set_global_opts(title_opts=opts.TitleOpts('粽子商品名称词云图'),  
                      toolbox_opts=opts.ToolboxOpts())  
word1.render("粽子商品名称词云图.html")  

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

粽子商品名称词云图

硕大的粽子周围环绕着几个突出的关键词:礼盒装鲜肉蛋黄嘉兴豆沙端午节。除去端午节相关的词汇,我们通过关键词大小似乎就知道几种口味的受欢迎情况。

查阅资料对比一下,还真是大体一致。

心疼我枣粽。

至于嘉兴这个地名,我们后文会继续提到。

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

条形图

上文我们查到了最贵的粽子,那么销量最好的粽子/店铺是什么呢?

安排

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

粽子商品销量Top10

五芳斋共4款入围,其中一款礼盒装达到了100万+的销量,应该比这个还多(参见微信的10w+)。真真老老紧随其后,3款粽子进入TOP10。其余的品牌还有稻香村知味观,额,第九名是卖粽叶的,看来自己包粽子的需求也是蛮大的嘛。

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

粽子店铺销量Top10

粽子店铺销量Top10其实与商品相似,五芳斋官方旗舰店真真老老旗舰店占据首位,遥遥领先。

经过查阅,五芳斋,真真老老,都为嘉兴的粽子两大品牌,那难怪嘉兴在词云图里那么突出。嘉兴属于浙江省,销量冠亚军都在这里,那浙江岂不是占比很大。

还真是这样:

地图

继续使用pyecharts来生成各省份粽子销量分布图[2]

from pyecharts.charts import Map   

# 计算销量  
province_num = df.groupby('省份')['销量'].sum().sort_values(ascending=False)   

# 绘制地图  
map1 = Map(init_opts=opts.InitOpts(width='1350px', height='750px'))  
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='各省份粽子销量分布'),  
                     visualmap_opts=opts.VisualMapOpts(max_=300000),  
                     toolbox_opts=opts.ToolboxOpts()  
                    )  
map1.render("各省份粽子销量分布.html")  

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

各省份粽子销量分布

这个销量占比差异真的是太大了。

可以说中国粽子看浙江,浙江粽子看嘉兴[3](通过计算发货地址为浙江的粽子销量占比70.6%,而嘉兴占浙江的87.4%)

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

纪录片《舌尖上的中国》里的嘉兴粽

小结

粽子自古以来就代表着纪念和美好的祝愿。

而在这个并不安稳的2020,端午的粽子更多了一些祈愿国泰民安,顺利度过阴霾的意义。

“端午安康”不再是一句客套话,而是我们能送给彼此的最好的愿景。

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

本文数据和爬虫可视化源码下载地址:

https://alltodata.cowtransfer.com/s/d11c8906cd9c4c

参考文章

[1]

数据分析与统计学之美: 《手把手教你爬取淘宝的笔记本电脑数据,指导你如何选购电脑!》

[2]

CDA数据分析师: 《全网谁家热干面销量最高?》

[3]

新农堂: 《你对粽子的力量可能一无所知》

福利时间

端午节就要来了,腾讯云+社区联合凹凸数据给大家送15份腾讯云+社区定制五芳斋粽子礼盒

没错,五芳斋就是上文中经过我们分析得到的:最受欢迎(销量最好)的粽子品牌。

用python爬取4332条粽子数据进行分析,再送15盒粽子给大家

本文转转自微信公众号凹凸数据原创https://mp.weixin.qq.com/s/RhwSLCuBbirYsJ2nUkb6gg,可扫描二维码进行关注: 用python爬取4332条粽子数据进行分析,再送15盒粽子给大家 如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这