中秋节到了,顺便爬一些月饼(Easy!)

中秋来临之际,利用Python中的pandas库和seleniu库爬取淘宝网上的月饼商品信息(店铺名、商品名、价格以及销量),并作三张极为简单的可视化图表以分享。

首先引入本文所需用到的包。

import matplotlib.pyplot as plt
from selenium import webdriver
import pandas as pd
import time
from pylab import mpl
# 解决中文字符显示异常的问题
mpl.rcParams['font.sans-serif'] = ['FangSong']   # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False       # 解决保存图像是负号'-'显示为方块的问题

然后创建几个空列表,以备之后爬取的数据进行存储。driver为指向浏览器的对象,使用get函数访问网站。

#****************--------分隔符--------****************#
start = time.time()         #开始计时
# 初始化收集信息的列表
shop = []
name = []
price = []
sale = []
count = 61
# 声明浏览器对象
driver = webdriver.Chrome()
# 访问网址
driver.get('https://uland.taobao.com/sem/tbsearch?refpid=mm_26632258_3504122_32538762&keyword=%E6%9C%88%E9%A5%BC&clk1=5aa74fa3a2dba7fa9bcc34bea6104c9f&upsId=5aa74fa3a2dba7fa9bcc34bea6104c9f&spm=a2e0b.20350158.filter.4&pid=mm_26632258_3504122_32538762&union_lens=recoveryid%3A201_11.176.129.100_14191976_1632009962121%3Bprepvid%3A201_11.176.129.100_14191976_1632009962121&price=~200&pnum=0')
time.sleep(2)

进入淘宝网站,搜索月饼,我们这里进行初步的筛选,选择200元以下的商品进行爬取。我这里使用的是谷歌浏览器,其自带的插件Xpath Helper可抓取对象的Xpath地址。

 利用.find_element_by_xpath()对每件商品的四个基本信息进行捕获,并以列表的形式存储。最后将所有信息整合在一个字典中,将这个字典读入pandas的DataFrame,然后将其写入文件即可。

for j in range(1,6):
    time.sleep(2)
    #店铺
    for i in range(1,count):
        t = driver.find_element_by_xpath("/html[@class='ks-webkit537 ks-webkit ks-chrome93 ks-chrome']/body/div[@id='J_u_root']/div[@id='mx_3']/div[@id='mx_5']/ul[@class='pc-search-items-list']/li[@class='pc-items-item item-undefined']["+str(i)+"]/a[@class='pc-items-item-a']/div[@class='seller-info']/div[@class='seller-name']").text
        t = t[1:]
        shop.append(t)
    #商品名
    for i in range(1,count):
        name.append(driver.find_element_by_xpath("/html[@class='ks-webkit537 ks-webkit ks-chrome93 ks-chrome']/body/div[@id='J_u_root']/div[@id='mx_3']/div[@id='mx_5']/ul[@class='pc-search-items-list']/li[@class='pc-items-item item-undefined']["+str(i)+"]/a[@class='pc-items-item-a']/div[@class='pc-items-item-title pc-items-item-title-row2']/span[@class='title-text']").text)
    #价格
    for i in range(1,count):
        price.append(driver.find_element_by_xpath("/html[@class='ks-webkit537 ks-webkit ks-chrome93 ks-chrome']/body/div[@id='J_u_root']/div[@id='mx_3']/div[@id='mx_5']/ul[@class='pc-search-items-list']/li[@class='pc-items-item item-undefined']["+str(i)+"]/a[@class='pc-items-item-a']/div[@class='price-con']/span[@class='coupon-price-afterCoupon']").text)
    #销量
    for i in range(1,count):
        t = driver.find_element_by_xpath("/html[@class='ks-webkit537 ks-webkit ks-chrome93 ks-chrome']/body/div[@id='J_u_root']/div[@id='mx_3']/div[@id='mx_5']/ul[@class='pc-search-items-list']/li[@class='pc-items-item item-undefined']["+str(i)+"]/a[@class='pc-items-item-a']/div[@class='item-footer']/div[@class='sell-info']").text
        t = t.split()[1]
        if '万' in t:
            t = float(t[:-1])*10000
        else:
            t = float(t)
        sale.append(t)
    next = driver.find_element_by_xpath("/html[@class='ks-webkit537 ks-webkit ks-chrome93 ks-chrome']/body/div[@id='J_u_root']/div[@id='mx_3']/div[@id='mx_5']/div[@id='J_pc-search-page-nav']/span[@class='pc-search-page-item pc-search-page-item-after J_page-nav-item']")
    if j!=5:
        next.click()
data_dict = {'shop':shop,'Trade_name':name,'Trade_price':price,'Trade_sale':sale}
moon_cake = pd.DataFrame.from_dict(data_dict)
moon_cake.to_excel('Mooncake.xlsx',index=False)
driver.quit()
print('成功写入文件!')
print('Please wait five seconds . . . . .')
time.sleep(5)

 对于纯数据的Excel表格可能不太敏感,所以下面对数据进行一下简单的整理分析。

首先要对收集到的数据进行数据清洗,本数据可不进行缺失值查询与异常值查询,仅检查其是否有重复值。

# 下面对爬取到的数据进行简单的分析
print('下面对爬取到的数据进行简单的分析')
m = pd.read_excel('Mooncake.xlsx')
# print(m.head())        #检查头行是否符合预期
data = m.copy()
print('总计',data.shape[0],'件商品')
#****************--------分隔符--------****************#
# 数据去重
if len(data[data.duplicated()]) == 0:
    print('无重复值!')
else:
    print('总共有',len(data[data.duplicated()]),'条重复值')
    data = data.drop_duplicates(keep='first')          #删除重复值
    print('\n开始删除重复值\n···\n重复值已删除')
print('去重后,总计',data.shape[0],'件商品')
print('总计店铺',data['shop'].nunique(),'家')

此时的结果:

 可以看出收集的数据共计300商品,有12条重复值(检查后已删除),处理后店铺数量为222家。

最后对这些数据进行简单的可视化,这里仅以月饼价格分布和TOP20店铺的月销量作分析。

# 价格区间打标签
data['price_range'] = pd.cut(data['Trade_price'],bins=[0,25,50,75,100,125,150,175,200],
                               labels = ['0to25','25to50','50to75','75to100','100to125','125to150','150to175','175to200'],
                               right=False)
co = data.groupby('price_range',as_index=False)['shop'].count()
co.columns = ['price_range','counts']
co.sort_values(by='counts',ascending=False,inplace=True)
#****************--------分隔符--------****************#
# 月饼价格分布
plt.figure()
data['Trade_price'].plot.hist(color='r',alpha=0.5)
plt.title('Distribution of moon cake prices')
plt.xlabel('Price range')
#****************--------分隔符--------****************#
# 月饼价格区间分布占比
label = ['0to25','25to50','50to75','75to100','100to125','125to150','150to175','175to200']
co.plot(kind='pie',y='counts',figsize=(6,6),
          title='Number of commodities in each price range of moon cakes',
          labeldistance=10,     #不显示小标签
          autopct='%1.1f%%',
          shadow=False,
          startangle=90,
          pctdistance=0.6,
          labels=label)
#****************--------分隔符--------****************#
# 筛选出来销量排名前20的店铺
plt.figure()
top20 = data.groupby('shop',as_index=False)['Trade_sale'].sum()
top20 = top20.sort_values(by='Trade_sale',ascending=False).reset_index().iloc[:20,:]
del top20['index']
top20 = top20.set_index('shop')
top20['Trade_sale'].plot(kind='bar',color='pink')
plt.title('Sales of each store')
plt.ylabel('total sales')
plt.tight_layout()
#****************--------分隔符--------****************#
end = time.time()         #结束计时
print('This program took ',str(end-start),'seconds')
print('This program has run successfully!')
plt.show()

得到的可视化图像如下:

 

 

 Tips:由于淘宝的购物页面时刻都在变化,需要根据当时的搜索情况选择合适的爬取页数以及商品数目(例如,如果爬取的商品数目大于实际页面的商品数目,次数selenium机器人爬取的时候爬不到对应的商品就会报错)。

Tips:需要获取爬取的原数据表可留言。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mrxianglx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值