实战:用Python采集京东销售数据并做简单的数据分析和可视化

Python绿色通道

共 5102字,需浏览 11分钟

 · 2021-10-10


↑ 关注 + 星标 ,每天学Python新技能

后台回复【大礼包】送你Python自学大礼包

前言

大家好!今天给大家带来京东数据的简单采集和可视化分析,希望大家可以喜欢。本文来自古月星辰,大三本科生,数学专业,Python爬虫爱好者一枚。


一、目标数据

随着移动支付的普及,电商网站不断涌现,由于电商网站产品太多,由用户产生的评论数据就更多了,这次我们以京东为例,针对某一单品的评论数据进行数据采集,并且做简单数据分析。


二、页面分析

这个是某一手机页面的详情页,对应着手机的各种参数以及用户评论信息,页面URL是:

https://item.jd.com/10022971060622.html#none

然后通过分析找到评论数据对应的数据接口,如下图所示:

它的请求url:

https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98& productId=10022971060622 &score=0&sortType=5& page=0 &pageSize=10&isShadowSku=0&fold=1

注意看到这两个关键参数     1. productId: 每个商品有一个id     2. page: 对应的评论分页


三、解析数据

对评论数据的url发起请求:

url:https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98& productId=10022971060622 &score=0&sortType=5& page=0 &pageSize=10&isShadowSku=0&fold=1

json.cn 打开json数据(我们的评论数据是以json形式与页面进行交互传输的),如下图所示:

分析可知,评论url中对应十条评论数据,对于每一条评论数据,我们需要获取3条数 据,contents,color,size(注意到上图的maxsize,100,也就是100*10=1000条评论)。


四、程序

1.导入相关库

import  requestsimport  jsonimport  timeimport  openpyxl  #第三方模块,用于操作Excel文件的#模拟浏览器发送请求并获取响应结果import random

2.获取评论数据

def get_comments(productId,page):    url='https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId={0}&score=0&sortType=5&page={1}&pageSize=10&isShadowSku=0&fold=1'.format(productId,page) # 商品id    resp=requests.get(url,headers=headers)    #print(resp.text)  #响应结果进行显示输出    s1=resp.text.replace('fetchJSON_comment98(','') #fetchJSON_comment98(    s=s1.replace(');','')    #将str类型的数据转成json格式的数据    # print(s,type(s))    # print('*'*100)    res=json.loads(s)    print(type(res))    return res

3.获取最大页数(也可以不写)

def get_max_page(productId):    dic_data=get_comments(productId,0)  #调用刚才写的函数,向服务器发送请求,获取字典数据    return dic_data['maxPage']

4.提取数据

def get_info(productId):    #调用函数获取商品的最大评论页数    #max_page=get_max_page(productId)    # max_page=10    lst=[]  #用于存储提取到的商品数据    for page in range(0,get_max_page(productId)):   #循环执行次数        #获取每页的商品评论        comments=get_comments(productId,page)        comm_lst=comments['comments']   #根据key获取value,根据comments获取到评论的列表(每页有10条评论)        #遍历评论列表,分别获取每条评论的中的内容,颜色,鞋码        for item in comm_lst:   #每条评论又分别是一个字典,再继续根据key获取值            content=item['content']  #获取评论中的内容            color=item['productColor'] #获取评论中的颜色            size=item['productSize'] #鞋码            lst.append([content,color,size])  #将每条评论的信息添加到列表中        time.sleep(3)  #延迟时间,防止程序执行速度太快,被封IP    save(lst)  #调用自己编写的函数,将列表中的数据进行存储

5.用于将爬取到的数据存储到Excel中

def save(lst):    wk=openpyxl.Workbook () #创建工作薄对象    sheet=wk.active  #获取活动表    #遍历列表,将列表中的数据添加到工作表中,列表中的一条数据,在Excel中是 一行    for item in lst:        sheet.append(item)    #保存到磁盘上    wk.save('销售数据.xlsx')

6.运行程序

if __name__ == '__main__':    productId='10029693009906' # 单品id    get_info(productId)


五、简单数据

1.简单配置

# 导入相关库import pandas as pd import matplotlib.pyplot as plt# 这两行代码解决 plt 中文显示的问题plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False# 由于采集的时候没有设置表头,此处设置表头data = pd.read_excel('./销售数据.xlsx', header=None, names = ['comments','color','intro'] ) # data.head()

2.手机颜色数量对比

x = ['白色','黑色','绿色','蓝色','红色','紫色']y = [314,295,181,173,27,10]plt.bar(x,y)plt.title('各种颜色手机数量对比')plt.xlabel('颜色')plt.ylabel('数量')# plt.legend() # 显示图例plt.show()

可以看出用户购买的手机白色和黑色的机型比较多.占据了60%多。3.评论词云展示1)先要提取评论数据

import xlrddef strs(row):    values = "";    for i in range(len(row)):        if i == len(row) - 1:            values = values + str(row[i])        else:            values = values + str(row[i])    return values# 打卡文件data = xlrd.open_workbook("./销售数据.xlsx")sqlfile = open("data.txt", "a")  # 文件读写方式是追加table = data.sheets()[0]  # 表头nrows = table.nrows  # 行数ncols = table.ncols  # 列数colnames = table.row_values(1)  # 某一行数据# 打印出行数列数for ronum in range(1, nrows):        row = table.cell_value(rowx=ronum, colx = 0) #只需要修改你要读取的列数-1        values = strs(row)  # 调用函数,将行数据拼接成字符串        sqlfile.writelines(values + "\n")  # 将字符串写入新文件sqlfile.close()  # 关闭写入的文件

2)词云展示 

# 导入相应的库import jiebafrom PIL import Imageimport numpy as npfrom wordcloud import WordCloudimport matplotlib.pyplot as plt# 导入文本数据并进行简单的文本处理# 去掉换行符和空格text = open("./data.txt",encoding='gbk').read()text = text.replace('\n',"").replace("\u3000","")
# 分词,返回结果为词的列表text_cut = jieba.lcut(text)# 将分好的词用某个符号分割开连成字符串text_cut = ' '.join(text_cut)

注意: 这里我们不能使用encoding='uth-8',会报出一个错误:

> 'utf-8' codec can't decode byte 0xd3 in position 0: invalid continuation byte

所以我们需要改成 gbk。

word_list = jieba.cut(text)space_word_list = ' '.join(word_list)print(space_word_list)# 调用包PIL中的open方法,读取图片文件,通过numpy中的array方法生成数组mask_pic = np.array(Image.open("./xin.png"))word = WordCloud(    font_path='C:/Windows/Fonts/simfang.ttf',  # 设置字体,本机的字体    mask=mask_pic,  # 设置背景图片    background_color='white',  # 设置背景颜色    max_font_size=150,  # 设置字体最大值    max_words=2000,  # 设置最大显示字数    stopwords={'的'}  # 设置停用词,停用词则不在词云途中表示                 ).generate(space_word_list)image = word.to_image()word.to_file('2.png')  # 保存图片image.show()

最后得到的效果图,如下图所示:

推荐阅读

  1. 爆强!将 exe 文件反编译成 Python 脚本!

  2. 国产Linux发行版再添一员,操作界面不输苹果

  3. Python一行代码能做什么,30个实用案例代码详解


浏览 114
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报