友情提示,本文略长,建议收藏后慢慢看!
今天是七夕节,祝大家节日快乐!
每到这一天,不少男生就开始犯愁(单身狗除外):该给女朋友送什么礼物呢?
思来想去,我决定送一个口红,一来口红属于化妆品,深受女生欢迎,二来口红在化妆品的领域中,属于物美价廉的一种品类,对于囊中羞涩的我来说,非常合适。
但是网上那么多口红,到底哪一种更适合我送女朋友呢,我决定通过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)
数据清洗完毕,接下来进行数据分析。