簡介
雙十一剛過,TB的銷售額又創下了新高,我也爲2000+億做出了貢獻
恰巧買了一袋德運奶粉,味道還不錯。我就在想,接觸爬蟲也有兩個多月了,還沒有爬過TB這種經典的網站,藉着勁頭就爬取了一下TB上奶粉的銷售信息
爬蟲
在淘寶框搜索奶粉,就會彈出各式各樣的奶粉
可以爬取的有用信息:價格、銷售量、商品名稱、店鋪、地址
淘寶是一個典型用json格式存儲信息的網址,通俗講,json格式就是一層套一層的字典,像淘寶這樣一個網頁中有很多商品的網頁,源碼看起來可能會很複雜,但都是有規律可循,需要仔細觀察
通過分析,可以看出所有的商品信息都存儲在開頭爲g_page_config = 結尾爲shopcardOff":true}};的一個字典中,只需要獲取這個字典然後用python中的json庫進行解析即可
response = requests.get(urls,headers = headers)
response.encoding = 'utf-8'
html = response.text
#print(html)
start = html.find('g_page_config = ')+len('g_page_config = ')
end = html.find('"shopcardOff":true}')+len('"shopcardOff":true}')
js = json.loads(html[start:end+1])
# goods = re.search(r'g_page_config = (.*?)}};', response.text)
# print(goods)
# js = json.loads(str(goods))
這裏列舉了兩種獲取方式,一是用find方法,二是用正則匹配,都能成功獲取網頁信息
解析網頁過後,就可以從獲取到的信息中提取有用信息,通過分析可得知有用信息都存儲在很多層嵌套的字典中,所以通過遍歷這個字典提取出信息
for i in js['mods']['itemlist']['data']['auctions']:
#產品名稱
title = i['raw_title']
#產品價格
price = i['view_price']
#地區
location = i['item_loc'].split()[0]
#銷售量
sales = i['view_sales'].replace('人收貨','')
#評價人數
people = i['comment_count']
#店鋪類型
store = i['nick']
爲了便於數據分析,所以在提取信息時,將地區和銷售量做了處理,例浙江 杭州→浙江;500人收貨→500
數據處理
爬取數據結果如下
一共有2924條數據,其實是遠遠少於100頁中商品數量
在進行數據處理前,必須先要確定所有數據的字段是否完整
只有評價人數這個字段缺少一個數據,填充數據或者刪去都不會對數據集整體產生很大影響
在觀察數據時,可能在寫入csv文件時語句不規範,出現了下圖問題
列索引多次出現在數據集中,所以必須要刪去,只需要將數據集中不包含產品名稱字樣的樣本保留即可
data1 = data[~data['產品名稱'].isin(['產品名稱'])]
數據集中6個特徵都爲object類型,所以爲了進行數據可視化,需要對數據進行強制轉換
價格和評價人數數據比較規範,直接用astype進行轉化即可
data1['價格'] = data1['價格'].astype(float)
data1['評價人數'] = data1['評價人數'].astype(int)
但是銷售量這一樣本中還有其他字符存在,可以編寫一個函數處理數據
def price(e):
if '萬+' in e:
num1 = re.findall('(.*?)萬+',e)
return float(num1[0])*10000
elif '+' in e:
return e.replace('+','')
else:
return float(e)
data1['商品銷售量'] = data1['銷售量'].apply(price)
同時可以通過數據字符串中特有的字符,將奶粉和店鋪進行分類
奶粉大致可分爲:全脂奶粉、低脂奶粉、脫脂奶粉、嬰幼兒奶粉、高鈣奶粉、未知
店鋪大致可分爲:天貓超市、旗艦店、專營店、海外類型店鋪、其他店鋪
已知商品價格和銷售量後,也可以算出該商品的銷售額
data1['銷售額'] = data1['價格']*data1['商品銷售量']
處理後的數據如下
在對處理後數據大致瀏覽時,出現了評價人數爲0的情況
評價人數爲0並不能判斷這個數據是否對錯,但是銷售量8500的商品評價爲0,就顯着不符合常理,爲了確定判斷,找到了該商品,評價人數有33w+,顯然這些是錯誤數據
list = data1[data1['評價人數']<1].index.tolist()
data1.drop([24, 138, 388, 1418, 2484],inplace = True)
用drop函數直接將這幾行數據刪去,下面進行數據可視化
數據可視化
1.類型
奶粉的類型,相對來說還是嬰兒奶粉比較多,由於對產品名稱提取特徵不夠細化,所以未知也比較多,達到了800+;店鋪類型則是其他店鋪佔比最多,普通奶粉可依據價格挑選,但是嬰兒奶粉一定要依據質量挑選才可,儘可能在旗艦店這樣比較可靠的店鋪購買
2.店鋪地址分佈
店鋪地址仍然是江浙滬、廣東佔據大比例,可能不止奶粉,許多其他商品的網店、配貨倉庫都集中分佈在這些地區;衆所周知,澳大利亞的奶粉是及其出名的,所以也佔一定比例
3.價格
嬰兒奶粉的價格品牌是非常多的,所以價格分佈也較廣泛,有的甚至達到了2000+,看來養孩子真的是不容易;相比脫脂、低脂奶粉,全脂奶粉反而價格更高,有點出乎意料,多了工序價格卻還低了?當然品牌造成的影響也不可否認;高鈣奶粉價格相對來說中規中矩,貴一點的也不過500左右
4.銷售額前50分佈
這份數據中奶粉銷售額最高的可以達到1100w+,所以在網店中,奶粉的市場還是不小的
銷售額TOP50份樣本,43.3%的店鋪都爲天貓超市,旗艦店也佔有22.8%,所以可見大部分人買奶粉還是會到比較可靠的網店購買的;奶粉類型還是未知佔據最多,其次嬰幼兒奶粉佔比28.8%,而低脂奶粉和脫脂奶粉總佔比6.7%,這兩類奶粉會對健身人士、老年人及消化不良的嬰兒的人有些益處,所以銷售額也會相對較低