社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python实战 | “端午节” 送亲戚,送长辈,粽子可视化大屏来帮忙!

杰哥的IT之旅 • 5 年前 • 739 次点击  
阅读 106

Python实战 | “端午节” 送亲戚,送长辈,粽子可视化大屏来帮忙!

这是我参与更文挑战的第 13 天,活动详情查看:更文挑战


一名致力于在技术道路上的终身学习者、实践者、分享者,一位忙起来又偶尔偷懒的原创博主,一个偶尔无聊又偶尔幽默的少年。

欢迎各位掘友们微信搜索「杰哥的IT之旅」关注,后台回复:「粽子」即可获取本文完整数据;

原文链接:Python实战 || “端午节” 送亲戚,送长辈,粽子可视化大屏来帮忙!

本文简介

今年,我用 Python 爬取了京东上面的 “粽子数据” 进行分析,看看有啥发现吧!

本文就从数据爬取数据清洗数据可视化,这三个方面入手,但你简单完成一个小型的数据分析项目,让你对知识能够有一个综合的运用。

整个思路如下:

  • 爬取网页: www.jd.com/
  • 爬取说明: 基于京东网站,我们搜索网站“粽子”数据,大概有100页。我们爬取的字段,既有一级页面的相关信息,还有二级页面的部分信息;
  • 爬取思路: 先针对某一页数据的一级页面做一个解析,然后再进行二级页面做一个解析,最后再进行翻页操作;
  • 爬取字段: 分别是粽子的名称(标题)、价格、品牌(店铺)、类别(口味);
  • 使用工具: requests+lxml+pandas+time+re+pyecharts
  • 网站解析方式: xpath

最终的效果如下:

图片

数据爬取

京东网站,一般是动态加载的,也就是说,采用一般方式只能爬取到某个页面的前30个数据(一个页面一共60个数据)。

基于本文,我仅用最基本的方法,爬取了每个页面的前30条数据(如果大家有兴趣,可以自行下去爬取所有的数据)。

那么,本文究竟爬取了哪些字段呢?我给大家做一个展示,大家有兴趣,可以爬取更多的字段,做更为详细的分析。

图片

下面为大家展示爬虫代码:

import pandas as pd
import requests
from lxml import etree
import chardet
import time
import re

def get_CI(url):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; X64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36'}
    rqg = requests.get(url,headers=headers)
    rqg.encoding = chardet.detect(rqg.content)['encoding']
    html = etree.HTML(rqg.text)
    
    # 价格
    p_price = html.xpath('//div/div[@class="p-price"]/strong/i/text()')
    
    # 名称
    p_name = html.xpath('//div/div[@class="p-name p-name-type-2"]/a/em')
    p_name = [str(p_name[i].xpath('string(.)')) for i in range(len(p_name))]
    
    # 深层url
    deep_ur1 = html.xpath('//div/div[@class="p-name p-name-type-2"]/a/@href')
    deep_url = ["http:" + i for i in deep_ur1]
    
    # 从这里开始,我们获取“二级页面”的信息           
    brands_list = []
    kinds_list = []
    for i in deep_url:
        rqg = requests.get(i,headers=headers)
        rqg.encoding = chardet.detect(rqg.content)['encoding']
        html = etree.HTML(rqg.text)
                          
        # 品牌
        brands = html.xpath('//div/div[@class="ETab"]//ul[@id="parameter-brand"]/li/@title')
        brands_list.append(brands)
                        
        # 类别
        kinds = re.findall('>类别:(.*?)</li>',rqg.text)
        kinds_list.append(kinds)
                           
    data = pd.DataFrame({'名称':p_name,'价格':p_price,'品牌':brands_list,'类别':kinds_list})
    return(data)
                           
x = "https://search.jd.com/Search?keyword=%E7%B2%BD%E5%AD%90&qrst=1&wq=%E7%B2%BD%E5%AD%90&stock=1&page="
url_list = [x + str(i) for i in range(1,200,2)] 
res = pd.DataFrame(columns=['名称','价格','品牌','类别'])

# 这里进行“翻页”操作
for url in url_list:
    res0 = get_CI(url)
    res = pd.concat([res,res0])
    time.sleep(3)

# 保存数据
res.to_csv('aliang.csv',encoding='utf_8_sig')
复制代码

最终爬取到的数据:

图片

数据清洗

从上图可以看到,整个数据算是很整齐的,不是特别乱,我们只做一些简单的操作即可。

先使用pandas库,来读取数据。

import pandas as pd

df = pd.read_excel("粽子.xlsx",index_col=False)
df.head()
复制代码

结果如下:

图片

我们分别针对 “品牌”“类别”**** 两个字段,去掉中括号。




    
df["品牌"] = df["品牌"].apply(lambda x: x[1:-1])
df["类别"] = df["类别"].apply(lambda x: x[1:-1])
df.head()
复制代码

结果如下:

图片

粽子品牌排名前10的店铺

df["品牌"].value_counts()[:10]
复制代码

结果如下:

图片

粽子口味排名前5的味道

def func1(x):
    if x.find("甜") > 0:
        return "甜粽子"
    else:
        return x
df["类别"] = df["类别"].apply(func1)
df["类别"].value_counts()[1:6] 
复制代码

结果如下:

图片

粽子售卖价格区间划分

def price_range(x): # 按照我的购物习惯,划分价格
    if x <= 50:
        return '<50元'
    elif x <= 100:
        return '50-100元'
    elif x <= 300:
        return '100-300元'
    elif x <= 500:
        return '300-500元'
    elif x <= 1000:
        return '500-1000元'
    else:
        return '>1000元'

df["价格区间"] = df["价格"].apply(price_range)
df["价格区间"].value_counts()
复制代码

结果如下:

图片

由于数据不是很多,没有很多字段,也就没有很多乱数据。因此,这里也没有做数据去重、缺失值填充等操作。所以,大家可以下去获取更多字段,更多数据,用于数据分析。

数据可视化

俗话说:字不如表,表不如图。通过可视化分析,我们可以将数据背后 “隐藏” 的信息,给展现出来。

拓展: 当然,这里只是 “抛砖引玉”,我并没有获取太多的数据,也没有获取太多的字段。这里给学习的朋友当一个作业题,自己下去用更多的数据、更多的字段,做更透彻的分析。

在这里,我们基于以下几个问题,做一个可视化展示,分别是:

  • 粽子销售店铺Top10柱形图;
  • 粽子口味排名Top5柱形图;
  • 粽子销售价格区间划分饼图;
  • 粽子商品名称词云图;

鉴于整个文章排版,本文可视化部分的代码均可在本文末尾获取。

粽子销售店铺Top10柱形图

图片

结论分析: 去年,我们分析了一些月饼的数据,“五芳斋”“北京稻香村” 这几个牌子记忆犹新,可谓是做月饼、粽子的老店。像 “三全”“思念”,在我印象中一直以为它们只做水饺和汤圆,粽子是否值得一试呢?当然,这里还有一些新的牌子,像 “诸老大”“稻香私房” 等一些牌子,大家都可以下去搜索一下。买东西,就是要精挑细选,品牌也重要。

粽子口味排名Top5柱形图

图片

结论分析: 在我印象中,小时候一直吃的最多的就是 “甜粽子”,直到我上了初中才知道,粽子还可以有肉?当然,从图中可以看出,卖 “鲜肉粽” 的店铺还是居多,毕竟这个送人,还是显得高端、大气一些。这里还有一些口味,像 “蜜枣粽”“豆沙粽”,我基本没吃过。如果你送人,你会送什么口味的呢?

粽子销售价格区间划分饼图

图片

结论分析: 这里,我故意把价格区间细分。这个饼图也很符合实际,毕竟每年就过一次端午节,还是以薄利多销为主,接近80%的粽子,售价都在100元以下。当然,还有一些中档的粽子,价格在100-300元。大于300元,我觉得也没有吃的必要,反正我是不会花这么多钱去买粽子。

粽子商品名称词云图

图片

结论分析: 从图中,可以大致看出商家的卖点了。毕竟是节日,“送礼”“礼品” 体现了节日氛围。“猪肉”“豆沙” 体现了粽子口味。当然,它是否是 “早餐” 好选择呢?购买的话,还支持 “团购” 哦。这些字眼,多多少少都会各自吸引一部分人的眼球。

图形组合为大屏

图片

本文的可视化采用的pyecharts库,进行绘制。我们先单独做好每一张图,然后进行图形整合,即可做出一张漂亮的可视化大屏。关于如何制作,可以文末获取我的源代码文件!【粽子.ipynb】

图片

公众号:「杰哥的IT之旅」,后台回复:「粽子」即可获取本文完整数据

推荐阅读


原创不易,如果你觉得这篇文章对你有点用的话,麻烦你为本文点个赞、评论或转发一下,因为这将是我输出更多优质文章的动力,感谢!

我们下期再见!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/115549