爬取淘寶熱賣商品並可視化分析,看看大家都喜歡買什么!


1.前言

本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯系我們以作處理。

PS:如有需要Python學習資料的小伙伴可以點擊下方鏈接自行獲取

Python免費學習資料、代碼以及交流解答點擊即可加入


 

想通過python來獲取大家在淘寶都喜歡買什么,有了這個想法后,那便開始動手寫程序實現這個想法!

2.采集數據

網頁鏈接


https://temai.taobao.com/ 

獲取數據

方法一(失敗):
起初我采用獲取網頁標簽的方式去獲取數據,發現數據是異步加載,無法直接從網頁標簽獲取,所以這條路行不通!
方法二(成功):
既然是異步加載數據,因此我們需要通過抓包的方式去查看異步數據包!

數據包鏈接


https://h5api.m.taobao.com/h5/mtop.alimama.union.xt.en.api.entry/1.0/?jsv=2.5.1&appKey=12574478&t=1612339221271&sign=8e979106ca943a3865fca277d548b607&api=mtop.alimama.union.xt.en.api.entry&v=1.0&AntiCreep=true&type=jsonp&dataType=jsonp&callback=mtopjsonp1&data=%7B%22pNum%22%3A0%2C%22pSize%22%3A%2288%22%2C%22floorId%22%3A%2223919%22%2C%22spm%22%3A%22a2e1u.13363363.35064267%22%2C%22app_pvid%22%3A%22201_11.186.139.24_4385651_1612339221783%22%2C%22ctm%22%3A%22spm-url%3A%3Bpage_url%3Ahttps%253A%252F%252Ftemai.taobao.com%252F%22%7D 

 

 

從上圖可以看出,數據包中的數據與目標內容一致,因此通過python編程訪問這個數據包即可獲取數據!

編程爬取數據

問題1:權限問題

 

如果直接放到瀏覽器訪問,會發現無法返回json數據,根據多年的經驗來看,這個url鏈接的訪問有權限問題!(同理在程序代碼里面直接request時比出錯)

解決方法

在請求附上請求頭headers,即可解決這個問題!


headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36', 'cookie':'cna=QsEFGOdo0BICARsnWHe+63/1; hng=CN%7Czh-CN%7CCNY%7C156; thw=cn; t=effdb32648fc8553a0d1a87926b80343; ctoken=M9E3xvdCNyLPC-Zyg-ZtE-nV; lego2_cna=TE08X4XP4MY5HRU8CUWMXPWD; __wpkreporterwid_=6809b44b-13ba-4faf-b370-b3788df99e39; mt=ci%3D-1_0; _m_h5_tk=843522e3dd448b136527b03c459d75b4_1612344437570; _m_h5_tk_enc=b21044b7bd07665cd105ce83fc4b4339; xlly_s=1; isg=BF1daNoy4eZf_bpk6aW7OIxsbDlXepHMvS62OB8imbTj1n0I58qhnCtEAMpQDamE; tfstk=cfNPBXYKM_CP5qGCBbGeVJ9975URwvV31T3KEJHXW-6LU4fDOH3mpNr8YcCmE; l=eBIj49hqOGMgJjg9BOfanurza77OSIRYYuPzaNbMiOCPOyfB5Hu1W6MaTD86C3GVh6XDR3yMI8QMBeYBqQAonxvOaGUhCOMmn', 'referer':'https://temai.taobao.com/', } 

這里cookie的來源於數據包

 

問題2:中文亂碼

解決方法


###亂碼問題 s = s.decode('utf8') 

添加一行這個代碼即可解決!

請求數據


###請求url url="https://h5api.m.taobao.com/h5/mtop.alimama.union.xt.en.api.entry/1.0/?jsv=2.5.1&appKey=12574478&t=1612344646955&sign=9650d7c2752bc40a2bde0b90b44d58d4&api=mtop.alimama.union.xt.en.api.entry&v=1.0&AntiCreep=true&type=jsonp&dataType=jsonp&callback=mtopjsonp2&data=%7B%22pNum%22%3A0%2C%22pSize%22%3A%2288%22%2C%22floorId%22%3A%2223919%22%2C%22spm%22%3A%22a2e1u.13363363.35064267%22%2C%22app_pvid%22%3A%22201_11.186.139.24_4399690_1612344646453%22%2C%22ctm%22%3A%22spm-url%3A%3Bpage_url%3Ahttps%253A%252F%252Ftemai.taobao.com%252F%22%7D" ###requests+請求頭headers r = requests.get(url, headers=headers) r.encoding = 'utf8' s = (r.content) ###亂碼問題 s = s.decode('utf8') s= s.replace("mtopjsonp1(","").replace(")","") 

