美文网首页
数据分析——实战|爬取淘宝,分析月饼哪家强?

数据分析——实战|爬取淘宝,分析月饼哪家强?

作者: python与数据分析 | 来源:发表于2020-10-08 19:23 被阅读0次

学习目标:

1、爬取淘宝网关于月饼的所有相关信息
2、利用pandas进行数据清洗和数据处理
3、利用pyecharts来数据可视化展示

一、前提准备:

Selenium控制Chrome浏览器进行自动化操作,中途只需要扫码登陆一次,可完成整个数据的爬取。

实现步骤:

1、查看自己的谷歌浏览器版本
①浏览器输入chrome://version/,比如我的谷歌版本是85,路径如下

image.png
②得知自己的浏览器版本后,进入http://npm.taobao.org/mirrors/chromedriver/去下载对应的驱动。比如我的是85版本,对应的是下面:
image.png
根据自己的系统,开始下载驱动
image.png
③下载完成后,将exe文件放到自己的谷歌浏览器的安装路径下
image.png
④测试
如果没有selenium 包,pip install selenium 安装一下
# coding=utf8
from selenium import webdriver
import re
from selenium.webdriver.chrome.options import Options

option = Options()
# 1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口
browser = webdriver.Chrome(chrome_options=option,
                          executable_path=r"C:\Users\cherich\AppData\Local\Google\Chrome\Application\chromedriver.exe")

# 通过浏览器向服务器发送URL请求
browser.get("http://baidu.com")

这时如果成功的话,浏览器会自动打开百度页面~

二、爬取淘宝网关于月饼的所有相关信息

# coding=utf8
import re
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
import time
import csv


# 搜索商品,获取商品页码
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


# 获取数据
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 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(25)
        get_data()
        page_num += 1
    print("数据爬取完毕!")


if __name__ == '__main__':
    key_word = input("请输入你要搜索的商品:")
    option = Options()
    browser = webdriver.Chrome(chrome_options=option,
                               executable_path=r"C:\Users\cherich\AppData\Local\Google\Chrome\Application\chromedriver.exe")
    main()

爬取结果:4404条数据
image.png

三、利用pandas进行数据清洗和数据处理

# 导包
import pandas as pd
import numpy as np
import re
# 导入爬取得到的数据
df = pd.read_csv("C:/Users/cherich/Desktop/月饼.csv", engine='python', encoding='utf-8-sig')
df.columns = ["商品名", "价格", "付款人数", "店铺", "发货地址"]
df.head(10)
image.png
去除重复值
# 维度
print(df.shape)
# 查看有多少重复数据
print(len(df.duplicated()[df.duplicated()==True]))
# 删除重复值
df.drop_duplicates(inplace=True)
# 维度
print(df.shape)
df.info()

# 去除重复值
print(df.shape)
df.drop_duplicates(inplace=True)
print(df.shape)
image.png
如果销量 为 nan ,改为销量为“0人付款”的记录
# 两种方式
df["付款人数"]=df["付款人数"].apply(lambda x: '0人付款' if x is np.nan else x)
# 处理购买人数为空的记录
#df['销量'] = df['销量'].replace(np.nan,'0人付款')
df.info()
计算销量(将字符串的付款人数转成数值型)
# # 提取数值
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
image.png
删除无发货地址的商品,并提取省份
df = df[df['发货地址'].notna()]
df['省份'] = df['发货地址'].str.split(' ').apply(lambda x:x[0])
df
image.png
# 删除多余的列
df.drop(['付款人数', '发货地址', 'num', 'unit'], axis=1, inplace=True)

# 重置索引
df = df.reset_index(drop=True)
df.to_csv('清洗完成数据.csv')
查看清洗完的数据
df1 = df.sort_values(by="价格", ascending=False)

df1.iloc[1:6][['商品名','价格','销量','省份']]
# df1.iloc[:5,:]
image.png

四、数据可视化展示

# 导入包
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()
image.png
# 导入包
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()
image.png
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(max_=300000)
                    )
#map1.render("各省份月饼销量分布.html")
map1.render_notebook()
image.png
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()
image.png
利用jieba提取中文关键词
import jieba
import jieba.analyse

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

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

# 读入停用词表
stop_words = []
with open('C:/Users/cherich/Desktop/stoplist.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'])
key_words
from pyecharts.charts import WordCloud
from pyecharts.globals import SymbolType

# 词云图
word1 = WordCloud(init_opts=opts.InitOpts(width='750px', height='350px'))
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('月饼商品名称词云图'))
#word1.render("月饼商品名称词云图.html")
word1.render_notebook()
image.png
完~

学习链接:https://blog.csdn.net/csdnsevenn/article/details/108877887

相关文章

网友评论

      本文标题:数据分析——实战|爬取淘宝,分析月饼哪家强?

      本文链接:https://www.haomeiwen.com/subject/ptyuuktx.html