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


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

    2022年,大部分电子产品的销量都在下滑,比如手机,一方面,产品的创新和提升不足,另一方面,大部分人更愿意把钱存起来,降低生活中其他因素带来的风险。

    至于手机、笔记本电脑这些电子产品,只要能用,大部分人都不会选择换新。

    马上双11,本文爬取了4000多条某宝的笔记本电脑销售数据,分析当前笔记本的整体价格情况。

    数据获取

    先进入某宝首页,在搜索框输入关键词“笔记本电脑”,然后拖动滚动条到下方翻页处,点击几次“下一页”和“上一页”,把每个页面的url复制出来进行对比,观察url的变化。发现每次变化的参数都是页面相关的参数s,所以代码中改变s参数就可以依次获取每个页面的数据。

    核心的代码如下(受篇幅限制,文末提供完整代码获取方式):

    def get_taobao_data():
        df_data = pd.DataFrame()
        for p in range(PAGE):
            try:
                print("-----开始获取第{}页数据-------".format(p+1))
                url = 'https://s.taobao.com/search?q={}&s={}'.format(GOODS, 44*p)
                res = requests.get(url, headers=headers, timeout=30)
                print("---------获取第{}页数据成功---{}".format(p+1, res.status_code))
                df_res = data_parse(res.text)
                df_data = pd.concat([df_data, df_res])
            except Exception as e:
                time.sleep(10)
                print("---------获取第{}页数据失败---{}".format(p+1, e))
                continue
            time.sleep(10)
        df_data.to_excel('taobao_data_{}.xlsx'.format(GOODS))
    
    
    if __name__ == '__main__':
        get_taobao_data()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    本文获取了前100页数据,共4044条。

    在这里插入图片描述
    初步检查了数据,这份数据是很完整的,没有缺失值,只是其中的“付款人数”是数字加文字的字符串,可以先清洗成只有数字,也可以后面可视化时再解析。因为处理不复杂,所以本文等取数时再处理。

    数据分析

    本文的分析和可视化主要围绕“价格”和“购买人数”这两个特征,拿到数据后,你可以根据自己关注的点做更多的分析。

    1.笔记本电脑的价格分布

    def computer_price():
        """笔记本电脑的价格分布"""
        df = pd.read_excel('taobao_data_笔记本电脑.xlsx')
        price = df['售价']
        sections = [0, 2500, 5000, 7500, 10000, 12500, 15000, 100000]
        group_names = ['2500以下', '2500-5000', '5000-7500', '7500-10000', '10000-12500', '12500-15000', '15000以上']
        cuts = pd.cut(np.array(price), sections, labels=group_names)
        price_counts = pd.value_counts(cuts)
        pie = Pie(init_opts=opts.InitOpts(width='800px', height='600px', bg_color='white'))
        pie.add(
            '', [list(z) for z in zip([gen for gen in price_counts.index], price_counts)],
            radius=['0', '60%'], center=['50%', '50%'],
            itemstyle_opts=opts.ItemStyleOpts(border_width=2, border_color='white'),
        ).set_series_opts(
            label_opts=opts.LabelOpts(formatter="{d}%", position='top'),
        ).set_global_opts(
            title_opts=opts.TitleOpts(title='笔记本电脑价格区间分布', pos_left='300', pos_top='40',
                title_textstyle_opts=opts.TextStyleOpts(color='blue', font_size=20)),
            legend_opts=opts.LegendOpts(pos_right=20, pos_top=250, orient='vertical')
        ).set_colors(
            ['rgba(0, 0, 255, {a})'.format(a=0.9-0.1*x) for x in range(len(group_names))]
        ).render('computer_price_counts.html')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述
    只看价格,分布最多的两个价格区间是2500-5000和5000-7500,超过1W的笔记本电脑加起来也不到8%。

    2.笔记本电脑的购买人数分布

    def computer_sales_num():
        """笔记本电脑的购买人数"""
        df = pd.read_excel('taobao_data_笔记本电脑.xlsx')
        sales_num = df['付款人数'].apply(lambda x: int(re.findall(r'\d+', x)[0]))
        sections = [-1, 49, 99, 199, 499, 999, 100000]
        group_names = ['50以下', '50-100', '100-200', '200-500', '500-1000', '1000以上']
        cuts = pd.cut(np.array(sales_num), sections, labels=group_names)
        sales_num_counts = pd.value_counts(cuts)
        pie = Pie(init_opts=opts.InitOpts(width='800px', height='600px', bg_color='white'))
        pie.add(
            '', [list(z) for z in zip([gen for gen in sales_num_counts.index], sales_num_counts)],
            radius=['30%', '60%'], center=['50%', '50%'],
            itemstyle_opts=opts.ItemStyleOpts(border_width=2, border_color='white'),
        ).set_series_opts(
            label_opts=opts.LabelOpts(formatter="{c}", position='top'),
        ).set_global_opts(
            title_opts=opts.TitleOpts(title='笔记本电脑购买人数分布', pos_left='300', pos_top='40',
                title_textstyle_opts=opts.TextStyleOpts(color='rgba(60, 120, 60)', font_size=20)),
            legend_opts=opts.LegendOpts(pos_right=30, pos_top=250, orient='vertical')
        ).set_colors(
            ['rgba(60, 120, 60, {a})'.format(a=0.9-0.1*x) for x in range(len(group_names))]
        ).render('computer_sales_num_counts.html')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述
    再从购买人数看,超过7成的电脑成交量在50台以下,同一家店铺同一款电脑能卖出500台以上的非常少。

    3.购买人数超过500的价格分布

    def computer_sales500_price():
        """购买人数超过500的笔记本电脑价格分布"""
        df = pd.read_excel('taobao_data_笔记本电脑.xlsx')
        df['人数'] = df['付款人数'].apply(lambda x: int(re.findall(r'\d+', x)[0]))
        sales500_price = df.loc[df['人数'] >= 500, '售价']
        sections = [0, 2500, 5000, 7500, 10000, 100000]
        group_names = ['2500以下', '2500-5000', '5000-7500', '7500-10000', '10000以上']
        cuts = pd.cut(np.array(sales500_price), sections, labels=group_names)
        price_counts = pd.value_counts(cuts)
        pie = Pie(init_opts=opts.InitOpts(width='800px', height='600px', bg_color='white'))
        pie.add(
            '', [list(z) for z in zip([gen for gen in price_counts.index], price_counts)],
            radius=['0', '60%'], center=['50%', '50%'],
            itemstyle_opts=opts.ItemStyleOpts(border_width=2, border_color='white'),
        ).set_series_opts(
            label_opts=opts.LabelOpts(formatter="{c}款:{d}%", position='top'),
        ).set_global_opts(
            title_opts=opts.TitleOpts(title='购买人数500以上的笔记本电脑价格分布', pos_left='250', pos_top='40',
                title_textstyle_opts=opts.TextStyleOpts(color='blue', font_size=20)),
            legend_opts=opts.LegendOpts(pos_right=10, pos_top=250, orient='vertical')
        ).set_colors(
            ['rgba(0, 0, 255, {a})'.format(a=0.9-0.1*x) for x in range(len(group_names))]
        ).render('computer_sales500_price_counts.html')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述
    同时看价格和购买人数两个特征,根据单款购买人数超过500的笔记本电脑价格分布,分布最多的区间是5000-7500和2500-5000。

    与不考虑购买人数时对比,5000-7500区间的占比提高了近10%,说明这个价格区间的购买人数最多。

    4.购买人数超过500的价格Top20

    def computer_sales500_price_Top20():
        """购买人数超过500的笔记本电脑价格Top20"""
        df = pd.read_excel('taobao_data_笔记本电脑.xlsx')
        df['人数'] = df['付款人数'].apply(lambda x: int(re.findall(r'\d+', x)[0]))
        sales500_price = df.loc[df['人数'] >= 500, '售价']
        sales500_price_top20 = sales500_price.sort_values(ascending=False)[0: 20]
        sales500_price_top20_shop = df.loc[sales500_price_top20.index, '店铺名']
        bar = Bar(init_opts=opts.InitOpts(width='1000px', height='400px', bg_color='white'))
        bar.add_xaxis(
            sales500_price_top20_shop.to_list()
        ).add_yaxis(
            '', sales500_price_top20.to_list(), category_gap=20
        ).set_global_opts(
            title_opts=opts.TitleOpts(title='购买人数超过500的笔记本电单价Top20', pos_left='350', pos_top='30',
                title_textstyle_opts=opts.TextStyleOpts(color='#4863C4', font_size=16)),
            xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=10, rotate=25, color='#4863C4'))
        ).set_colors('#4863C4').render('computer_sales500_price_top20.html')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述
    把购买人数超过500的单价Top20展示出来,发现仅有一款单价超过1W的。如果看店铺的名字,某品牌占了“半壁江山”。

    5.销售标题信息提取

    def computer_title_word_cloud():
        """笔记本电脑的标题词云"""
        df = pd.read_excel('taobao_data_笔记本电脑.xlsx')
        title_content = df['标题']
        all_word = ','.join([str(t) for t in title_content])
        cut_text = jieba.cut(all_word)
        result = ' '.join(cut_text)
        pic = Image.open("computer.png")
        shape = np.array(pic)
        exclude = {'代'}
        image_colors = ImageColorGenerator(shape)
        wc = WordCloud(font_path="simhei.ttf", width=800, height=600, max_words=800, max_font_size=80, min_font_size=5,
                       background_color='white', color_func=image_colors,
                       contour_width=3, contour_color='steelblue', stopwords=exclude,
                       prefer_horizontal=1, mask=shape, relative_scaling=0.5)
        wc.generate(result)
        wc.to_file("ciyun_computer_title.png")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述
    现在的店铺标题普遍都起得很长,主要目的是为了包含更多的关键词,提高被搜索到的几率,所以本文将标题的信息制作成词云。

    从结果来看,主要信息里的关键词都是与笔记本电脑强相关的,如英特尔、i5、i7等主要与性能相关,游戏本、办公、商务等主要与功能定位相关,轻薄、便携、全面屏等主要与电脑的特点相关。

    总结

    本文主要分为两个部分,一个部分是用爬虫获取某宝的数据,一个部分是用Python进行简单分析和可视化。

    本文的内容仅供学习和练习Python相关知识使用和参考,勿作他用。

    完整的代码可以在下方用WX关注“小斌哥ge”,然后在后台回复“笔记本电脑”获取。欢迎一键三连。

    相关阅读
    Python房价分析和可视化<fangtianxia新房>

  • 相关阅读:
    电脑重装系统后Word文档如何横向排版
    图像处理解决方案 veImageX 技术演进之路
    全链路压测:影子库与影子表之争
    懒羊羊闲话4 - 献给那些苦于学习无法入门的同学
    xshell和linux什么关系,其实很简单
    微信管理系统的便捷功能:自动回复
    餐厅订座预约小程序的效果如何
    代码随想录算法训练营第23期day57|739. 每日温度、496.下一个更大元素
    人脸识别5.1.2- insightface人脸检测模型RetinaFace-Paddle
    看完这篇,你也可以画出有趣的动态曲线
  • 原文地址:https://blog.csdn.net/weixin_43790276/article/details/127776408