99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀Python 爬取淘寶商品數(shù)據(jù)挖掘分析實戰(zhàn)
Python 爬取淘寶商品數(shù)據(jù)挖掘分析實戰(zhàn)
2018-03-03
收藏

Python 爬取淘寶商品數(shù)據(jù)挖掘分析實戰(zhàn)

項目內(nèi)容

本案例選擇>> 商品類目:沙發(fā);

數(shù)量:共100頁  4400個商品;

篩選條件:天貓、銷量從高到低、價格500元以上。


項目目的

1. 對商品標(biāo)題進行文本分析 詞云可視化

2. 不同關(guān)鍵詞word對應(yīng)的sales的統(tǒng)計分析

3. 商品的價格分布情況分析

4. 商品的銷量分布情況分析

5. 不同價格區(qū)間的商品的平均銷量分布

6. 商品價格對銷量的影響分析

7. 商品價格對銷售額的影響分析

8. 不同省份或城市的商品數(shù)量分布

9.不同省份的商品平均銷量分布

注:本項目僅以以上幾項分析為例。

項目步驟

1. 數(shù)據(jù)采集:Python爬取淘寶網(wǎng)商品數(shù)據(jù)

2. 對數(shù)據(jù)進行清洗和處理

3. 文本分析:jieba分詞、wordcloud可視化

4. 數(shù)據(jù)柱形圖可視化 barh

5. 數(shù)據(jù)直方圖可視化 hist

6. 數(shù)據(jù)散點圖可視化 scatter

7. 數(shù)據(jù)回歸分析可視化 regplot

工具&模塊:

工具:本案例代碼編輯工具 Anaconda的Spyder

模塊:requests、retrying、missingno、jieba、matplotlib、wordcloud、imread、seaborn 等。

原代碼和相關(guān)文檔后臺回復(fù)“淘寶”下載

一、爬取數(shù)據(jù)

因淘寶網(wǎng)是反爬蟲的,雖然使用多線程、修改headers參數(shù),但仍然不能保證每次100%爬取,所以 我增加了循環(huán)爬取,每次循環(huán)爬取未爬取成功的頁 直至所有頁爬取成功停止。

說明:淘寶商品頁為JSON格式 這里使用正則表達(dá)式進行解析;

代碼如下:


二、數(shù)據(jù)清洗、處理:

(此步驟也可以在Excel中完成 再讀入數(shù)據(jù))

代碼如下:

說明:根據(jù)需求,本案例中只取了 item_loc, raw_title, view_price, view_sales 這4列數(shù)據(jù),主要對 標(biāo)題、區(qū)域、價格、銷量 進行分析。

代碼如下:

三、數(shù)據(jù)挖掘與分析:

【1】. 對 raw_title 列標(biāo)題進行文本分析:

使用結(jié)巴分詞器,安裝模塊pip install jieba

對 title_s(list of list 格式)中的每個list的元素(str)進行過濾 剔除不需要的詞語,即 把停用詞表stopwords中有的詞語都剔除掉:

因為下面要統(tǒng)計每個詞語的個數(shù),所以 為了準(zhǔn)確性 這里對過濾后的數(shù)據(jù) title_clean 中的每個list的元素進行去重,即 每個標(biāo)題被分割后的詞語唯一。

觀察 word_count 表中的詞語,發(fā)現(xiàn)jieba默認(rèn)的詞典 無法滿足需求:

有的詞語(如 可拆洗、不可拆洗等)卻被cut,這里根據(jù)需求對詞典加入新詞(也可以直接在詞典dict.txt里面增刪,然后載入修改過的dict.txt)

詞云可視化:

安裝模塊 wordcloud:

方法1: pip install wordcloud

方法2: 下載Packages安裝:pip install 軟件包名稱

軟件包下載地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud

注意:要把下載的軟件包放在Python安裝路徑下。

代碼如下:


分析結(jié)論:

1. 組合、整裝商品占比很高;

2. 從沙發(fā)材質(zhì)看:布藝沙發(fā)占比很高,比皮藝沙發(fā)多;

3. 從沙發(fā)風(fēng)格看:簡約風(fēng)格最多,北歐風(fēng)次之,其他風(fēng)格排名依次是美式、中式、日式、法式 等;

4. 從戶型看:小戶型占比最高、大小戶型次之,大戶型最少。

【2】. 不同關(guān)鍵詞word對應(yīng)的sales之和的統(tǒng)計分析

