前言
馬上臨近中秋了,月餅的銷量持續增長,也推出了各個不同口味類別的月餅,價格差異也較大,我們究竟應該買哪種月餅呢?今天就一起用Python爬取某寶月餅資訊,并對爬取的資料進行可視化分析,一起來看看哪種月餅最受歡迎,哪家店鋪月餅銷量最高吧~

直接跳到文末獲取粉絲專屬福利,
一、核心功能設計
總體來說,我們需要先從網站爬蟲獲取月餅資料,并將這些資料進行清洗,最后可視化分析展示,拆解需求,大致可以整理出我們需要分為以下幾步完成:
- 通過爬蟲獲取月餅資料,主要包括月餅名稱、銷量、店鋪、省份城市等,
- 對獲取的資料進行預處理清洗,統一銷量資料單位、省份城市等,獲取清洗后的各個月餅數量,
- 對清洗的資料進行可視化展示,主要包括熱銷月餅口味TOP10、熱銷月餅店鋪Top10、月餅價格區間分布、各省份城市月餅銷量分布情況等,
二、實作步驟
1. 爬取資料
本文我們通過selenium模塊進行月餅資料爬取,為了保證資料爬取順利,首先我們需要安裝selenium模塊,通過pip指令即可安裝,
pip install selenium
如果第一次安裝使用selenium,不少人有可能會出現以下例外,那該怎么解決呢?

出現的主要原因是因為selenium模擬的客戶端對瀏覽器的操作,但相應瀏覽器的驅動版本不匹配導致的,所以我們需要先了解我們當前瀏覽器的版本,可以打開瀏覽器,地址欄輸入chrome://version/查看到谷歌當前的版本號,

這樣我們就可以到谷歌瀏覽器驅動找到對應版本下載驅動就可以了,下載解壓之后,可以看到chromedriver.exe,

我們需要把它拷貝到Python路徑下面,至此我們就可以正常使用selenium模擬客戶端瀏覽器操作了,
接下來我們進行網頁分析,獲取對應的月餅名稱、店鋪名、銷售量、價格、地區,根據對資料分析,可以發現:
- 各個月餅資訊都在item的class=“item J_MouserOnverReq”
- 月餅名稱對應的class=“row row-2 title”
- 價格對應的strong標簽
- 付款人數對應class=“deal-cnt”
- 店鋪資訊在class="shop"中
- 發貨地區對應class=“location”

網頁結構我們上面已經分析好了,那么我們就可以來動手爬取我們所需要的資料了,獲取到所有的資料資源之后,可以把這些資料保存下來,
獲取商品:
# author:Dragon少年
# 獲取商品
def get_product(key_word):
# 定位輸入框
browser.find_element_by_id("q").send_keys(key_word)
# 定義點擊按鈕,并點擊
browser.find_element_by_class_name('btn-search').click()
browser.maximize_window()
# 等待20秒,方便手動登錄
time.sleep(20)
# 定位這個“頁碼”,獲取“共100頁這個文本”
page_info = browser.find_element_by_xpath('//div[@class="total"]').text
# findall()回傳的是一個串列
page = re.findall("(\d+)", page_info)[0]
return page
獲取資料:
# author:Dragon少年
# 獲取資料
def get_data():
# 所有的資訊都在items節點下
items = browser.find_elements_by_xpath('//div[@class="items"]/div[@class="item J_MouserOnverReq "]')
for item in items:
pro_desc = item.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text
# 價格
pro_price = item.find_element_by_xpath('.//strong').text
# 付款人數
buy_num = item.find_element_by_xpath('.//div[@class="deal-cnt"]').text
# 店鋪
shop = item.find_element_by_xpath('.//div[@class="shop"]/a').text
# 發貨地
address = item.find_element_by_xpath('.//div[@class="location"]').text
with open('{}.csv'.format(key_word), mode='a', newline='', encoding='utf-8-sig') as f:
csv_writer = csv.writer(f, delimiter=',')
csv_writer.writerow([pro_desc, pro_price, buy_num, shop, address])
selenium模擬爬取:
# author:Dragon少年
key_word = input("請輸入您要搜索的商品:")
browser = webdriver.Chrome()
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
browser.get('https://www.taobao.com/')
page = get_product(key_word)
print(page)
get_data()
page_num = 1
while int(page) != page_num:
print("=" * 100)
print("正在爬取第{}頁".format(page_num + 1))
browser.get('https://s.taobao.com/search?q={}&s={}'.format(key_word, page_num * 44))
browser.implicitly_wait(15)
get_data()
page_num += 1
print("爬取結束!")
至此我們就可以爬取月餅的資料并保存下來,如下圖所示,

2. 資料清洗
接下來我們需要把爬蟲獲取的資料進行清洗,首先可以去除重復資料,洗掉沒有人購買的記錄,核心代碼如下:
# author:Dragon少年
# 讀取爬蟲資料
df = pd.read_csv("月餅.csv", encoding='utf-8-sig', header=None)
df.columns = ["商品名", "價格", "購買人數", "店鋪", "地址"]
# 去除重復的資料
df.drop_duplicates(inplace=True)
print(df.shape)
# 洗掉購買人數0的記錄
df['購買人數'] = df['購買人數'].replace(np.nan,'0人付款')
對于購買人數,有些是按照萬為單位顯示,我們需要將銷售量進行統一,并將發貨地區進行整理出各個省份資訊,最后將這些清洗的資料保存下來,核心代碼如下:
df['num'] = [re.findall(r'(\d+\.{0,1}\d*)', i)[0] for i in df['購買人數']] # 提取數值
df['num'] = df['num'].astype('float') # 轉化數值型
# 提取單位(萬)
df['unit'] = [''.join(re.findall(r'(萬)', i)) for i in df['購買人數']] # 提取單位(萬)
df['unit'] = df['unit'].apply(lambda x:10000 if x=='萬' else 1)
# 計算銷量
df['銷量'] = df['num'] * df['unit']
# 洗掉沒有發貨地址的店鋪資料 獲取省份
df = df[df['地址'].notna()]
df['省份'] = df['地址'].str.split(' ').apply(lambda x:x[0])
# 洗掉多余的列
df.drop(['購買人數', '地址', 'num', 'unit'], axis=1, inplace=True)
# 重置索引
df = df.reset_index(drop=True)
df.to_csv('月餅清洗資料.csv')
至此我們就可以把爬取的月餅資料整理清洗完畢,如下圖所示,

3. 可視化分析
接下來我們就需要對資料進行可視化顯示, 這里使用的是pyecharts,是一個用于生成Echarts圖表的類別庫,便于在Python中根據資料生成可視化的圖表,
之前博主有寫過一篇關于pyecharts的文章,里面很詳細的介紹了各類圖表的使用方法和案例,不會的可以先去學習下pyecharts相關的內容,【一文學會炫酷圖表利器pyecharts】
銷量Top10店鋪:
下面我們可以讀取清洗結束的資料,通過對店鋪分組獲取各個店鋪的月餅銷量資料,統計出銷量前十的店鋪,通過柱狀圖顯示,核心代碼如下:
# 計算月餅總銷量Top10的店鋪
shop_top10 = df.groupby('店鋪')['銷量'].sum().sort_values(ascending=False).head(10)
# 繪制柱形圖
bar1 = Bar(init_opts=opts.InitOpts(width='600px', height='450px'))
bar1.add_xaxis(shop_top10.index.tolist())
bar1.add_yaxis('銷量', shop_top10.values.tolist())
bar1.set_global_opts(title_opts=opts.TitleOpts(title='銷量Top10店鋪-Dragon少年'),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30)))
bar1.render("銷量Top10店鋪-Dragon少年.html")
bar1.render_notebook()

我們可以看到稻香村食品店、天貓超市、華美食品、臻味食品等銷量居前,其中銷量最好的是稻香村,總銷量遙遙領先,
銷量Top10月餅:
我們還可以通過對月餅名稱進行月餅分組獲取銷量最好的月餅,統計出銷量前十的月餅,通過柱狀圖顯示,核心代碼如下:
# 計算銷量top10月餅
shop_top10 = df.groupby('商品名')['銷量'].sum().sort_values(ascending=False).head(10)
# 繪制柱形圖
bar0 = Bar(init_opts=opts.InitOpts(width='750px', height='450px'))
bar0.add_xaxis(shop_top10.index.tolist())
bar0.add_yaxis('銷量', shop_top10.values.tolist())
bar0.set_global_opts(title_opts=opts.TitleOpts(title='銷量Top10月餅-Dragon少年'),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30)))
bar0.render("銷量Top10月餅-Dragon少年.html")
bar0.render_notebook()

我們可以看到最受歡迎的10種月餅,其中的稻香村月餅禮盒裝最受歡迎,銷量達到了50w份,
不同價格月餅銷量占比:
我們接下來還可以根據月餅的價格區間進行劃分,統計50元以下,50-150元,150-500元,500元以上的各個價格區間月餅的銷量分布,并通過餅圖進行可視化顯示,核心代碼如下:
def price_range(x): #按照淘寶推薦劃分價格區間
if x <= 50:
return '50元以下'
elif x <= 150:
return '50-150元'
elif x <= 500:
return '150-500元'
else:
return '500元以上'
df['price_range'] = df['價格'].apply(lambda x: price_range(x))
price_cut_num = df.groupby('price_range')['銷量'].sum()
data_pair = [list(z) for z in zip(price_cut_num.index, price_cut_num.values)]
# 餅圖
pie1 = Pie(init_opts=opts.InitOpts(width='750px', height='350px'))
# 內置富文本
pie1.add(
series_name="銷量",
radius=["35%", "55%"],
data_pair=data_pair,
label_opts=opts.LabelOpts(formatter='{b}—占比{d}%'),
)
pie1.set_global_opts(legend_opts=opts.LegendOpts(pos_left="left", pos_top='30%', orient="vertical"),
title_opts=opts.TitleOpts(title='不同價格月餅銷量占比-Dragon少年'))
pie1.render("不同價格月餅銷量占比-Dragon少年.html")
pie1.render_notebook()

可以看出來,月餅的銷售價格主要分布在≤150元之間,占據了銷量的84%左右,單份月餅價格超過500元的購買的人較少,
各省月餅銷量分布:
最好我們在統計下,月餅的產地銷量分布省份地區,并通過地圖可視化顯示,核心代碼如下:
# 計算銷量
province_num = df.groupby('省份')['銷量'].sum().sort_values(ascending=False)
# 繪制地圖
map1 = Map(init_opts=opts.InitOpts(width='750px', height='350px'))
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='各省月餅銷量分布-Dragon少年'),
visualmap_opts=opts.VisualMapOpts(max_=300000)
)
map1.render("各省月餅銷量分布-Dragon少年.html")
map1.render_notebook()

可以看到月餅的銷售地分布最多的是廣東和浙江省,這兩個省月餅銷量最受歡迎,至此,月餅資料爬蟲及分析可視化就完成啦~ 大家看完分析想好買什么月餅了嗎?
原始碼及資料已上傳,關注文末公眾號回復【月餅原始碼】即可獲取完整原始碼
Python往期精彩:
見過仙女蹦迪嗎?一起用python做個小仙女代碼蹦迪視頻
python自制一款炫酷音樂播放器,想聽啥隨便搜!
斗地主老是輸?一起用Python做個AI出牌器,豆子蹭蹭漲!
桌面太單調?一起用Python做個自定義影片掛件,好玩又有趣!
一起用Python做個車牌自動識別系統,好玩又實用!
桌面太單調?一起用Python做個自定義動態壁紙,竟然還可以放視頻!
一起用Python做個自動化彈鋼琴腳本,我竟然彈出了《天空之城》!
往期精彩原始碼均可通過下方公眾號獲取
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299603.html
標籤:AI
上一篇:2021-09-12
