手把手教你采集京東銷售數據并做簡單的數據分析和可視化
前言
大家好!我是古月星辰,大三本科生,數學專業,Python爬蟲愛好者一枚。今天給大家帶來JD數據的簡單采集和可視化分析,希望大家可以喜歡。
一、目標數據
隨著移動支付的普及,電商網站不斷涌現,由于電商網站產品太多,由用戶產生的評論數據就更多了,這次我們以京東為例,針對某一單品的評論數據進行數據采集,并且做簡單數據分析。
二、頁面分析
這個是某一手機頁面的詳情頁,對應著手機的各種參數以及用戶評論信息,頁面URL是:
- https://item.jd.com/10022971060622.html#none
然后通過分析找到評論數據對應的數據接口,如下圖所示:
它的請求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. 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
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
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 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() # 關閉寫入的文件
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)
注意: 這里我們不能使用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()
最后得到的效果圖,如下圖所示:
本文轉載自微信公眾號「Python爬蟲與數據挖掘」,可以通過以下二維碼關注。轉載本文請聯系Python爬蟲與數據挖掘公眾號。