(說明:例如 詞語 ‘簡約’,則統(tǒng)計商品標(biāo)題中含有‘簡約’一詞的商品的銷量之和,即求出具有‘簡約’風(fēng)格的商品銷量之和)

代碼如下:

對表df_word_sum 中的 word 和 w_s_sum 兩列數(shù)據(jù)進行可視化

(本例中取銷量排名前30的詞語進行繪圖)

由圖表可知:

1. 組合商品銷量最高 ;

2. 從品類看:布藝沙發(fā)銷量很高,遠(yuǎn)超過皮藝沙發(fā);

3. 從戶型看:小戶型沙發(fā)銷量最高,大小戶型次之,大戶型銷量最少;

4. 從風(fēng)格看:簡約風(fēng)銷量最高,北歐風(fēng)次之,其他依次是中式、美式、日式等;

5. 可拆洗、轉(zhuǎn)角類沙發(fā)銷量可觀,也是頗受消費者青睞的。

【3】. 商品的價格分布情況分析:

分析發(fā)現(xiàn),有一些值太大,為了使可視化效果更加直觀,這里我們結(jié)合自身產(chǎn)品情況,選擇價格小于20000的商品。

代碼如下:


由圖表可知:

1. 商品數(shù)量隨著價格總體呈現(xiàn)下降階梯形勢,價格越高,在售的商品越少;

2. 低價位商品居多,價格在500-1500之間的商品最多,1500-3000之間的次之,價格1萬以上的商品較少;

3. 價格1萬元以上的商品,在售商品數(shù)量差異不大。

【4】. 商品的銷量分布情況分析:  

同樣,為了使可視化效果更加直觀,這里我們選擇銷量大于100的商品。

代碼如下:


由圖表及數(shù)據(jù)可知:

1. 銷量100以上的商品僅占3.4% ,其中銷量100-200之間的商品最多,200-300之間的次之;

2. 銷量100-500之間,商品的數(shù)量隨著銷量呈現(xiàn)下降趨勢,且趨勢陡峭,低銷量商品居多;

3. 銷量500以上的商品很少。

【5】. 不同價格區(qū)間的商品的平均銷量分布:

代碼如下:


由圖表可知:

1. 價格在1331-1680之間的商品平均銷量最高,951-1331之間的次之,9684元以上的最低;

2. 總體呈現(xiàn)先增后減的趨勢,但最高峰處于相對低價位階段;

3. 說明廣大消費者對購買沙發(fā)的需求更多處于低價位階段,在1680元以上 價位越高 平均銷量基本是越少。

【6】. 商品價格對銷量的影響分析:

同上,為了使可視化效果更加直觀,這里我們結(jié)合自身產(chǎn)品情況,選擇價格小于20000的商品。

代碼如下:


由圖表可知:

1. 總體趨勢:隨著商品價格增多 其銷量減少,商品價格對其銷量影響很大;

2. 價格500-2500之間的少數(shù)商品銷量沖的很高,價格2500-5000之間的商品多數(shù)銷量偏低,少數(shù)相對較高,但價格5000以上的商品銷量均很低 沒有銷量突出的商品。

【7】. 商品價格對銷售額的影響分析:

代碼如下:


由圖表可知:

1. 總體趨勢:由線性回歸擬合線可以看出,商品銷售額隨著價格增長呈現(xiàn)上升趨勢;

2. 多數(shù)商品的價格偏低,銷售額也偏低;

3. 價格在0-20000的商品只有少數(shù)銷售額較高,價格2萬-6萬的商品只有3個銷售額較高,價格6-10萬的商品有1個銷售額很高,而且是最大值。

【8】. 不同省份的商品數(shù)量分布:

代碼如下:


由圖表可知:

1. 廣東的最多,上海次之,江蘇第三,尤其是廣東的數(shù)量遠(yuǎn)超過江蘇、浙江、上海等地,說明在沙發(fā)這個子類目,廣東的店鋪占主導(dǎo)地位;

2. 江浙滬等地的數(shù)量差異不大,基本相當(dāng)。

【9】. 不同省份的商品平均銷量分布:

代碼如下:





熱力型地圖

作者后記

孫方輝   從事數(shù)據(jù)分析工作,熱愛數(shù)據(jù)統(tǒng)計與挖掘分析,本文獻給學(xué)習(xí)Python的朋友們,歡迎大佬們的指點!


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }