手把手教你采集京东销售数据并做简单的数据分

家电维修 2023-07-16 19:17www.caominkang.com家电维修技术



前言

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



一、目标数据

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

二、页面分析

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

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



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



它的请求url:

  1. https://club.jd./ment/productPageComments.action?callback=fetchJSON_ ment98& productId=10022971060622 &score=0&sortType=5& page=0 &pageSize=10&isShadoSk 
  2. u=0&fold=1 

注意看到这两个关键参数

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

2. page: 对应的评论分页

三、解析数据

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

  1. url:https://club.jd./ment/productPageComments.action?callback=fetchJSON_m ent98& productId=10022971060622 &score=0&sortType=5& page=0 &pageSize=10&isShado 
  2. Sku=0&fold=1 

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



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

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

四、程序 1.导入相关库
  1. import  requests import  json 
  2. import  time import  openpyxl  #第三方模块,用于操作Excel文件的 
  3. #模拟浏览器发送请求并获取响应结果 import random 
2.获取评论数据
  1. def get_ments(productId,page):     url='https://club.jd./ment/productPageComments.action?callback=fetchJSON_ment98&productId={0}&score=0&sortType=5&page={1}&pageSize=10&isShadoSku=0&fold=1'.format(productId,page) # 商品id 
  2.     resp=requests.get(url,headers=headers)     #print(resp.text)  #响应结果进行显示输出 
  3.     s1=resp.text.replace('fetchJSON_ment98(','') #fetchJSON_ment98(     s=s1.replace(');','') 
  4.     #将str类型的数据转成json格式的数据     # print(s,type(s)) 
  5.     # print(''100)     res=json.loads(s) 
  6.     print(type(res))     return res 
3.获取最大页数(也可以不写)
  1. def get_max_page(productId):     dic_data=get_ments(productId,0)  #调用刚才写的函数,向服务器发送请求,获取字典数据 
  2.     return dic_data['maxPage'] 
4.提取数据
  1. def get_info(productId):     #调用函数获取商品的最大评论页数 
  2.     #max_page=get_max_page(productId)     # max_page=10 
  3.     lst=[]  #用于存储提取到的商品数据     for page in range(0,get_max_page(productId)):   #循环执行次数 
  4.         #获取每页的商品评论         ments=get_ments(productId,page) 
  5.         m_lst=ments['ments']   #根据key获取value,根据ments获取到评论的列表(每页有10条评论)         #遍历评论列表,分别获取每条评论的中的内容,颜色,鞋码 
  6.         for item in m_lst:   #每条评论又分别是一个字典,再继续根据key获取值             content=item['content']  #获取评论中的内容 
  7.             color=item['productColor'] #获取评论中的颜色             size=item['productSize'] #鞋码 
  8.             lst.append([content,color,size])  #将每条评论的信息添加到列表中         time.sleep(3)  #延迟时间,防止程序执行速度太快,被封IP 
  9.     save(lst)  #调用自己编写的函数,将列表中的数据进行存储 
5.用于将爬取到的数据存储到Excel中
  1. def save(lst):     k=openpyxl.Workbook () #创建工作薄对象 
  2.     sheet=k.active  #获取活动表     #遍历列表,将列表中的数据添加到工作表中,列表中的一条数据,在Excel中是 一行 
  3.     for item in lst:         sheet.append(item) 
  4.     #保存到磁盘上     k.save('销售数据.xlsx') 
6.运行程序
  1. if __name__ == '__main__':     productId='10029693009906' # 单品id 
  2.     get_info(productId) 



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



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



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

  1. import xlrd def strs(ro): 
  2.     values = "";     for i in range(len(ro)): 
  3.         if i == len(ro) - 1:             values = values + str(ro[i]) 
  4.         else:             values = values + str(ro[i]) 
  5.     return values # 打卡文件 
  6. data = xlrd.open_orkbook("./销售数据.xlsx") sqlfile = open("data.txt", "a")  # 文件读写方式是追加 
  7. table = data.sheets()[0]  # 表头 nros = table.nros  # 行数 
  8. ncols = table.ncols  # 列数 colnames = table.ro_values(1)  # 某一行数据 
  9. # 打印出行数列数 for ronum in range(1, nros): 
  10.         ro = table.cell_value(rox=ronum, colx = 0) #只需要修改你要读取的列数-1         values = strs(ro)  # 调用函数,将行数据拼接成字符串 
  11.         sqlfile.ritelines(values + "n")  # 将字符串写入新文件 sqlfile.close()  # 关闭写入的文件 

2)词云展示

  1. # 导入相应的库 import jieba 
  2. from PIL import Image import numpy as np 
  3. from ordcloud import WordCloud import matplotlib.pyplot as plt 
  4. # 导入文本数据并进行简单的文本处理 # 去掉换行符和空格 
  5. text = open("./data.txt",encoding='gbk').read() text = text.replace('n',"").replace("u3000","") 
  6.  # 分词,返回结果为词的列表 
  7. text_cut = jieba.lcut(text) # 将分好的词用某个符号分割开连成字符串 
  8. text_cut = ' '.join(text_cut) 

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

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

所以我们需要改成 gbk。

  1. ord_list = jieba.cut(text) space_ord_list = ' '.join(ord_list) 
  2. print(space_ord_list) # 调用包PIL中的open方法,读取图片文件,通过numpy中的array方法生成数组 
  3. mask_pic = np.array(Image.open("./xin.png")) ord = WordCloud( 
  4.     font_path='C:/Windos/Fonts/simfang.ttf',  # 设置字体,本机的字体     mask=mask_pic,  # 设置背景图片 
  5.     background_color='hite',  # 设置背景颜色     max_font_size=150,  # 设置字体最大值 
  6.     max_ords=2000,  # 设置最大显示字数     sords={'的'}  # 设置停用词,停用词则不在词云途中表示 
  7.                  ).generate(space_ord_list) image = ord.to_image() 
  8. ord.to_file('2.png')  # 保存图片 image.sho() 

得到的效果图,如下图所示



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



 

 

Copyright © 2016-2025 www.jianfeikang.com 建飞家电维修 版权所有 Power by