提取內容


###轉為json格式 s = json.loads(s) resultList = s['data']['recommend']['resultList'] for i in resultList: ###商品名稱 itemName = i['itemName'] print("商品名稱="+str(itemName)) ###月銷量 monthSellCount = i['monthSellCount'] print("月銷量"+str(monthSellCount)) ###價格 priceAfterCoupon = i['priceAfterCoupon'] print("價格"+str(priceAfterCoupon)) ###原價 promotionPrice = i['promotionPrice'] print("原價="+str(promotionPrice)) ###店鋪名稱 shopTitle = i['shopTitle'] print("店鋪名稱="+str(shopTitle)) ###優惠劵總數 couponTotalCount = i['couponTotalCount'] print("優惠劵總數="+str(couponTotalCount)) ###優惠劵領取數 couponSendCount = i['couponSendCount'] print("優惠劵領取數="+str(couponSendCount)) print("-------------------------") 

 

我們提取好了所需字段(商品名稱、月銷量、價格、原價、店鋪名稱、優惠劵總數、優惠劵領取數)。

接下來進行可視化分析!

3.可視化分析

分析一:月銷量排行


###分析1:銷量分析 def analysis1(indexlist): #商品名稱 itemNames = [] #銷量 datas = [] for j in indexlist: ###商品名稱 itemName = resultList[new_countdict[j][0]]['itemName'] print("商品名稱=" + str(itemName)[0:10].replace(" ","")) itemNames.append(str(itemName)[0:10].replace(" ","")) ###月銷量 monthSellCount = resultList[new_countdict[j][0]]['monthSellCount'] print("月銷量" + str(monthSellCount)) datas.append(int(monthSellCount)) itemNames.reverse() datas.reverse() # 繪圖。 fig, ax = plt.subplots() b = ax.barh(range(len(itemNames)), datas, color='#6699CC') # 為橫向水平的柱圖右側添加數據標簽。 for rect in b: w = rect.get_width() ax.text(w, rect.get_y() + rect.get_height() / 2, '%d' % int(w), ha='left', va='center') # 設置Y軸縱坐標上的刻度線標簽。 ax.set_yticks(range(len(itemNames))) ax.set_yticklabels(itemNames) plt.title('淘寶商品熱賣月銷量', loc='center', fontsize='20', fontweight='bold', color='red') plt.show() 

分析

1、淘寶熱賣銷量第一名:李子柒螺螄粉柳州螺獅,月銷量達到了85萬。
2、從熱賣銷量的前10名來看,螺螄粉比較受歡迎,甚至霸占了前幾名。
3、從熱賣銷量的前10名來看,用戶在網購方面偏向於購買食物。

分析二:優惠券領取量分析


###分析2:優惠券領取量分析 def analysis2(indexlist): # 商品名稱 itemNames = [] # 優惠券總量 datas1 = [] # 優惠券領取量 datas2 = [] for i in range(0,len(indexlist)): j = indexlist[i] ###商品名稱 itemName = resultList[new_countdict[j][0]]['itemName'] print("商品名稱=" + str(itemName)[0:10].replace(" ", "")) itemNames.append(str(i+1)+str(itemName)[1:4].replace(" ", "")) ###優惠劵總數 couponTotalCount = resultList[new_countdict[j][0]]['couponTotalCount'] print("優惠劵總數=" + str(couponTotalCount)) datas1.append(int(couponTotalCount)) ###優惠劵領取數 couponSendCount = resultList[new_countdict[j][0]]['couponSendCount'] print("優惠劵領取數=" + str(couponSendCount)) datas2.append(int(couponSendCount)) N = len(datas1) S = datas1 C = datas2 d = [] for i in range(0, len(S)): sum = S[i] + C[i] d.append(sum) ind = np.arange(N) # the x locations for the groups width = 0.35 # the width of the bars: can also be len(x) sequence p1 = plt.bar(ind, S, width, color='#d62728') # , yerr=menStd) p2 = plt.bar(ind, C, width, bottom=S) # , yerr=womenStd) plt.ylabel('數量') plt.title('優惠券領取分析') itemNames plt.xticks(ind, itemNames) plt.legend((p1[0], p2[0]), ('優惠券總量', '優惠券領取數')) plt.show() 

分析

由於商品名稱名字太長,所以就截取前幾位!同時從1-10是按銷量從大到小順序!
1.從圖表上可以看出,銷量第一:李子柒螺螄粉柳州螺獅的優惠券總量遙遙領先!
2.在上面的分析可知,李子柒螺螄粉柳州螺獅的銷量最大,所以優惠券領取量也隨之猛增!
3.值得關注的是第九名:紐西之謎隔離霜妝前乳女打底水潤提亮膚色隱形毛孔出水官方正品的優惠券領取量竟然為0,看來是真土豪,都不使用優惠券

分析三:商品優惠金額分析


###分析3:優惠券金額分析 def analysis3(indexlist): # 商品名稱 itemNames = [] # 優惠券金額 datas = [] for i in range(0,len(indexlist)): j = indexlist[i] ###商品名稱 itemName = resultList[new_countdict[j][0]]['itemName'] print("商品名稱=" + str(itemName).replace(" ", "")) itemNames.append(str(i+1)+str(itemName)[0:6].replace(" ", "")) ###優惠劵金額 couponAmount = resultList[new_countdict[j][0]]['couponAmount'] print("優惠劵金額=" + str(couponAmount)) datas.append(int(couponAmount)) x = range(len(itemNames)) plt.plot(x, datas, marker='o', mec='r', mfc='w', label=u'優惠金額') plt.legend() # 讓圖例生效 plt.xticks(x, itemNames, rotation=45) plt.margins(0) plt.subplots_adjust(bottom=0.15) plt.xlabel(u"商品名稱") # X軸標簽 plt.ylabel("金額") # Y軸標簽 plt.title("優惠券金額分析") # 標題 plt.show() 

分析

1.從圖表可以看出銷量第9名商品的優惠金額最大(30元)
2.第7名的優惠金額竟然為0!!!!,那可以推斷出這個商品沒有優惠!
3.第1、4、6、8、10,這幾個商品的優惠金額<=5元!

分析四:商品原價與限價對比分析


###分析4:商品原價和限價對比分析 def analysis4(indexlist): # 商品名稱 itemNames = [] # 原價 datas1 = [] # 限價 datas2 = [] for i in range(0,len(indexlist)): j = indexlist[i] ###商品名稱 itemName = resultList[new_countdict[j][0]]['itemName'] print("商品名稱=" + str(itemName).replace(" ", "")) itemNames.append(str(i+1)+str(itemName)[1:4].replace(" ", "")) ###原價 promotionPrice = resultList[new_countdict[j][0]]['promotionPrice'] print("原價=" + str(promotionPrice)) datas1.append(float(promotionPrice)) ###限價 priceAfterCoupon = resultList[new_countdict[j][0]]['priceAfterCoupon'] print("價格=" + str(priceAfterCoupon)) datas2.append(float(priceAfterCoupon)) font_size = 10 # 字體大小 fig_size = (8, 6) # 圖表大小 names = (u'限價', u'原價') data = (datas2,datas1) # 更新字體大小 mpl.rcParams['font.size'] = font_size # 更新圖表大小 mpl.rcParams['figure.figsize'] = fig_size # 設置柱形圖寬度 bar_width = 0.35 index = np.arange(len(data[0])) # 繪制「小明」的成績 rects1 = plt.bar(index, data[0], bar_width, color='#0072BC', label=names[0]) # 繪制「小紅」的成績 rects2 = plt.bar(index + bar_width, data[1], bar_width, color='#ED1C24', label=names[1]) # X軸標題 plt.xticks(index + bar_width, itemNames) # Y軸范圍 plt.ylim(ymax=100, ymin=0) # 圖表標題 plt.title(u'商品原價和限價對比分析') # 圖例顯示在圖表下方 plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.03), fancybox=True, ncol=5) # 添加數據標簽 def add_labels(rects): for rect in rects: height = rect.get_height() plt.text(rect.get_x() + rect.get_width() / 2, height, height, ha='center', va='bottom') # 柱形圖邊緣用白色填充,純粹為了美觀 rect.set_edgecolor('white') add_labels(rects1) add_labels(rects2) # 圖表輸出到本地 plt.savefig('4.png') 

分析

1.從圖中可以看出在這前10大銷量商品中,價格最高是第9(紐西之謎隔離霜妝前乳),其次是第5(拖把免手洗家用干濕兩用拖布),價格最低的是第6(酸辣無骨雞爪)
2.從原價和限價對比來看,差值最大的是第9(紐西之謎隔離霜妝前乳)!

4.總結

1.詳細介紹了數據的爬取過程,可方便小白學習入門!
2.通過不同的可視化圖表對數據進行展示!
3.對可視化圖表進行精簡總結歸納,便於理解!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM