程序笔记   发布时间:2022-07-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

朋友们࿰c;一年一度的中秋悄然而至࿰c;为了响应这次节日࿰c;特意写了这篇文章࿰c;希望能和大家一起学习。

中秋节介绍

中秋节࿰c;又称祭月节、月光诞、月夕、秋节、仲秋节、拜月节、月娘节、月亮节、团圆节等࿰c;是中国民间的传统节日。

中秋节自古便有祭月、赏月、吃月饼、玩花灯、赏桂花、饮桂花酒等民俗࿰c;流传至今࿰c;经久不息。

每年中秋节到࿰c;总会去姥姥那里送中秋࿰c;并买上各种各样的月饼࿰c;那个时候科技并不怎么发达࿰c;不仅没有这么多形形色色的月饼࿰c;也不知道哪些月饼卖得好? 月饼的价格分布是怎样的呢? 什么地方的月饼销量最高呢? 简直有十万个为什么࿰c;希望别人给我们解答。

随着科技的飞速发展࿰c;互联网沟通了你我他。通过淘宝上月饼的销量࿰c;就可以解决我们想要知道的好多问题。基于此࿰c;我爬取了淘宝上4000多条月饼的销售数据࿰c;为大家展示了一幅漂亮的可视化大屏࿰c;解决大家心目中的问题。

爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!

SELEnium模块的安装与配置

这次爬取淘宝࿰c;采用的是最简单的方式:SELEnium控制Chrome浏览器进行自动化操作࿰c;中途只需要扫码登陆一次࿰c;即可完成整个数据的爬取。

1)安装SELEnium库

pip install SELEnium

检验是否安装成功:

爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!

2)chromedriver驱动的配置

配置chromedriver驱动࿰c;一定要注意“驱动”和“谷歌浏览器”版本一定是要相匹配࿰c;否则不能使用。

① 检查谷歌浏览器的版本

这里首先提供一个详细的地址供大家查看: https://jingyan.baidu.com/article/95c9d20d74a1e8ec4f756149.html 点击“右上角三个点” --> 点击“设置” --> 点击 “关于chrome”࿰c;出现如下界面。

爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!

② 下载chromedriver驱动

这里再次提供一个详细的地址࿰c;供大家选择各种版本驱动程序: http://chromedriver.storage.googleapis.com/index.html 从上面的图中可以看出c;谷歌浏览器的版本是【81.0.4044.138】࿰c;这里我们选择的对应版本的驱动࿰c;如下图所示。

爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!

点进该文件后࿰c;可以根据我们的操作系统࿰c;选择对应的驱动。

爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!

③ chromedriver驱动的配置

解压上述下载好的文件࿰c;并将解压后我们得到的chromedriver.exe文件࿰c;需要放到python的安装路径下(和python.exe放在一起)。 首先࿰c;你可以查看你的python解释器安装在哪里!

爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!

然后࿰c;将chromedriver.exe放置和python.exe在一起。

爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!

3)检验SELEnium是否可用

使用如下两行代码࿰c;如果谷歌浏览器成功被驱动打开࿰c;证明上述安装和配置没问题。

from SELEnium import webdriver
browser = webdriver.Chrome()

结果如下:

爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!

4)一个小案例展示SELEnium的操作效果

from SELEnium import webdriver
import time

# 创建浏览器对象࿰c;该操作会自动帮我们打开Google浏览器窗口
browser = webdriver.Chrome()

# 调用浏览器对象࿰c;向服务器发送请求。该操作会打开Google浏览器࿰c;并跳转到“百度”首页
browser.get("https://www.baidu.com/")

# 最大化窗口
browser.@H_42_73@maximize_window()

# 定位“抗击肺炎”链接内容
element = browser.find_elemenT_By_link_text("抗击肺炎")
# 为了更好的展示这个效果࿰c;我们等待3秒钟
time.sleep(3)
# 点击上述链接
element.click()

# 我们再让浏览器停留3秒钟后࿰c;再关闭浏览器
time.sleep(3)
# 操作会自动关闭浏览器
browser.close()
"""
效果这里就不展示了࿰c;大家自行下去尝试!
"""

爬虫完整带啊吗

from SELEnium import webdriver
import time
import csv
import re

# 搜索商品࿰c;获取商品页码
def search_product(key_word):
    # 定位输入框
    browser.find_elemenT_By_id("q").send_keys(key_word)
    # 定义点击按钮࿰c;并点击
    browser.find_elemenT_By_class_name('btn-search').click()
    # 最大化窗口:为了方便我们扫码
    browser.@H_42_73@maximize_window()
    # 等待15秒࿰c;给足时间我们扫码
    time.sleep(15)
    # 定位这个“页码”࿰c;获取“共100页这个文本”
    page_info = browser.find_elemenT_By_xpath('//div[@class="@R_452_10586@l"]').text
    # 需要注意的是:findall()返回的是一个列表࿰c;然此时只有一个元素它也是一个列表。
    page = re.findall("(d+)",page_info)[0]
    return page

# 获取数据
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"]').text
        #print(pro_desc, pro_price, buy_num, shop, address)
        with 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])

def @H_349_199@main():
    browser.get('https://www.taobao.com/')
    page = search_product(key_word)
    print(page)
    get_data()
    page_num = 1
    while 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 += 1
    print("数据爬取完毕!")

if __name__ == '__main__':
    key_word = input("请输入你要搜索的商品:")
    browser = webdriver.Chrome()
    main()

数据清洗

数据清洗很重要࿰c;这个对于我们后续做可视化展示࿰c;极其重要。因此我们需要根据后面要做的图形࿰c;然后进行对应的进行数据清洗。

爬取到的原始数据如下:

爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!

整个数据看上去算是比较干净࿰c;但是还是有几个地方指的我们处理一下。

  • 1.爬取到的原始数据没有列名࿰c;我们需要添加一个新列名;
  • 2.整个爬虫过程中࿰c;会出现重复数据࿰c;我们需要提前去重处理;
  • 3.将购买人数为空的记录࿰c;替换成0人付款;
  • 4.将购买人数转换为销量(注意部分单位为万);
  • 5.删除无发货地址的商品࿰c;并提取其中的省份;
# 导包
import pandas as pd
import numpy as np
import re

# 导入爬取得到的数据
df = pd.read_csv("月饼.csv", ENGIne='python', encoding='utf-8-sig', header=None)
df.columns = ["商品名", "价格", "付款人数", "店铺", "发货地址"]
df.head(10)

# 去除重复值
print(df.shape)
df.drop_duplicates(inplace=True)
print(df.shape)

# 处理购买人数为空的记录
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']

# 删除无发货地址的商品࿰c;并提取省份
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',encoding="gbk")

看看清洗后的数据:

爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!

数据可视化

可视化是整个文章的亮点所在࿰c;所谓“字不如表、表不如图”。整个可视化大屏我们基于以下五个问题开展而来。

  • 1.月饼销量Top10的柱形图;
  • 2.店铺月饼销量Top10的柱形图;
  • 3.全国月饼销量的地域分布地图;
  • 4.不同价格区间的月饼销量圆环图;
  • 5.月饼销售关键字的词云图;

1)月饼销量Top10的柱形图

# 导入包
from pyecharts.charts import Bar
from pyecharts import options as opts 

# 计算top10店铺
shop_top10 = df.groupby('商品名')['销量'].sum().sort_values(ascending=false).head(10)

# 绘制柱形图
bar0 = Bar(init_opts=opts.InitOpts(width='750px', height='350px')) 
bar0.add_xaxis(shop_top10.index.tolist())
bar0.add_yaxis('SALEs_num', shop_top10.values.tolist()) 
bar0.set_global_opts(title_opts=opts.titleOpts(title='月饼商品销量Top10'),
                     xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30))) 
#bar0.render("月饼商品销量Top10.html")
bar0.render_notebook()

结果如下:

爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!

2)店铺月饼销量Top10的柱形图

# 导入包
from pyecharts.charts import Bar
from pyecharts import options as opts 

# 计算top10店铺
shop_top10 = df.groupby('店铺')['销量'].sum().sort_values(ascending=false).head(10)

# 绘制柱形图
bar1 = Bar(init_opts=opts.InitOpts(width='750px', height='350px')) 
bar1.add_xaxis(shop_top10.index.tolist())
bar1.add_yaxis('SALEs_num', shop_top10.values.tolist()) 
bar1.set_global_opts(title_opts=opts.titleOpts(title='月饼店铺销量Top10'),
                     xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30))) 
#bar1.render("月饼店铺销量Top10.html")
bar1.render_notebook()

结果如下:

爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!

3)全国月饼销量的地域分布地图

from pyecharts.charts import Map 

# 计算销量
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='各省份月饼销量分布'),
                     visualmap_opts=opts.VisualMapOpts(@H_42_73@max_=300000)
                    )
#map1.render("各省份月饼销量分布.html")
map1.render_notebook()

结果如下:

爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!

4)不同价格区间的月饼销量圆环图

from pyecharts.charts import Pie

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

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)]
print(data_pair)


# 饼图
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='不同价格区间的月饼销量占比'))

#pie1.render("不同价格区间的月饼销量占比.html")
pie1.render_notebook()

结果如下:

爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!

5)月饼销售关键字的词云图

import jieba
import jieba.analyse

txt = df['商品名'].str.cat(sep='。')

# 添加关键词
jieba.add_word('粽子', 999, '五芳斋')

# 读入停用词表
stop_words = []
with open('stop_words.txt', 'R', encoding='utf-8') as f:
    lines = f.readlines()
    for line in lines:
        stop_words.append(line.Strip())

# 添加停用词
stop_words.extend(['logo', '10', '100', '200g', '100g', '140g', '130g', '月饼', '礼盒装'])  

# 评论字段分词处理
word_num = jieba.analyse.extract_tags(txt,
                                      topK=100,
                                      withWeight=True,
                                      allowPOS=())

# 去停用词
word_num_SELEcted = []

for i in word_num:
    if i[0] not in stop_words:
        word_num_SELEcted.append(i)

key_words = pd.DataFrame(word_num_SELEcted, columns=['words','num'])

结果如下:

爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!

大佬总结

以上是大佬教程为你收集整理的爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!全部内容,希望文章能够帮你解决爬取淘宝上4000条月饼数据,制作了一个酷炫的可视化大屏!所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。