爬了4332條淘寶數(shù)據(jù),看看1780元的粽子長啥樣?
端午節(jié)到了,甜咸粽子之爭也拉開了帷幕。我用 Python 爬取了淘寶上的粽子數(shù)據(jù)并進(jìn)行分析,看看有什么發(fā)現(xiàn)。
圖片來自 Pexels
1.爬蟲
爬取淘寶數(shù)據(jù),本次采用的方法是:Selenium 控制 Chrome 瀏覽器自動化操作。
其實(shí)我們還可以利用 Ajax 接口來構(gòu)造鏈接,但是非常繁瑣(包含加密秘鑰等),直接使用 Selenium 來模擬瀏覽器會省去很多事情。
之前的文章我們也用過相同的方法,比如:爬電腦、爬電腦、爬完電腦買不起
最常見的問題是 chromedriver 驅(qū)動與谷歌瀏覽器的版本不匹配,很容易就可以解決。
接下來,我們就開始利用 selenium 抓取淘寶商品,并使用 Xpath 解析得到商品名、價(jià)格、付款人數(shù)、店鋪名、發(fā)貨地址信息,最后將數(shù)據(jù)保存在本地。
爬蟲過程如下圖:
selenium 自動化爬取(需要淘寶掃描登錄一次)
- from selenium import webdriver
 - # 搜索商品,獲取商品頁碼
 - def search_product(key_word):
 - # 定位輸入框
 - browser.find_element_by_id("q").send_keys(key_word)
 - # 定義點(diǎn)擊按鈕,并點(diǎn)擊
 - browser.find_element_by_class_name('btn-search').click()
 - # 最大化窗口:為了方便我們掃碼
 - browser.maximize_window()
 - # 等待15秒,給足時(shí)間我們掃碼
 - time.sleep(15)
 - # 定位這個(gè)“頁碼”,獲取“共100頁這個(gè)文本”
 - page_info = browser.find_element_by_xpath('//div[@class="total"]').text
 - # 需要注意的是:findall()返回的是一個(gè)列表,雖然此時(shí)只有一個(gè)元素它也是一個(gè)列表。
 - page = re.findall("(\d+)",page_info)[0]
 - return page
 
詳細(xì)爬蟲代碼下載見文末。
2.數(shù)據(jù)整理
此時(shí)我們爬取得到的數(shù)據(jù):
整理前的數(shù)據(jù)
數(shù)據(jù)還是比較粗糙的,有幾個(gè)問題需要我們?nèi)ヌ幚恚?/p>
- 添加列名
 - 去除重復(fù)數(shù)據(jù)(翻頁爬取過程中會有重復(fù))
 - 購買人數(shù)為空的記錄,替換成 0 人付款
 - 將購買人數(shù)轉(zhuǎn)換為銷量(注意部分單位為萬)
 - 刪除無發(fā)貨地址的商品,并提取其中的省份
 
部分代碼:
- # 刪除無發(fā)貨地址的商品,并提取省份
 - df = df[df['發(fā)貨地址'].notna()]
 - df['省份'] = df['發(fā)貨地址'].str.split(' ').apply(lambda x:x[0])
 - # 刪除多余的列
 - df.drop(['付款人數(shù)', '發(fā)貨地址', 'num', 'unit'], axis=1, inplace=True)
 - # 重置索引
 - df = df.reset_index(drop=True)
 - df.head(10)
 

整理后的數(shù)據(jù)
這樣我們就對數(shù)據(jù)完成了清洗與整理,方便下一步進(jìn)行可視化。
順便做個(gè)排序,看看什么粽子最貴:
- df1 = df.sort_values(by="價(jià)格", axis=0, ascending=False)
 - df1.iloc[:5,:]
 
價(jià)格 TOP5 的粽子
前三名都來自御茶膳房旗艦店,讓我們看看 1780 元的粽子長啥樣吧!
想嘗嘗!
3.數(shù)據(jù)可視化
本文我們打算用 pyecharts 進(jìn)行可視化展示。有同學(xué)可能使用的是老版本(0.5X),Pyecharts 的 1.x 版本與老版本(0.5X)不兼容,如果無法導(dǎo)入可能是這個(gè)問題哈。
可視化所有語句均基于 v1.7.1,通過以下語句可查詢你的 pyecharts 版本:
- import pyecharts
 - print(pyecharts.__version__)
 
扇形圖
最貴的粽子 1780 元看來是吃不起了,那大家都買什么價(jià)位的呢?
先按照淘寶推薦的區(qū)間劃分一下:
- def price_range(x): #按照淘寶推薦劃分價(jià)格區(qū)間
 - if x <= 22:
 - return '22元以下'
 - elif x <= 115:
 - return '22-115元'
 - elif x <= 633:
 - return '115-633元'
 - else:
 - return '633元以上'
 
