当前位置:   article > 正文

爬取淘宝手机数据,并进行清洗,并可视化展示_爬取手机销售数据

爬取手机销售数据

爬取所需环境

selnium安装

  1. Win+R输入cmd敲回车进入到cmd窗口;
  2. 输入“pip3 install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple”或“pip install selenium”敲回车,等待,就安装好了(附加莫管:输入“pip uninstall matplotlib”进行matplotlib的卸载)。记得测试哈:
  3. 测试:安装好后,测试是否安装成功,命令行输入“python”进入python idel,输入“import selnium”运行,没有报错,即为安装成功:
  4. 附:安装其他所需库方法类似“pip3 install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple”
    chromedriver.exe安装
    1.百度搜索下载与本地安装Chrome对应版本,将其放到Chrome安装路径,在配置环境变量即可:
    在这里插入图片描述
    2.Path中新建一个,存入以下类似Chrome安装目录路径,保存即可:
    在这里插入图片描述

爬取淘宝手机数据代码:

# 导入模块
from selenium import webdriver
import time
import csv
import re

# 搜索商品,获取商品页码
def search_product(key_word):
    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]
    print(key_word + "有" + str(page) + "页信息,请问需要爬取多少页?")
    page = int(input("请输入需要爬取的页面: "))
    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[:-3]
        # 保存到csv文件
        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])


def main():
    # 浏览器要获取的链接
    browser.get('https://www.taobao.com/')
    # 要获取的关键字
    page = search_product(key_word)
    print("开始爬取:")
    page_num = 0
    while page != page_num:
        print("*" * 60)
        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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

将爬取数据进行清洗,并可视化展示:

import pandas as pd
import matplotlib.pyplot as plt
import jieba
from imageio import imread
from wordcloud import WordCloud
# 项目
project = "华为手机"
# 显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 这两行需要手动设置
plt.rcParams['axes.unicode_minus'] = False
# 文件全路径+文件名
csv_file_name = '{}.csv'.format(project)
# 获取文件中的内容
data = pd.read_csv(open(csv_file_name, encoding='utf-8'), header=None)
# 设置列名
data.columns = ["desc", "price", "buynum"]


# 可视化1:销量前5名手机型号折线图
# 分析:哪一型号手机销量最好
def huatu1(data_ten):
   x_values = data_ten["desc"]
   y_values = data_ten["buynum"]
   plt.plot(x_values, y_values, linewidth=4)
   plt.xlabel("手机型号", size='16')  # 设置横坐标标签
   plt.ylabel('销量', size='16')  # 设置纵坐标标签
   plt.title("销量前5名手机型号折线图", fontsize=20)
   # 保存图表并命名,bbox_inches='tight'表示将图表多余的空白区域裁减掉
   plt.savefig("销量前5名手机型号折线图", bbox_inches='tight')
   plt.show()


# 可视化2:销量前10名手机价格折线图
# 分析:找到在这前10类好销量中,价格最低的手机
def huatu2(data_ten):
   x_values = data_ten["desc"]
   y_values = data_ten["price"]
   plt.plot(x_values, y_values, linewidth=4)
   plt.xlabel("手机型号", size='16')  # 设置横坐标标签
   plt.ylabel('价格', size='16')  # 设置纵坐标标签
   plt.title("销量前5名手机价格柱状图", fontsize=20)
   # 保存图表并命名,bbox_inches='tight'表示将图表多余的空白区域裁减掉
   plt.savefig("销量前5名手机价格柱状图", bbox_inches='tight')
   plt.show()


# 可视化3:参数信息词云图
# 分析:发现市面上在售手机注重的信息参数
def huatu3(word_count):
   # 1、读取背景图片
   back_picture = imread("backg.jpg")
   # 2、设置词云参数
   wc = WordCloud(font_path="G:\\6Tipdm\\wordcloud\\simhei.ttf",
                  background_color="white",
                  max_words=2000,
                  mask=back_picture,
                  max_font_size=200,
                  random_state=42
                  )
   wc2 = wc.fit_words(word_count)
   # 3、绘制词云图
   plt.figure(figsize=(16, 8))
   plt.imshow(wc2)
   plt.axis("off")
   plt.show()
   wc.to_file("手机参数信息词云图.png")

# 可视化4:不同价格区间手机饼图
# 分析:哪类价格区间的手机型号最多,推测出消费者最能接受的价格区间
def huatu4(data):
   plt.figure(figsize=(10, 5), dpi=200)
   x = data['level']
   y = data.groupby('level').count().reset_index
   plt.hist(x,bins=12, color='green', align='mid')
   plt.title('在售手机价格区间统计')
   plt.xlabel('价格区间')
   plt.ylabel('手机型号数')
   plt.savefig('在售手机价格区间统计')
   plt.show()


# 数据去重
def quchong():
   # 去重之前的记录数
   print("去重之前的记录数", data.shape)
   # 去重“详细信息”相同的记录,删除后出现的重复的值:
   data.drop_duplicates(subset=["desc"], inplace=True)
   # 去重之后的记录数
   print("去重之后的记录数", data.shape)


# 销量数据清洗,将数据清洗为int类型(1万+相应进行清洗)
def xiaoliang(x):
   # find()方法检测字符串中是否包含子字符串”万“,不包含在指定范围内则返回-1
   # print(type(x))
   if x.find("万") != -1:
       x = x[0]
       return int(x) * 10000
   elif x.find("+") != -1:
       x = list(x)
       x.remove('+')
       x = ''.join(x)
       return int(x)
   else:
       return int(x)

# 清洗出价格少于五百的耳机钢化膜等(假设小于五百的都是非法数据)
def data_jiage():
   # 如果price列的值<500
   d = data[data['price'] < 500]
   data1 = data.drop(d.index)
   # print(data1[data1['price'] < 500])
   return data1


# 清洗出销量排行前五的信息,方便为后面可视化图提供数据
def data_cleansing(data):
   # 按照特定列的值进行排序
   sort_data = data.sort_values('buynum', ascending=True)
   # 获取前五条数据
   data_ten = sort_data.tail(5)
   # 输出每一条参数信息,设置手机型号
   data_ten["desc"] = data_ten["desc"].apply(set_xinghao)
   # data_ten.to_csv('销量前五.csv')
   return data_ten

def set_xinghao(x):
   # 打印型号,设置型号
   print(x)
   x = input("型号为:")
   return x


# 参数信息清洗,使用jieba库做词频统计,方便后面做词云图的数据
def canshu(data):
   # 将商品信息进行切分
   data["desc_cut"] = data["desc"].apply(lambda x: jieba.lcut(x))
   # 定义一个字符串,含有需要切割的字符,以逗号分隔
   stop = "手机,&,【,】,?,/,+"
   # 以逗号切分
   stop = stop.split(',')
   # 将包含在stop的字符切割
   data["desc_cut"] = data["desc_cut"].apply(lambda x: [i for i in x if i not in stop])
   # 存取词频数据
   all_words = []
   for i in data["desc_cut"]:
       for j in i:
           all_words.extend(i)
   word_count = pd.Series(all_words).value_counts()
   return word_count

# 1000元为一个等级,呈现分区分布;于是创建价格等级字段,以便后续进行分析;
def get_price_level(p):
   level=p//1000
   if level==0:
       return '0~999'
   if level==1:
       return '1000~1999'
   if level==2:
       return '1999~2999'
   if level==3:
       return '2999~3999'
   if level==4:
       return '3999~4999'
   if level>=5:
       return '5000+'
   else:
       return '计算出错'



def main():
   # 1、数据清洗
   # 数据去重
   quchong()
   # 销量数据清洗
   # data["buynum"] = data["buynum"].apply(xiaoliang)
   # 更改价格数据格式为float:
   data['price'].astype('float')
   # 删除非法价格(假设小于500为非法数据)
   data1 = data_jiage()
   # 增加价格区间数据
   data1['level'] = data1['price'].apply(get_price_level)
   # 获取销量前五数据
   data_ten = data_cleansing(data1)
   # 清洗出desc信息里的各种参数信息,获取参数词频数据
   word_count = canshu(data1)


   # 2、可视化
   huatu1(data_ten)
   huatu2(data_ten)
   huatu3(word_count)
   huatu4(data1)


   # 输出清洗后的数据
   data1.to_csv('2.csv')

if __name__ == '__main__':
   main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202

可视化展示图片:

销量前5名手机价格折线图
在这里插入图片描述

销量前5名手机型号折线图
在这里插入图片描述

在售手机价格区间统计
在这里插入图片描述

手机参数信息词云图
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/839577
推荐阅读
相关标签
  

闽ICP备14008679号