手把手教你采集京东销售数据并做简单的数据分析和可视化

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

[[421418]]

前言

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

一、目标数据

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

二、页面分析

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

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

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

它的请求url:

https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_com 
ment98& productId=10022971060622 &score=0&sortType=5& page=0 &pageSize=10&isShadowSk 
u=0&fold=1 
  • 1.
  • 2.
  • 3.

注意看到这两个关键参数

1. productId: 每个商品有一个id

2. page: 对应的评论分页

三、解析数据

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

url:https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comm 
ent98& productId=10022971060622 &score=0&sortType=5& page=0 &pageSize=10&isShado 
wSku=0&fold=1 
  • 1.
  • 2.
  • 3.

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

分析可知,评论url中对应十条评论数据,对于每一条评论数据,我们需要获取3条数

据,contents,color,size(注意到上图的maxsize,100,也就是100*10=1000条评论)。

四、程序

1.导入相关库

import  requests 
import  json 
import  time 
import  openpyxl  #第三方模块,用于操作Excel文件的 
#模拟浏览器发送请求并获取响应结果 
import random 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

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 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

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

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

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)  #调用自己编写的函数,将列表中的数据进行存储 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

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

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

6.运行程序

if __name__ == '__main__'
    productId='10029693009906' # 单品id 
    get_info(productId) 
  • 1.
  • 2.
  • 3.

五、简单数据

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() 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

2.手机颜色数量对比

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

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

import xlrd 
def 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()  # 关闭写入的文件 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

2)词云展示

# 导入相应的库 
import jieba 
from PIL import Image 
import numpy as np 
from wordcloud import WordCloud 
import 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) 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

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

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

所以我们需要改成 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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

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

本文转载自微信公众号「Python爬虫与数据挖掘」,可以通过以下二维码关注。转载本文请联系Python爬虫与数据挖掘公众号。

 

 

责任编辑:武晓燕 来源: Python爬虫与数据挖掘
相关推荐

2017-05-18 12:45:35

数据分析数据理解数据

2020-12-17 09:40:01

Matplotlib数据可视化命令

2015-10-26 09:24:30

微信公众号数据分析

2021-08-26 09:00:48

PyechartsPython可视化

2021-05-10 06:48:11

Python腾讯招聘

2021-07-14 09:00:36

Python数据Python基础

2020-06-17 08:35:12

数据分析Python代码

2017-10-18 16:08:15

可视化交叉验证代码

2023-02-01 10:16:50

Python可视化

2020-05-14 10:19:23

Python可视化分析

2022-02-09 09:03:42

分词、词频统计可视化

2021-09-30 18:27:38

数据仓库ETL

2021-12-29 20:20:25

结构化数据Pandas

2018-04-05 22:55:34

数据问答系统SQuAD

2020-06-22 13:41:27

数据集数据清洗数据模型

2020-04-14 10:20:12

MySQL数据库死锁

2024-10-16 11:40:47

2021-09-18 14:26:49

Linux Linux 启动流程Linux 系统

2017-01-12 17:28:59

数据分析数据可视化可视化

2022-07-24 21:43:48

数据可视化大数据
点赞
收藏

51CTO技术栈公众号