再使用 pyecharts 來生成不同價(jià)格區(qū)間的粽子銷量占比圖。
不同價(jià)格區(qū)間的粽子銷量占比
看來百元以內(nèi)的粽子(禮盒裝)才是大家的正常承受范圍,不過我還是選擇小區(qū)門口的 5 塊錢 3 個(gè)。
詞云圖
我們用 jieba 對爬取得到的商品名稱分詞,生成詞云。
- from pyecharts.charts import WordCloud
 - from pyecharts.globals import SymbolType
 - # 詞云圖
 - word1 = WordCloud(init_opts=opts.InitOpts(width='1350px', height='750px'))
 - word1.add("", [*zip(key_words.words, key_words.num)],
 - word_size_range=[20, 200],
 - shape=SymbolType.DIAMOND)
 - word1.set_global_opts(title_opts=opts.TitleOpts('粽子商品名稱詞云圖'),
 - toolbox_opts=opts.ToolboxOpts())
 - word1.render("粽子商品名稱詞云圖.html")
 
粽子商品名稱詞云圖
碩大的粽子周圍環(huán)繞著幾個(gè)突出的關(guān)鍵詞:禮盒裝、鮮肉、蛋黃、嘉興、豆沙、端午節(jié)。
除去端午節(jié)相關(guān)的詞匯,我們通過關(guān)鍵詞大小似乎就知道幾種口味的受歡迎情況。
查閱資料對比一下,還真是大體一致。心疼我棗粽。至于嘉興這個(gè)地名,我們后文會繼續(xù)提到。
條形圖
上文我們查到了最貴的粽子,那么銷量最好的粽子/店鋪是什么呢?
粽子商品銷量 Top10
五芳齋共 4 款入圍,其中一款禮盒裝達(dá)到了 100萬+ 的銷量,應(yīng)該比這個(gè)還多(參見微信的 10w+)。真真老老緊隨其后,3 款粽子進(jìn)入 TOP10。
其余的品牌還有稻香村和知味觀,額,第九名是賣粽葉的,看來自己包粽子的需求也是蠻大的嘛。
粽子店鋪銷量 Top10
粽子店鋪銷量 Top10 其實(shí)與商品相似,五芳齋官方旗艦店和真真老老旗艦店占據(jù)首位,遙遙領(lǐng)先。
經(jīng)過查閱,五芳齋,真真老老,都為嘉興的粽子兩大品牌,那難怪嘉興在詞云圖里那么突出。
嘉興屬于浙江省,銷量冠亞軍都在這里,那浙江豈不是占比很大。還真是這樣。
地圖
繼續(xù)使用 pyecharts 來生成各省份粽子銷量分布圖:
- from pyecharts.charts import Map
 - # 計(jì)算銷量
 - province_num = df.groupby('省份')['銷量'].sum().sort_values(ascending=False)
 - # 繪制地圖
 - map1 = Map(init_opts=opts.InitOpts(width='1350px', height='750px'))
 - map1.add("", [list(z) for z in zip(province_num.index.tolist(), province_num.values.tolist())],
 - maptype='china'
 - )
 - map1.set_global_opts(title_opts=opts.TitleOpts(title='各省份粽子銷量分布'),
 - visualmap_opts=opts.VisualMapOpts(max_=300000),
 - toolbox_opts=opts.ToolboxOpts()
 - )
 - map1.render("各省份粽子銷量分布.html")
 
各省份粽子銷量分布
這個(gè)銷量占比差異真的是太大了??梢哉f中國粽子看浙江,浙江粽子看嘉興。(通過計(jì)算發(fā)貨地址為浙江的粽子銷量占比 70.6%,而嘉興占浙江的 87.4%)
紀(jì)錄片《舌尖上的中國》里的嘉興粽
4.小結(jié)
粽子自古以來就代表著紀(jì)念和美好的祝愿,而在這個(gè)并不安穩(wěn)的 2020,端午的粽子更多了一些祈愿國泰民安,順利度過陰霾的意義。
“端午安康”不再是一句客套話,而是我們能送給彼此的最好的愿景。
本文數(shù)據(jù)和爬蟲可視化源碼下載地址:
- https://alltodata.cowtransfer.com/s/d11c8906cd9c4c
 
作者:朱小五
編輯:陶家龍
出處:轉(zhuǎn)載自微信公眾號凹凸數(shù)據(jù)(ID:alltodata)


























 
 
 







 
 
 
 