深度|为了七夕节送女朋友一支口红,我爬取了京东并进行数据分析

2020-08-26 22:21:33 作者: 深度|为了七

友情提示,本文略长,建议收藏后慢慢看!

今天是七夕节,祝大家节日快乐!

每到这一天,不少男生就开始犯愁(单身狗除外):该给女朋友送什么礼物呢?

思来想去,我决定送一个口红,一来口红属于化妆品,深受女生欢迎,二来口红在化妆品的领域中,属于物美价廉的一种品类,对于囊中羞涩的我来说,非常合适。

但是网上那么多口红,到底哪一种更适合我送女朋友呢,我决定通过python爬一下京东,进行数据分析。首先爬取各个口红的交易信息,进行筛选;之后选定某种口红之后,爬取其评论信息并进行文本分析。


京东口红商品信息分析

我决定使用selenium这个爬虫神器来抓取京东的商品信息,其基本用法我之前文章提到过:一文搞懂爬虫神器selenium常见操作

限于篇幅,爬虫代码只给出主要部分,感兴趣的朋友可以私信我领取。

为了对口红商品进行分析,我爬取了商品名称、商品价格、商品评价人数、店铺名称、商品的标签(如自营、放心购等标签):

def get_product():    lis = driver.find_elements_by_xpath('//ul[@]/li/div[@]')    for li in lis:        info = li.find_element_by_xpath('.//div[@]').text    #商品的名称        price = li.find_element_by_xpath('.//div[@]').text + '元'   #商品的价格        comments = li.find_element_by_xpath('.//div[@]').text       #商品的评价人数        name = li.find_element_by_xpath('.//div[@]').text         #商品的店铺名称        icons = li.find_element_by_xpath('.//div[@]').text       #商品的标签        print(info,price,comments,name,icons,sep='|')        with open ('data.csv',mode='a',newline='') as filecsv:            csvwriter = csv.writer(filecsv,delimiter=',')            csvwriter.writerow([info,price,comments,name,icons])

主函数,爬取100页数据,每页30个,总计3000条商品数据:

def main():    page = 101    page_num = 1    while page_num != page:        print('*' * 100)        print('正在爬取第{}页的数据'.format(page_num))        print('*' * 100)#网页地址可以自己找规律,keyword后面是商品名称,page后边是页数,第1页是1,第2页是3,第3页是5,以此类推        driver.get('https://search.jd.com/Search?keyword={}&qrst=1&wq=%E5%8F%A3%E7%BA%A2&stock=1&page={}&click=0'.format(keyword,2*page_num-1))        driver.implicitly_wait(10)  #隐式等待时间        get_product()        page_num += 1        time.sleep(5)

开始爬取数据:

花了十几分钟,爬取成功。保存成csv文件,一共3000条数据:


数据爬取完成后,为了方便数据分析,下面开始数据清洗。

我先通过excel来进行简单的清洗,如图所示,红圈里的这些单位比较多余,对后续数据分析会有影响,所以需要去除:

如图所示,点击右上角 查找和选择--替换,就可以将需要处理的文本替换掉:

替换之后如下所示:

接下来通过python进行进一步清洗:

1.首先是读取数据

import pandas as pdimport numpy as np# 读取数据df = pd.read_csv('data.csv',header=None,encoding='gbk',names=['商品名称','商品价格','评价人数','店铺名称','商品标签'])

2.预览数据

3.去除重复数据

# 去重df = df.drop_duplicates()

去重后还剩2959条数据

打开df,发现部分商品具有多个价格:

这里可以通过jieba分词,选取第一个价格作为这个商品的价格,之后将价格转化为浮点型,便于后续处理:

import jiebafor i in range(0,3000):    try:        df['商品价格'][i] = jieba.lcut(df['商品价格'][i])[0]        df['商品价格'][i] = float(df['商品价格'][i])    except:        pass

处理之后的数据

将评价人数也转换为浮点型数据:

# 将评价人数转换为浮点型for i in range(0,3000):    try:        df['评价人数'][i] = float(df['评价人数'][i])    except:        pass   

4.缺失值处理

# 查看数据信息df.info()

缺失值处理前

# 发现店铺名称有缺失值,删除含有缺失值的行# 其实商品标签也有缺失值,但是对于后面的分析影响不大,所以不用管df.dropna(axis=0,how='any',inplace=True,subset=['店铺名称'])# 查看删除含有缺失值的行后的数据信息df.info()

缺失值处理后

5.商品价格字段处理

# 商品价格字段切分listBins = [0,50,100,200,300,400,500,1000,10000]listLabels = ['50及以下','51-100','101-200','201-300','301-400','401-500','501-1000','1000及以上']'''pandas.cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False)x:需要切分的数据bins:切分区域right:是否包含右端点,默认True,包含labels:对应标签,用标记来代替返回的bins,若不在该序列中,则返回NaNretbins:是否返回间距binsprecision:精度include_lowest:是否包含左端点,默认False,不包含'''# 利用pd.cut进行数据离散化切分df['价格区间'] = pd.cut(df['商品价格'],bins=listBins,labels=listLabels,include_lowest=True)

6.重置索引

# 重置索引df = df.reset_index(drop=True)df.to_csv('京东口红清洗后数据.csv',index=None)

数据清洗完毕,接下来进行数据分析。

 1/7    1 2 3 4 5 6 下一页 尾页